From c9955077e96f6ad81370da78456a399c1d5d2030 Mon Sep 17 00:00:00 2001 From: David Rugendyke Date: Tue, 7 Jul 2020 12:16:01 +1000 Subject: [PATCH 001/878] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..8a595cc3c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# rocketpool-go +A Golang library for interacting with the Rocket Pool network. From 939e864484b9a7a5203fa1ab630f645508d08623 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 7 Jul 2020 16:13:57 +1000 Subject: [PATCH 002/878] added RS contract --- contracts/rocket-storage.go | 649 ++++++++++++++++++++++++++++++++++++ 1 file changed, 649 insertions(+) create mode 100644 contracts/rocket-storage.go diff --git a/contracts/rocket-storage.go b/contracts/rocket-storage.go new file mode 100644 index 000000000..b75f9ea29 --- /dev/null +++ b/contracts/rocket-storage.go @@ -0,0 +1,649 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// RocketStorageABI is the input ABI used to generate the binding from. +const RocketStorageABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getInt\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_value\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_value\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"int256\",\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"setInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" + +// RocketStorage is an auto generated Go binding around an Ethereum contract. +type RocketStorage struct { + RocketStorageCaller // Read-only binding to the contract + RocketStorageTransactor // Write-only binding to the contract + RocketStorageFilterer // Log filterer for contract events +} + +// RocketStorageCaller is an auto generated read-only Go binding around an Ethereum contract. +type RocketStorageCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RocketStorageTransactor is an auto generated write-only Go binding around an Ethereum contract. +type RocketStorageTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RocketStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type RocketStorageFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RocketStorageSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type RocketStorageSession struct { + Contract *RocketStorage // 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 +} + +// RocketStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type RocketStorageCallerSession struct { + Contract *RocketStorageCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// RocketStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type RocketStorageTransactorSession struct { + Contract *RocketStorageTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RocketStorageRaw is an auto generated low-level Go binding around an Ethereum contract. +type RocketStorageRaw struct { + Contract *RocketStorage // Generic contract binding to access the raw methods on +} + +// RocketStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type RocketStorageCallerRaw struct { + Contract *RocketStorageCaller // Generic read-only contract binding to access the raw methods on +} + +// RocketStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type RocketStorageTransactorRaw struct { + Contract *RocketStorageTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewRocketStorage creates a new instance of RocketStorage, bound to a specific deployed contract. +func NewRocketStorage(address common.Address, backend bind.ContractBackend) (*RocketStorage, error) { + contract, err := bindRocketStorage(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RocketStorage{RocketStorageCaller: RocketStorageCaller{contract: contract}, RocketStorageTransactor: RocketStorageTransactor{contract: contract}, RocketStorageFilterer: RocketStorageFilterer{contract: contract}}, nil +} + +// NewRocketStorageCaller creates a new read-only instance of RocketStorage, bound to a specific deployed contract. +func NewRocketStorageCaller(address common.Address, caller bind.ContractCaller) (*RocketStorageCaller, error) { + contract, err := bindRocketStorage(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RocketStorageCaller{contract: contract}, nil +} + +// NewRocketStorageTransactor creates a new write-only instance of RocketStorage, bound to a specific deployed contract. +func NewRocketStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*RocketStorageTransactor, error) { + contract, err := bindRocketStorage(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RocketStorageTransactor{contract: contract}, nil +} + +// NewRocketStorageFilterer creates a new log filterer instance of RocketStorage, bound to a specific deployed contract. +func NewRocketStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*RocketStorageFilterer, error) { + contract, err := bindRocketStorage(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RocketStorageFilterer{contract: contract}, nil +} + +// bindRocketStorage binds a generic wrapper to an already deployed contract. +func bindRocketStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(RocketStorageABI)) + 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 (_RocketStorage *RocketStorageRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _RocketStorage.Contract.RocketStorageCaller.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 (_RocketStorage *RocketStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RocketStorage.Contract.RocketStorageTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RocketStorage *RocketStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RocketStorage.Contract.RocketStorageTransactor.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 (_RocketStorage *RocketStorageCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _RocketStorage.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 (_RocketStorage *RocketStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RocketStorage.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RocketStorage *RocketStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RocketStorage.Contract.contract.Transact(opts, method, params...) +} + +// GetAddress is a free data retrieval call binding the contract method 0x21f8a721. +// +// Solidity: function getAddress(bytes32 _key) constant returns(address) +func (_RocketStorage *RocketStorageCaller) GetAddress(opts *bind.CallOpts, _key [32]byte) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getAddress", _key) + return *ret0, err +} + +// GetAddress is a free data retrieval call binding the contract method 0x21f8a721. +// +// Solidity: function getAddress(bytes32 _key) constant returns(address) +func (_RocketStorage *RocketStorageSession) GetAddress(_key [32]byte) (common.Address, error) { + return _RocketStorage.Contract.GetAddress(&_RocketStorage.CallOpts, _key) +} + +// GetAddress is a free data retrieval call binding the contract method 0x21f8a721. +// +// Solidity: function getAddress(bytes32 _key) constant returns(address) +func (_RocketStorage *RocketStorageCallerSession) GetAddress(_key [32]byte) (common.Address, error) { + return _RocketStorage.Contract.GetAddress(&_RocketStorage.CallOpts, _key) +} + +// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. +// +// Solidity: function getBool(bytes32 _key) constant returns(bool) +func (_RocketStorage *RocketStorageCaller) GetBool(opts *bind.CallOpts, _key [32]byte) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getBool", _key) + return *ret0, err +} + +// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. +// +// Solidity: function getBool(bytes32 _key) constant returns(bool) +func (_RocketStorage *RocketStorageSession) GetBool(_key [32]byte) (bool, error) { + return _RocketStorage.Contract.GetBool(&_RocketStorage.CallOpts, _key) +} + +// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. +// +// Solidity: function getBool(bytes32 _key) constant returns(bool) +func (_RocketStorage *RocketStorageCallerSession) GetBool(_key [32]byte) (bool, error) { + return _RocketStorage.Contract.GetBool(&_RocketStorage.CallOpts, _key) +} + +// GetBytes is a free data retrieval call binding the contract method 0xc031a180. +// +// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +func (_RocketStorage *RocketStorageCaller) GetBytes(opts *bind.CallOpts, _key [32]byte) ([]byte, error) { + var ( + ret0 = new([]byte) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getBytes", _key) + return *ret0, err +} + +// GetBytes is a free data retrieval call binding the contract method 0xc031a180. +// +// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +func (_RocketStorage *RocketStorageSession) GetBytes(_key [32]byte) ([]byte, error) { + return _RocketStorage.Contract.GetBytes(&_RocketStorage.CallOpts, _key) +} + +// GetBytes is a free data retrieval call binding the contract method 0xc031a180. +// +// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +func (_RocketStorage *RocketStorageCallerSession) GetBytes(_key [32]byte) ([]byte, error) { + return _RocketStorage.Contract.GetBytes(&_RocketStorage.CallOpts, _key) +} + +// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. +// +// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +func (_RocketStorage *RocketStorageCaller) GetBytes32(opts *bind.CallOpts, _key [32]byte) ([32]byte, error) { + var ( + ret0 = new([32]byte) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getBytes32", _key) + return *ret0, err +} + +// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. +// +// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +func (_RocketStorage *RocketStorageSession) GetBytes32(_key [32]byte) ([32]byte, error) { + return _RocketStorage.Contract.GetBytes32(&_RocketStorage.CallOpts, _key) +} + +// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. +// +// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +func (_RocketStorage *RocketStorageCallerSession) GetBytes32(_key [32]byte) ([32]byte, error) { + return _RocketStorage.Contract.GetBytes32(&_RocketStorage.CallOpts, _key) +} + +// GetInt is a free data retrieval call binding the contract method 0xdc97d962. +// +// Solidity: function getInt(bytes32 _key) constant returns(int256) +func (_RocketStorage *RocketStorageCaller) GetInt(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getInt", _key) + return *ret0, err +} + +// GetInt is a free data retrieval call binding the contract method 0xdc97d962. +// +// Solidity: function getInt(bytes32 _key) constant returns(int256) +func (_RocketStorage *RocketStorageSession) GetInt(_key [32]byte) (*big.Int, error) { + return _RocketStorage.Contract.GetInt(&_RocketStorage.CallOpts, _key) +} + +// GetInt is a free data retrieval call binding the contract method 0xdc97d962. +// +// Solidity: function getInt(bytes32 _key) constant returns(int256) +func (_RocketStorage *RocketStorageCallerSession) GetInt(_key [32]byte) (*big.Int, error) { + return _RocketStorage.Contract.GetInt(&_RocketStorage.CallOpts, _key) +} + +// GetString is a free data retrieval call binding the contract method 0x986e791a. +// +// Solidity: function getString(bytes32 _key) constant returns(string) +func (_RocketStorage *RocketStorageCaller) GetString(opts *bind.CallOpts, _key [32]byte) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getString", _key) + return *ret0, err +} + +// GetString is a free data retrieval call binding the contract method 0x986e791a. +// +// Solidity: function getString(bytes32 _key) constant returns(string) +func (_RocketStorage *RocketStorageSession) GetString(_key [32]byte) (string, error) { + return _RocketStorage.Contract.GetString(&_RocketStorage.CallOpts, _key) +} + +// GetString is a free data retrieval call binding the contract method 0x986e791a. +// +// Solidity: function getString(bytes32 _key) constant returns(string) +func (_RocketStorage *RocketStorageCallerSession) GetString(_key [32]byte) (string, error) { + return _RocketStorage.Contract.GetString(&_RocketStorage.CallOpts, _key) +} + +// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. +// +// Solidity: function getUint(bytes32 _key) constant returns(uint256) +func (_RocketStorage *RocketStorageCaller) GetUint(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _RocketStorage.contract.Call(opts, out, "getUint", _key) + return *ret0, err +} + +// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. +// +// Solidity: function getUint(bytes32 _key) constant returns(uint256) +func (_RocketStorage *RocketStorageSession) GetUint(_key [32]byte) (*big.Int, error) { + return _RocketStorage.Contract.GetUint(&_RocketStorage.CallOpts, _key) +} + +// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. +// +// Solidity: function getUint(bytes32 _key) constant returns(uint256) +func (_RocketStorage *RocketStorageCallerSession) GetUint(_key [32]byte) (*big.Int, error) { + return _RocketStorage.Contract.GetUint(&_RocketStorage.CallOpts, _key) +} + +// DeleteAddress is a paid mutator transaction binding the contract method 0x0e14a376. +// +// Solidity: function deleteAddress(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteAddress(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteAddress", _key) +} + +// DeleteAddress is a paid mutator transaction binding the contract method 0x0e14a376. +// +// Solidity: function deleteAddress(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteAddress(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteAddress(&_RocketStorage.TransactOpts, _key) +} + +// DeleteAddress is a paid mutator transaction binding the contract method 0x0e14a376. +// +// Solidity: function deleteAddress(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteAddress(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteAddress(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBool is a paid mutator transaction binding the contract method 0x2c62ff2d. +// +// Solidity: function deleteBool(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteBool(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteBool", _key) +} + +// DeleteBool is a paid mutator transaction binding the contract method 0x2c62ff2d. +// +// Solidity: function deleteBool(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteBool(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBool(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBool is a paid mutator transaction binding the contract method 0x2c62ff2d. +// +// Solidity: function deleteBool(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteBool(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBool(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBytes is a paid mutator transaction binding the contract method 0x616b59f6. +// +// Solidity: function deleteBytes(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteBytes(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteBytes", _key) +} + +// DeleteBytes is a paid mutator transaction binding the contract method 0x616b59f6. +// +// Solidity: function deleteBytes(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteBytes(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBytes(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBytes is a paid mutator transaction binding the contract method 0x616b59f6. +// +// Solidity: function deleteBytes(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteBytes(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBytes(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBytes32 is a paid mutator transaction binding the contract method 0x0b9adc57. +// +// Solidity: function deleteBytes32(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteBytes32(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteBytes32", _key) +} + +// DeleteBytes32 is a paid mutator transaction binding the contract method 0x0b9adc57. +// +// Solidity: function deleteBytes32(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteBytes32(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBytes32(&_RocketStorage.TransactOpts, _key) +} + +// DeleteBytes32 is a paid mutator transaction binding the contract method 0x0b9adc57. +// +// Solidity: function deleteBytes32(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteBytes32(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteBytes32(&_RocketStorage.TransactOpts, _key) +} + +// DeleteInt is a paid mutator transaction binding the contract method 0x8c160095. +// +// Solidity: function deleteInt(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteInt(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteInt", _key) +} + +// DeleteInt is a paid mutator transaction binding the contract method 0x8c160095. +// +// Solidity: function deleteInt(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteInt(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteInt(&_RocketStorage.TransactOpts, _key) +} + +// DeleteInt is a paid mutator transaction binding the contract method 0x8c160095. +// +// Solidity: function deleteInt(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteInt(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteInt(&_RocketStorage.TransactOpts, _key) +} + +// DeleteString is a paid mutator transaction binding the contract method 0xf6bb3cc4. +// +// Solidity: function deleteString(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteString(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteString", _key) +} + +// DeleteString is a paid mutator transaction binding the contract method 0xf6bb3cc4. +// +// Solidity: function deleteString(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteString(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteString(&_RocketStorage.TransactOpts, _key) +} + +// DeleteString is a paid mutator transaction binding the contract method 0xf6bb3cc4. +// +// Solidity: function deleteString(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteString(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteString(&_RocketStorage.TransactOpts, _key) +} + +// DeleteUint is a paid mutator transaction binding the contract method 0xe2b202bf. +// +// Solidity: function deleteUint(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactor) DeleteUint(opts *bind.TransactOpts, _key [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "deleteUint", _key) +} + +// DeleteUint is a paid mutator transaction binding the contract method 0xe2b202bf. +// +// Solidity: function deleteUint(bytes32 _key) returns() +func (_RocketStorage *RocketStorageSession) DeleteUint(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteUint(&_RocketStorage.TransactOpts, _key) +} + +// DeleteUint is a paid mutator transaction binding the contract method 0xe2b202bf. +// +// Solidity: function deleteUint(bytes32 _key) returns() +func (_RocketStorage *RocketStorageTransactorSession) DeleteUint(_key [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.DeleteUint(&_RocketStorage.TransactOpts, _key) +} + +// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9. +// +// Solidity: function setAddress(bytes32 _key, address _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetAddress(opts *bind.TransactOpts, _key [32]byte, _value common.Address) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setAddress", _key, _value) +} + +// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9. +// +// Solidity: function setAddress(bytes32 _key, address _value) returns() +func (_RocketStorage *RocketStorageSession) SetAddress(_key [32]byte, _value common.Address) (*types.Transaction, error) { + return _RocketStorage.Contract.SetAddress(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9. +// +// Solidity: function setAddress(bytes32 _key, address _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetAddress(_key [32]byte, _value common.Address) (*types.Transaction, error) { + return _RocketStorage.Contract.SetAddress(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBool is a paid mutator transaction binding the contract method 0xabfdcced. +// +// Solidity: function setBool(bytes32 _key, bool _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetBool(opts *bind.TransactOpts, _key [32]byte, _value bool) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setBool", _key, _value) +} + +// SetBool is a paid mutator transaction binding the contract method 0xabfdcced. +// +// Solidity: function setBool(bytes32 _key, bool _value) returns() +func (_RocketStorage *RocketStorageSession) SetBool(_key [32]byte, _value bool) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBool(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBool is a paid mutator transaction binding the contract method 0xabfdcced. +// +// Solidity: function setBool(bytes32 _key, bool _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetBool(_key [32]byte, _value bool) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBool(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBytes is a paid mutator transaction binding the contract method 0x2e28d084. +// +// Solidity: function setBytes(bytes32 _key, bytes _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetBytes(opts *bind.TransactOpts, _key [32]byte, _value []byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setBytes", _key, _value) +} + +// SetBytes is a paid mutator transaction binding the contract method 0x2e28d084. +// +// Solidity: function setBytes(bytes32 _key, bytes _value) returns() +func (_RocketStorage *RocketStorageSession) SetBytes(_key [32]byte, _value []byte) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBytes(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBytes is a paid mutator transaction binding the contract method 0x2e28d084. +// +// Solidity: function setBytes(bytes32 _key, bytes _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetBytes(_key [32]byte, _value []byte) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBytes(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBytes32 is a paid mutator transaction binding the contract method 0x4e91db08. +// +// Solidity: function setBytes32(bytes32 _key, bytes32 _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetBytes32(opts *bind.TransactOpts, _key [32]byte, _value [32]byte) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setBytes32", _key, _value) +} + +// SetBytes32 is a paid mutator transaction binding the contract method 0x4e91db08. +// +// Solidity: function setBytes32(bytes32 _key, bytes32 _value) returns() +func (_RocketStorage *RocketStorageSession) SetBytes32(_key [32]byte, _value [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBytes32(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetBytes32 is a paid mutator transaction binding the contract method 0x4e91db08. +// +// Solidity: function setBytes32(bytes32 _key, bytes32 _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetBytes32(_key [32]byte, _value [32]byte) (*types.Transaction, error) { + return _RocketStorage.Contract.SetBytes32(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetInt is a paid mutator transaction binding the contract method 0x3e49bed0. +// +// Solidity: function setInt(bytes32 _key, int256 _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetInt(opts *bind.TransactOpts, _key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setInt", _key, _value) +} + +// SetInt is a paid mutator transaction binding the contract method 0x3e49bed0. +// +// Solidity: function setInt(bytes32 _key, int256 _value) returns() +func (_RocketStorage *RocketStorageSession) SetInt(_key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.Contract.SetInt(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetInt is a paid mutator transaction binding the contract method 0x3e49bed0. +// +// Solidity: function setInt(bytes32 _key, int256 _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetInt(_key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.Contract.SetInt(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetString is a paid mutator transaction binding the contract method 0x6e899550. +// +// Solidity: function setString(bytes32 _key, string _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetString(opts *bind.TransactOpts, _key [32]byte, _value string) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setString", _key, _value) +} + +// SetString is a paid mutator transaction binding the contract method 0x6e899550. +// +// Solidity: function setString(bytes32 _key, string _value) returns() +func (_RocketStorage *RocketStorageSession) SetString(_key [32]byte, _value string) (*types.Transaction, error) { + return _RocketStorage.Contract.SetString(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetString is a paid mutator transaction binding the contract method 0x6e899550. +// +// Solidity: function setString(bytes32 _key, string _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetString(_key [32]byte, _value string) (*types.Transaction, error) { + return _RocketStorage.Contract.SetString(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a. +// +// Solidity: function setUint(bytes32 _key, uint256 _value) returns() +func (_RocketStorage *RocketStorageTransactor) SetUint(opts *bind.TransactOpts, _key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.contract.Transact(opts, "setUint", _key, _value) +} + +// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a. +// +// Solidity: function setUint(bytes32 _key, uint256 _value) returns() +func (_RocketStorage *RocketStorageSession) SetUint(_key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.Contract.SetUint(&_RocketStorage.TransactOpts, _key, _value) +} + +// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a. +// +// Solidity: function setUint(bytes32 _key, uint256 _value) returns() +func (_RocketStorage *RocketStorageTransactorSession) SetUint(_key [32]byte, _value *big.Int) (*types.Transaction, error) { + return _RocketStorage.Contract.SetUint(&_RocketStorage.TransactOpts, _key, _value) +} From cb091dd55d69dd60f50d11cd8d3a6e355239872a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 7 Jul 2020 16:18:39 +1000 Subject: [PATCH 003/878] initialized go module --- go.mod | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 go.mod diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..02fbfeb72 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/rocket-pool/rocketpool-go + +go 1.13 From 9f6d32f5c0d9406ce8a79ecce697a386152e704a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 10:09:11 +1000 Subject: [PATCH 004/878] RocketStorage binding fix --- contracts/rocket-storage.go | 43 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/contracts/rocket-storage.go b/contracts/rocket-storage.go index b75f9ea29..be63ed794 100644 --- a/contracts/rocket-storage.go +++ b/contracts/rocket-storage.go @@ -20,7 +20,6 @@ var ( _ = big.NewInt _ = strings.NewReader _ = ethereum.NotFound - _ = abi.U256 _ = bind.Bind _ = common.Big1 _ = types.BloomLookup @@ -174,7 +173,7 @@ func (_RocketStorage *RocketStorageTransactorRaw) Transact(opts *bind.TransactOp // GetAddress is a free data retrieval call binding the contract method 0x21f8a721. // -// Solidity: function getAddress(bytes32 _key) constant returns(address) +// Solidity: function getAddress(bytes32 _key) view returns(address) func (_RocketStorage *RocketStorageCaller) GetAddress(opts *bind.CallOpts, _key [32]byte) (common.Address, error) { var ( ret0 = new(common.Address) @@ -186,21 +185,21 @@ func (_RocketStorage *RocketStorageCaller) GetAddress(opts *bind.CallOpts, _key // GetAddress is a free data retrieval call binding the contract method 0x21f8a721. // -// Solidity: function getAddress(bytes32 _key) constant returns(address) +// Solidity: function getAddress(bytes32 _key) view returns(address) func (_RocketStorage *RocketStorageSession) GetAddress(_key [32]byte) (common.Address, error) { return _RocketStorage.Contract.GetAddress(&_RocketStorage.CallOpts, _key) } // GetAddress is a free data retrieval call binding the contract method 0x21f8a721. // -// Solidity: function getAddress(bytes32 _key) constant returns(address) +// Solidity: function getAddress(bytes32 _key) view returns(address) func (_RocketStorage *RocketStorageCallerSession) GetAddress(_key [32]byte) (common.Address, error) { return _RocketStorage.Contract.GetAddress(&_RocketStorage.CallOpts, _key) } // GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. // -// Solidity: function getBool(bytes32 _key) constant returns(bool) +// Solidity: function getBool(bytes32 _key) view returns(bool) func (_RocketStorage *RocketStorageCaller) GetBool(opts *bind.CallOpts, _key [32]byte) (bool, error) { var ( ret0 = new(bool) @@ -212,21 +211,21 @@ func (_RocketStorage *RocketStorageCaller) GetBool(opts *bind.CallOpts, _key [32 // GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. // -// Solidity: function getBool(bytes32 _key) constant returns(bool) +// Solidity: function getBool(bytes32 _key) view returns(bool) func (_RocketStorage *RocketStorageSession) GetBool(_key [32]byte) (bool, error) { return _RocketStorage.Contract.GetBool(&_RocketStorage.CallOpts, _key) } // GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. // -// Solidity: function getBool(bytes32 _key) constant returns(bool) +// Solidity: function getBool(bytes32 _key) view returns(bool) func (_RocketStorage *RocketStorageCallerSession) GetBool(_key [32]byte) (bool, error) { return _RocketStorage.Contract.GetBool(&_RocketStorage.CallOpts, _key) } // GetBytes is a free data retrieval call binding the contract method 0xc031a180. // -// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +// Solidity: function getBytes(bytes32 _key) view returns(bytes) func (_RocketStorage *RocketStorageCaller) GetBytes(opts *bind.CallOpts, _key [32]byte) ([]byte, error) { var ( ret0 = new([]byte) @@ -238,21 +237,21 @@ func (_RocketStorage *RocketStorageCaller) GetBytes(opts *bind.CallOpts, _key [3 // GetBytes is a free data retrieval call binding the contract method 0xc031a180. // -// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +// Solidity: function getBytes(bytes32 _key) view returns(bytes) func (_RocketStorage *RocketStorageSession) GetBytes(_key [32]byte) ([]byte, error) { return _RocketStorage.Contract.GetBytes(&_RocketStorage.CallOpts, _key) } // GetBytes is a free data retrieval call binding the contract method 0xc031a180. // -// Solidity: function getBytes(bytes32 _key) constant returns(bytes) +// Solidity: function getBytes(bytes32 _key) view returns(bytes) func (_RocketStorage *RocketStorageCallerSession) GetBytes(_key [32]byte) ([]byte, error) { return _RocketStorage.Contract.GetBytes(&_RocketStorage.CallOpts, _key) } // GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. // -// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +// Solidity: function getBytes32(bytes32 _key) view returns(bytes32) func (_RocketStorage *RocketStorageCaller) GetBytes32(opts *bind.CallOpts, _key [32]byte) ([32]byte, error) { var ( ret0 = new([32]byte) @@ -264,21 +263,21 @@ func (_RocketStorage *RocketStorageCaller) GetBytes32(opts *bind.CallOpts, _key // GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. // -// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +// Solidity: function getBytes32(bytes32 _key) view returns(bytes32) func (_RocketStorage *RocketStorageSession) GetBytes32(_key [32]byte) ([32]byte, error) { return _RocketStorage.Contract.GetBytes32(&_RocketStorage.CallOpts, _key) } // GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. // -// Solidity: function getBytes32(bytes32 _key) constant returns(bytes32) +// Solidity: function getBytes32(bytes32 _key) view returns(bytes32) func (_RocketStorage *RocketStorageCallerSession) GetBytes32(_key [32]byte) ([32]byte, error) { return _RocketStorage.Contract.GetBytes32(&_RocketStorage.CallOpts, _key) } // GetInt is a free data retrieval call binding the contract method 0xdc97d962. // -// Solidity: function getInt(bytes32 _key) constant returns(int256) +// Solidity: function getInt(bytes32 _key) view returns(int256) func (_RocketStorage *RocketStorageCaller) GetInt(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { var ( ret0 = new(*big.Int) @@ -290,21 +289,21 @@ func (_RocketStorage *RocketStorageCaller) GetInt(opts *bind.CallOpts, _key [32] // GetInt is a free data retrieval call binding the contract method 0xdc97d962. // -// Solidity: function getInt(bytes32 _key) constant returns(int256) +// Solidity: function getInt(bytes32 _key) view returns(int256) func (_RocketStorage *RocketStorageSession) GetInt(_key [32]byte) (*big.Int, error) { return _RocketStorage.Contract.GetInt(&_RocketStorage.CallOpts, _key) } // GetInt is a free data retrieval call binding the contract method 0xdc97d962. // -// Solidity: function getInt(bytes32 _key) constant returns(int256) +// Solidity: function getInt(bytes32 _key) view returns(int256) func (_RocketStorage *RocketStorageCallerSession) GetInt(_key [32]byte) (*big.Int, error) { return _RocketStorage.Contract.GetInt(&_RocketStorage.CallOpts, _key) } // GetString is a free data retrieval call binding the contract method 0x986e791a. // -// Solidity: function getString(bytes32 _key) constant returns(string) +// Solidity: function getString(bytes32 _key) view returns(string) func (_RocketStorage *RocketStorageCaller) GetString(opts *bind.CallOpts, _key [32]byte) (string, error) { var ( ret0 = new(string) @@ -316,21 +315,21 @@ func (_RocketStorage *RocketStorageCaller) GetString(opts *bind.CallOpts, _key [ // GetString is a free data retrieval call binding the contract method 0x986e791a. // -// Solidity: function getString(bytes32 _key) constant returns(string) +// Solidity: function getString(bytes32 _key) view returns(string) func (_RocketStorage *RocketStorageSession) GetString(_key [32]byte) (string, error) { return _RocketStorage.Contract.GetString(&_RocketStorage.CallOpts, _key) } // GetString is a free data retrieval call binding the contract method 0x986e791a. // -// Solidity: function getString(bytes32 _key) constant returns(string) +// Solidity: function getString(bytes32 _key) view returns(string) func (_RocketStorage *RocketStorageCallerSession) GetString(_key [32]byte) (string, error) { return _RocketStorage.Contract.GetString(&_RocketStorage.CallOpts, _key) } // GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. // -// Solidity: function getUint(bytes32 _key) constant returns(uint256) +// Solidity: function getUint(bytes32 _key) view returns(uint256) func (_RocketStorage *RocketStorageCaller) GetUint(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { var ( ret0 = new(*big.Int) @@ -342,14 +341,14 @@ func (_RocketStorage *RocketStorageCaller) GetUint(opts *bind.CallOpts, _key [32 // GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. // -// Solidity: function getUint(bytes32 _key) constant returns(uint256) +// Solidity: function getUint(bytes32 _key) view returns(uint256) func (_RocketStorage *RocketStorageSession) GetUint(_key [32]byte) (*big.Int, error) { return _RocketStorage.Contract.GetUint(&_RocketStorage.CallOpts, _key) } // GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. // -// Solidity: function getUint(bytes32 _key) constant returns(uint256) +// Solidity: function getUint(bytes32 _key) view returns(uint256) func (_RocketStorage *RocketStorageCallerSession) GetUint(_key [32]byte) (*big.Int, error) { return _RocketStorage.Contract.GetUint(&_RocketStorage.CallOpts, _key) } From 3b95421ad7a9d1536684ab25fc3346d490953006 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 10:11:19 +1000 Subject: [PATCH 005/878] updated deps --- go.mod | 2 + go.sum | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 go.sum diff --git a/go.mod b/go.mod index 02fbfeb72..8a8626f38 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/rocket-pool/rocketpool-go go 1.13 + +require github.com/ethereum/go-ethereum v1.9.15 diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..fd458225f --- /dev/null +++ b/go.sum @@ -0,0 +1,176 @@ +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= +github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= +github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= +github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c h1:JHHhtb9XWJrGNMcrVP6vyzO4dusgi/HnceHTgxSejUM= +github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ethereum/go-ethereum v1.9.15 h1:wrWl+QrtutRUJ9LZXdUqBoGoo2b1tOCYRDrAOQhCY3A= +github.com/ethereum/go-ethereum v1.9.15/go.mod h1:slT8bPPRhXsyNTwHQxrOnjuTZ1sDXRajW11EkJ84QJ0= +github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c h1:zqAKixg3cTcIasAMJV+EcfVbWwLpOZ7LeoWJvcuD/5Q= +github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989 h1:giknQ4mEuDFmmHSrGcbargOuLHQGtywqo4mheITex54= +github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk= +github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA= +github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= +github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible h1:+gAR1bMhuoQnZMTWFIvp7ukynULPsteLzG+siZKLtD8= +github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 h1:QmwruyY+bKbDDL0BaglrbZABEali68eoMFhTZpCjYVA= +golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U= +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200603215123-a4a8cb9d2cbc/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= From a1985ce4a47faf79db0af5447fe9521416e63d9c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 10:13:36 +1000 Subject: [PATCH 006/878] implementing RP contract manager --- rocketpool/rocketpool.go | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 rocketpool/rocketpool.go diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go new file mode 100644 index 000000000..908050742 --- /dev/null +++ b/rocketpool/rocketpool.go @@ -0,0 +1,62 @@ +package rocketpool + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/contracts" +) + + +// Rocket Pool contract manager +type RocketPool struct { + RocketStorage *contracts.RocketStorage + client *ethclient.Client +} + + +// Create new contract manager +func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { + + // Initialize RocketStorage contract + rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) + if err != nil { + return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) + } + + // Create and return + return &RocketPool{ + RocketStorage: rocketStorage, + client: client, + }, nil + +} + + +// Load a Rocket Pool contract address +func (rp *RocketPool) Address(contractName string) (*common.Address, error) { + return nil, nil +} + + +// Load a Rocket Pool contract ABI +func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { + return nil, nil +} + + +// Load a Rocket Pool contract +func (rp *RocketPool) Get(contractName string) (*bind.BoundContract, error) { + return nil, nil +} + + +// Create a Rocket Pool contract instance +func (rp *RocketPool) Make(contractName string, address common.Address) (*bind.BoundContract, error) { + return nil, nil +} + From 512646ebb4e3302c60b148d77f78d6509860ed29 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 11:36:24 +1000 Subject: [PATCH 007/878] implementing contract manager --- rocketpool/rocketpool.go | 73 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 908050742..62dc50736 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -2,20 +2,42 @@ package rocketpool import ( "fmt" + "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/contracts" ) +// Cache settings +const CACHE_TTL = 60 // Seconds + + +// Cached data types +type cachedAddress struct { + address *common.Address + time int64 +} +type cachedABI struct { + abi *abi.ABI + time int64 +} + + // Rocket Pool contract manager type RocketPool struct { + Client *ethclient.Client RocketStorage *contracts.RocketStorage - client *ethclient.Client + addresses map[string]cachedAddress + abis map[string]cachedABI + addressesLock sync.RWMutex + abisLock sync.RWMutex } @@ -30,8 +52,10 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address // Create and return return &RocketPool{ + Client: client, RocketStorage: rocketStorage, - client: client, + addresses: make(map[string]cachedAddress), + abis: make(map[string]cachedABI), }, nil } @@ -39,7 +63,31 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address // Load a Rocket Pool contract address func (rp *RocketPool) Address(contractName string) (*common.Address, error) { - return nil, nil + + // Check for cached address + if cached, ok := rp.getCachedAddress(contractName); ok { + if (time.Now().Unix() - cached.time <= CACHE_TTL) { + return cached.address, nil + } else { + rp.deleteCachedAddress(contractName) + } + } + + // Get address + address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.name"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not get contract address: %w", err) + } + + // Cache address + rp.setCachedAddress(contractName, cachedAddress{ + address: &address, + time: time.Now().Unix(), + }) + + // Return + return &address, nil + } @@ -60,3 +108,22 @@ func (rp *RocketPool) Make(contractName string, address common.Address) (*bind.B return nil, nil } + +// Address cache control +func (rp *RocketPool) getCachedAddress(contractName string) (cachedAddress, bool) { + rp.addressesLock.RLock() + defer rp.addressesLock.RUnlock() + value, ok := rp.addresses[contractName] + return value, ok +} +func (rp *RocketPool) setCachedAddress(contractName string, value cachedAddress) { + rp.addressesLock.Lock() + defer rp.addressesLock.Unlock() + rp.addresses[contractName] = value +} +func (rp *RocketPool) deleteCachedAddress(contractName string) { + rp.addressesLock.Lock() + defer rp.addressesLock.Unlock() + delete(rp.addresses, contractName) +} + From 8814f0c8c545248f20a6a6c52efa1fb3f70c7907 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 11:49:55 +1000 Subject: [PATCH 008/878] implementing contract manager --- rocketpool/rocketpool.go | 84 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 62dc50736..ce8e9bb05 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -1,6 +1,9 @@ package rocketpool import ( + "bytes" + "compress/zlib" + "encoding/base64" "fmt" "sync" "time" @@ -76,7 +79,7 @@ func (rp *RocketPool) Address(contractName string) (*common.Address, error) { // Get address address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.name"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not get contract address: %w", err) + return nil, fmt.Errorf("Could not get contract %v address: %w", contractName, err) } // Cache address @@ -93,7 +96,37 @@ func (rp *RocketPool) Address(contractName string) (*common.Address, error) { // Load a Rocket Pool contract ABI func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { - return nil, nil + + // Check for cached ABI + if cached, ok := rp.getCachedABI(contractName); ok { + if (time.Now().Unix() - cached.time <= CACHE_TTL) { + return cached.abi, nil + } else { + rp.deleteCachedABI(contractName) + } + } + + // Get ABI + abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not get contract %v ABI: %w", contractName, err) + } + + // Decode ABI + abi, err := decodeAbi(abiEncoded) + if err != nil { + return nil, err + } + + // Cache ABI + rp.setCachedABI(contractName, cachedABI{ + abi: abi, + time: time.Now().Unix(), + }) + + // Return + return abi, nil + } @@ -127,3 +160,50 @@ func (rp *RocketPool) deleteCachedAddress(contractName string) { delete(rp.addresses, contractName) } + +// ABI cache control +func (rp *RocketPool) getCachedABI(contractName string) (cachedABI, bool) { + rp.abisLock.RLock() + defer rp.abisLock.RUnlock() + value, ok := rp.abis[contractName] + return value, ok +} +func (rp *RocketPool) setCachedABI(contractName string, value cachedABI) { + rp.abisLock.Lock() + defer rp.abisLock.Unlock() + rp.abis[contractName] = value +} +func (rp *RocketPool) deleteCachedABI(contractName string) { + rp.abisLock.Lock() + defer rp.abisLock.Unlock() + delete(rp.abis, contractName) +} + + +// Decode, decompress and parse zlib-compressed, base64-encoded ABI +func decodeAbi(abiEncoded string) (*abi.ABI, error) { + + // Base 64 decode + abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode contract ABI base64 string: %w", err) + } + + // Zlib decompress + byteReader := bytes.NewReader(abiCompressed) + zlibReader, err := zlib.NewReader(byteReader) + if err != nil { + return nil, fmt.Errorf("Could not decompress contract ABI zlib data: %w", err) + } + + // Parse ABI + abiParsed, err := abi.JSON(zlibReader) + if err != nil { + return nil, fmt.Errorf("Could not parse contract ABI JSON: %w", err) + } + + // Return + return &abiParsed, nil + +} + From cfe990f1c279744efacb919185a7ebb2d017e0fd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 14:13:46 +1000 Subject: [PATCH 009/878] implementing contract manager --- rocketpool/rocketpool.go | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index ce8e9bb05..22b192ae1 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/contracts" ) @@ -79,7 +80,7 @@ func (rp *RocketPool) Address(contractName string) (*common.Address, error) { // Get address address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.name"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not get contract %v address: %w", contractName, err) + return nil, fmt.Errorf("Could not load contract %v address: %w", contractName, err) } // Cache address @@ -109,7 +110,7 @@ func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { // Get ABI abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not get contract %v ABI: %w", contractName, err) + return nil, fmt.Errorf("Could not load contract %v ABI: %w", contractName, err) } // Decode ABI @@ -132,7 +133,34 @@ func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { // Load a Rocket Pool contract func (rp *RocketPool) Get(contractName string) (*bind.BoundContract, error) { - return nil, nil + + // Contract data + var wg errgroup.Group + var contractAddress *common.Address + var contractAbi *abi.ABI + + // Load address + wg.Go(func() error { + address, err := rp.Address(contractName) + if err == nil { contractAddress = address } + return err + }) + + // Load ABI + wg.Go(func() error { + abi, err := rp.ABI(contractName) + if err == nil { contractAbi = abi } + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Create and return + return bind.NewBoundContract(*contractAddress, *contractAbi, rp.Client, rp.Client, rp.Client), nil + } From e0dd00206c70f712fa4c6075a5c835819ce94623 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 14:14:08 +1000 Subject: [PATCH 010/878] updated deps --- go.mod | 5 ++++- go.sum | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8a8626f38..20070d164 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/rocket-pool/rocketpool-go go 1.13 -require github.com/ethereum/go-ethereum v1.9.15 +require ( + github.com/ethereum/go-ethereum v1.9.15 + golang.org/x/sync v0.0.0-20181108010431-42b317875d0f +) diff --git a/go.sum b/go.sum index fd458225f..1135d98f1 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From a91e56be30c0542c8363116034167d734bba7fa9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 14:16:06 +1000 Subject: [PATCH 011/878] minor cleanup --- rocketpool/rocketpool.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 22b192ae1..6af235247 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -66,7 +66,7 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address // Load a Rocket Pool contract address -func (rp *RocketPool) Address(contractName string) (*common.Address, error) { +func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Check for cached address if cached, ok := rp.getCachedAddress(contractName); ok { @@ -96,7 +96,7 @@ func (rp *RocketPool) Address(contractName string) (*common.Address, error) { // Load a Rocket Pool contract ABI -func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { +func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Check for cached ABI if cached, ok := rp.getCachedABI(contractName); ok { @@ -132,7 +132,7 @@ func (rp *RocketPool) ABI(contractName string) (*abi.ABI, error) { // Load a Rocket Pool contract -func (rp *RocketPool) Get(contractName string) (*bind.BoundContract, error) { +func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, error) { // Contract data var wg errgroup.Group @@ -141,14 +141,14 @@ func (rp *RocketPool) Get(contractName string) (*bind.BoundContract, error) { // Load address wg.Go(func() error { - address, err := rp.Address(contractName) + address, err := rp.GetAddress(contractName) if err == nil { contractAddress = address } return err }) // Load ABI wg.Go(func() error { - abi, err := rp.ABI(contractName) + abi, err := rp.GetABI(contractName) if err == nil { contractAbi = abi } return err }) @@ -165,7 +165,7 @@ func (rp *RocketPool) Get(contractName string) (*bind.BoundContract, error) { // Create a Rocket Pool contract instance -func (rp *RocketPool) Make(contractName string, address common.Address) (*bind.BoundContract, error) { +func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*bind.BoundContract, error) { return nil, nil } From df464f10ae7e0ebf8ea3038bd10b8babf30a58df Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 14:26:38 +1000 Subject: [PATCH 012/878] implementing contract manager --- rocketpool/rocketpool.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 6af235247..0352a0ba4 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -116,7 +116,7 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Decode ABI abi, err := decodeAbi(abiEncoded) if err != nil { - return nil, err + return nil, fmt.Errorf("Could not decode contract %v ABI: %w", contractName, err) } // Cache ABI @@ -166,7 +166,16 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err // Create a Rocket Pool contract instance func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*bind.BoundContract, error) { - return nil, nil + + // Load ABI + abi, err := rp.GetABI(contractName) + if err != nil { + return nil, err + } + + // Create and return + return bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), nil + } @@ -214,20 +223,20 @@ func decodeAbi(abiEncoded string) (*abi.ABI, error) { // Base 64 decode abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode contract ABI base64 string: %w", err) + return nil, fmt.Errorf("Could not decode ABI base64 string: %w", err) } // Zlib decompress byteReader := bytes.NewReader(abiCompressed) zlibReader, err := zlib.NewReader(byteReader) if err != nil { - return nil, fmt.Errorf("Could not decompress contract ABI zlib data: %w", err) + return nil, fmt.Errorf("Could not decompress ABI zlib data: %w", err) } // Parse ABI abiParsed, err := abi.JSON(zlibReader) if err != nil { - return nil, fmt.Errorf("Could not parse contract ABI JSON: %w", err) + return nil, fmt.Errorf("Could not parse ABI JSON: %w", err) } // Return From 4445d903a4b9558ca9874d570e5c3c7dae2bad66 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 14:58:09 +1000 Subject: [PATCH 013/878] implementing contract manager --- rocketpool/rocketpool.go | 81 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 0352a0ba4..b79d89a97 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -65,7 +65,7 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address } -// Load a Rocket Pool contract address +// Load Rocket Pool contract addresses func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Check for cached address @@ -93,9 +93,34 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { return &address, nil } +func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, error) { + // Data + var wg errgroup.Group + addresses := make([]*common.Address, len(contractNames)) + + // Load addresses + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + address, err := rp.GetAddress(contractName) + if err == nil { addresses[ci] = address } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return addresses, nil -// Load a Rocket Pool contract ABI +} + + +// Load Rocket Pool contract ABIs func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Check for cached ABI @@ -129,9 +154,34 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { return abi, nil } +func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { + + // Data + var wg errgroup.Group + abis := make([]*abi.ABI, len(contractNames)) + + // Load ABIs + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + abi, err := rp.GetABI(contractName) + if err == nil { abis[ci] = abi } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return abis, nil + +} -// Load a Rocket Pool contract +// Load Rocket Pool contracts func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, error) { // Contract data @@ -162,6 +212,31 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err return bind.NewBoundContract(*contractAddress, *contractAbi, rp.Client, rp.Client, rp.Client), nil } +func (rp *RocketPool) GetContracts(contractNames ...string) ([]*bind.BoundContract, error) { + + // Data + var wg errgroup.Group + contracts := make([]*bind.BoundContract, len(contractNames)) + + // Load contracts + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + contract, err := rp.GetContract(contractName) + if err == nil { contracts[ci] = contract } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return contracts, nil + +} // Create a Rocket Pool contract instance From e2f0cb84c27765e89c6a2d43047e1001ef6d7a0e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 15:42:54 +1000 Subject: [PATCH 014/878] implementing node module --- node/manager.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 node/manager.go diff --git a/node/manager.go b/node/manager.go new file mode 100644 index 000000000..dded96d1e --- /dev/null +++ b/node/manager.go @@ -0,0 +1,127 @@ +package node + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Node details +type NodeDetails struct { + exists bool + trusted bool + timezoneLocation string +} + + +// Get a node's details +func GetDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDetails, error) { + + // Node data + var wg errgroup.Group + var nodeExists bool + var nodeTrusted bool + var nodeTimezoneLocation string + + // Get exists status + wg.Go(func() error { + exists, err := GetExists(rp, nodeAddress) + if err == nil { nodeExists = exists } + return err + }) + + // Get trusted status + wg.Go(func() error { + trusted, err := GetTrusted(rp, nodeAddress) + if err == nil { nodeTrusted = trusted } + return err + }) + + // Get timezone location + wg.Go(func() error { + timezoneLocation, err := GetTimezoneLocation(rp, nodeAddress) + if err == nil { nodeTimezoneLocation = timezoneLocation } + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &NodeDetails{ + exists: nodeExists, + trusted: nodeTrusted, + timezoneLocation: nodeTimezoneLocation, + }, nil + +} + + +// Check whether a node exists +func GetExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { + + // Get rocketNodeManager contract + rocketNodeManager, err := rp.GetContract("rocketNodeManager") + if err != nil { + return false, err + } + + // Get node exists status + exists := new(bool) + if err := rocketNodeManager.Call(nil, exists, "getNodeExists", nodeAddress); err != nil { + return false, fmt.Errorf("Could not get node %v exists status: %w", nodeAddress.Hex(), err) + } + + // Return + return *exists, nil + +} + + +// Get a node's trusted status +func GetTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { + + // Get rocketNodeManager contract + rocketNodeManager, err := rp.GetContract("rocketNodeManager") + if err != nil { + return false, err + } + + // Get node trusted status + trusted := new(bool) + if err := rocketNodeManager.Call(nil, trusted, "getNodeTrusted", nodeAddress); err != nil { + return false, fmt.Errorf("Could not get node %v trusted status: %w", nodeAddress.Hex(), err) + } + + // Return + return *trusted, nil + +} + + +// Get a node's timezone location +func GetTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address) (string, error) { + + // Get rocketNodeManager contract + rocketNodeManager, err := rp.GetContract("rocketNodeManager") + if err != nil { + return "", err + } + + // Get node timezone location + timezoneLocation := new(string) + if err := rocketNodeManager.Call(nil, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { + return "", fmt.Errorf("Could not get node %v timezone location: %w", nodeAddress.Hex(), err) + } + + // Return + return *timezoneLocation, nil + +} + From 04e25829c4035367451252f81fe5fc48d1e88fbb Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 16:28:45 +1000 Subject: [PATCH 015/878] added RP contract cache --- rocketpool/rocketpool.go | 48 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index b79d89a97..33b9eb03b 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -32,6 +32,10 @@ type cachedABI struct { abi *abi.ABI time int64 } +type cachedContract struct { + contract *bind.BoundContract + time int64 +} // Rocket Pool contract manager @@ -40,8 +44,10 @@ type RocketPool struct { RocketStorage *contracts.RocketStorage addresses map[string]cachedAddress abis map[string]cachedABI + contracts map[string]cachedContract addressesLock sync.RWMutex abisLock sync.RWMutex + contractsLock sync.RWMutex } @@ -60,6 +66,7 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address RocketStorage: rocketStorage, addresses: make(map[string]cachedAddress), abis: make(map[string]cachedABI), + contracts: make(map[string]cachedContract), }, nil } @@ -184,6 +191,15 @@ func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { // Load Rocket Pool contracts func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, error) { + // Check for cached contract + if cached, ok := rp.getCachedContract(contractName); ok { + if (time.Now().Unix() - cached.time <= CACHE_TTL) { + return cached.contract, nil + } else { + rp.deleteCachedContract(contractName) + } + } + // Contract data var wg errgroup.Group var contractAddress *common.Address @@ -208,8 +224,17 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err return nil, err } - // Create and return - return bind.NewBoundContract(*contractAddress, *contractAbi, rp.Client, rp.Client, rp.Client), nil + // Create contract + contract := bind.NewBoundContract(*contractAddress, *contractAbi, rp.Client, rp.Client, rp.Client) + + // Cache contract + rp.setCachedContract(contractName, cachedContract{ + contract: contract, + time: time.Now().Unix(), + }) + + // Return + return contract, nil } func (rp *RocketPool) GetContracts(contractNames ...string) ([]*bind.BoundContract, error) { @@ -292,6 +317,25 @@ func (rp *RocketPool) deleteCachedABI(contractName string) { } +// Contract cache control +func (rp *RocketPool) getCachedContract(contractName string) (cachedContract, bool) { + rp.contractsLock.RLock() + defer rp.contractsLock.RUnlock() + value, ok := rp.contracts[contractName] + return value, ok +} +func (rp *RocketPool) setCachedContract(contractName string, value cachedContract) { + rp.contractsLock.Lock() + defer rp.contractsLock.Unlock() + rp.contracts[contractName] = value +} +func (rp *RocketPool) deleteCachedContract(contractName string) { + rp.contractsLock.Lock() + defer rp.contractsLock.Unlock() + delete(rp.contracts, contractName) +} + + // Decode, decompress and parse zlib-compressed, base64-encoded ABI func decodeAbi(abiEncoded string) (*abi.ABI, error) { From 520ae68f1e4b410933073c7d4604733777c549ac Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 17:17:23 +1000 Subject: [PATCH 016/878] added contract transaction utility --- utils/contract/transactions.go | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 utils/contract/transactions.go diff --git a/utils/contract/transactions.go b/utils/contract/transactions.go new file mode 100644 index 000000000..62c4d9ec7 --- /dev/null +++ b/utils/contract/transactions.go @@ -0,0 +1,38 @@ +package contract + +import ( + "context" + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" +) + + +// Transact on a contract method and wait for a receipt +func Transact(client *ethclient.Client, contract *bind.BoundContract, opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { + + // Send transaction + tx, err := contract.Transact(opts, method, params...) + if err != nil { + return nil, fmt.Errorf("Could not transact on contract: %w", err) + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), client, tx) + if err != nil { + return nil, fmt.Errorf("Could not get transaction receipt: %w", err) + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil + +} + From 6a097c68c90875fa90f42c14e00f24db1803d16c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 8 Jul 2020 17:21:18 +1000 Subject: [PATCH 017/878] implementing node module --- node/manager.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/node/manager.go b/node/manager.go index dded96d1e..e643a3833 100644 --- a/node/manager.go +++ b/node/manager.go @@ -3,10 +3,13 @@ package node import ( "fmt" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -125,3 +128,18 @@ func GetTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address) } + +// Register a node +func Register(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { + + // Get rocketNodeManager contract + rocketNodeManager, err := rp.GetContract("rocketNodeManager") + if err != nil { + return nil, err + } + + // Register & return + return contract.Transact(rp.Client, rocketNodeManager, opts, "registerNode", timezoneLocation) + +} + From 5341ac95a514290ec5902a553d18b22924a49e7a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 09:20:09 +1000 Subject: [PATCH 018/878] updated contract cache settings --- rocketpool/rocketpool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 33b9eb03b..94f291453 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -20,7 +20,7 @@ import ( // Cache settings -const CACHE_TTL = 60 // Seconds +const CACHE_TTL = 300 // 5 minutes // Cached data types From c5ebdc0d3a911dee9e8ad87946e5af1a883f9c8f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 09:21:48 +1000 Subject: [PATCH 019/878] minor cleanup --- node/{manager.go => node.go} | 54 ++++++++++++------------------------ 1 file changed, 17 insertions(+), 37 deletions(-) rename node/{manager.go => node.go} (66%) diff --git a/node/manager.go b/node/node.go similarity index 66% rename from node/manager.go rename to node/node.go index e643a3833..b737e2d1c 100644 --- a/node/manager.go +++ b/node/node.go @@ -22,7 +22,7 @@ type NodeDetails struct { // Get a node's details -func GetDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDetails, error) { +func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDetails, error) { // Node data var wg errgroup.Group @@ -32,21 +32,21 @@ func GetDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDet // Get exists status wg.Go(func() error { - exists, err := GetExists(rp, nodeAddress) + exists, err := GetNodeExists(rp, nodeAddress) if err == nil { nodeExists = exists } return err }) // Get trusted status wg.Go(func() error { - trusted, err := GetTrusted(rp, nodeAddress) + trusted, err := GetNodeTrusted(rp, nodeAddress) if err == nil { nodeTrusted = trusted } return err }) // Get timezone location wg.Go(func() error { - timezoneLocation, err := GetTimezoneLocation(rp, nodeAddress) + timezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAddress) if err == nil { nodeTimezoneLocation = timezoneLocation } return err }) @@ -67,79 +67,59 @@ func GetDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDet // Check whether a node exists -func GetExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { - - // Get rocketNodeManager contract - rocketNodeManager, err := rp.GetContract("rocketNodeManager") +func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { + rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return false, err } - - // Get node exists status exists := new(bool) if err := rocketNodeManager.Call(nil, exists, "getNodeExists", nodeAddress); err != nil { return false, fmt.Errorf("Could not get node %v exists status: %w", nodeAddress.Hex(), err) } - - // Return return *exists, nil - } // Get a node's trusted status -func GetTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { - - // Get rocketNodeManager contract - rocketNodeManager, err := rp.GetContract("rocketNodeManager") +func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { + rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return false, err } - - // Get node trusted status trusted := new(bool) if err := rocketNodeManager.Call(nil, trusted, "getNodeTrusted", nodeAddress); err != nil { return false, fmt.Errorf("Could not get node %v trusted status: %w", nodeAddress.Hex(), err) } - - // Return return *trusted, nil - } // Get a node's timezone location -func GetTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address) (string, error) { - - // Get rocketNodeManager contract - rocketNodeManager, err := rp.GetContract("rocketNodeManager") +func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address) (string, error) { + rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return "", err } - - // Get node timezone location timezoneLocation := new(string) if err := rocketNodeManager.Call(nil, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { return "", fmt.Errorf("Could not get node %v timezone location: %w", nodeAddress.Hex(), err) } - - // Return return *timezoneLocation, nil - } // Register a node -func Register(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { - - // Get rocketNodeManager contract - rocketNodeManager, err := rp.GetContract("rocketNodeManager") +func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return nil, err } - - // Register & return return contract.Transact(rp.Client, rocketNodeManager, opts, "registerNode", timezoneLocation) +} + +// Get contracts +func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + return rp.GetContract("rocketNodeManager") } From 4cb79e5189e080d4ba2130a83c9c5e68342816ff Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 09:56:40 +1000 Subject: [PATCH 020/878] updated error messages --- node/node.go | 6 +++++- rocketpool/rocketpool.go | 6 +++--- utils/contract/transactions.go | 5 ++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/node/node.go b/node/node.go index b737e2d1c..6ebb5299b 100644 --- a/node/node.go +++ b/node/node.go @@ -114,7 +114,11 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind if err != nil { return nil, err } - return contract.Transact(rp.Client, rocketNodeManager, opts, "registerNode", timezoneLocation) + txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "registerNode", timezoneLocation) + if err != nil { + return nil, fmt.Errorf("Could not register node: %w", err) + } + return txReceipt, nil } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 94f291453..26437aaf4 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -342,20 +342,20 @@ func decodeAbi(abiEncoded string) (*abi.ABI, error) { // Base 64 decode abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode ABI base64 string: %w", err) + return nil, fmt.Errorf("Could not decode base64 data: %w", err) } // Zlib decompress byteReader := bytes.NewReader(abiCompressed) zlibReader, err := zlib.NewReader(byteReader) if err != nil { - return nil, fmt.Errorf("Could not decompress ABI zlib data: %w", err) + return nil, fmt.Errorf("Could not decompress zlib data: %w", err) } // Parse ABI abiParsed, err := abi.JSON(zlibReader) if err != nil { - return nil, fmt.Errorf("Could not parse ABI JSON: %w", err) + return nil, fmt.Errorf("Could not parse JSON: %w", err) } // Return diff --git a/utils/contract/transactions.go b/utils/contract/transactions.go index 62c4d9ec7..d8202ccef 100644 --- a/utils/contract/transactions.go +++ b/utils/contract/transactions.go @@ -3,7 +3,6 @@ package contract import ( "context" "errors" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" @@ -17,13 +16,13 @@ func Transact(client *ethclient.Client, contract *bind.BoundContract, opts *bind // Send transaction tx, err := contract.Transact(opts, method, params...) if err != nil { - return nil, fmt.Errorf("Could not transact on contract: %w", err) + return nil, err } // Wait for transaction to be mined txReceipt, err := bind.WaitMined(context.Background(), client, tx) if err != nil { - return nil, fmt.Errorf("Could not get transaction receipt: %w", err) + return nil, err } // Check transaction status From dfe8798caa894242970b6c52a219ab2ed8e94ee8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 10:14:51 +1000 Subject: [PATCH 021/878] implementing node module --- node/node.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/node/node.go b/node/node.go index 6ebb5299b..89bf77a28 100644 --- a/node/node.go +++ b/node/node.go @@ -122,6 +122,20 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } +// Set a node's timezone location +func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "setTimezoneLocation", timezoneLocation) + if err != nil { + return nil, fmt.Errorf("Could not set node timezone location: %w", err) + } + return txReceipt, nil +} + + // Get contracts func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { return rp.GetContract("rocketNodeManager") From 6b11c4d8e56dbf2f0e388d43e5c2d016953dc41b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 10:41:53 +1000 Subject: [PATCH 022/878] added eth unit conversion helpers --- utils/eth/units.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 utils/eth/units.go diff --git a/utils/eth/units.go b/utils/eth/units.go new file mode 100644 index 000000000..ce2aaa218 --- /dev/null +++ b/utils/eth/units.go @@ -0,0 +1,53 @@ +package eth + +import ( + "math/big" +) + + +// Conversion factors +const WEI_PER_ETH float64 = 1e18 +const WEI_PER_GWEI float64 = 1e9 + + +// Convert wei to eth +func WeiToEth(wei *big.Int) float64 { + var weiFloat big.Float + var eth big.Float + weiFloat.SetInt(wei) + eth.Quo(&weiFloat, big.NewFloat(WEI_PER_ETH)) + eth64, _ := eth.Float64() + return eth64 +} + + +// Convert eth to wei +func EthToWei(eth float64) *big.Int { + var weiFloat big.Float + var wei big.Int + weiFloat.Mul(big.NewFloat(eth), big.NewFloat(WEI_PER_ETH)) + weiFloat.Int(&wei) + return &wei +} + + +// Convert wei to gigawei +func WeiToGwei(wei *big.Int) float64 { + var weiFloat big.Float + var gwei big.Float + weiFloat.SetInt(wei) + gwei.Quo(&weiFloat, big.NewFloat(WEI_PER_GWEI)) + gwei64, _ := gwei.Float64() + return gwei64 +} + + +// Convert gigawei to wei +func GweiToWei(gwei float64) *big.Int { + var weiFloat big.Float + var wei big.Int + weiFloat.Mul(big.NewFloat(gwei), big.NewFloat(WEI_PER_GWEI)) + weiFloat.Int(&wei) + return &wei +} + From 1625a0566d0ab2ea04480b849808553d45888a51 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 10:42:08 +1000 Subject: [PATCH 023/878] implementing node module --- node/node.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/node/node.go b/node/node.go index 89bf77a28..02d04206e 100644 --- a/node/node.go +++ b/node/node.go @@ -10,6 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -136,8 +137,25 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } +// Make a node deposit +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNodeDeposit, opts, "deposit", eth.EthToWei(minimumNodeFee)) + if err != nil { + return nil, fmt.Errorf("Could not make node deposit: %w", err) + } + return txReceipt, nil +} + + // Get contracts func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { return rp.GetContract("rocketNodeManager") } +func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + return rp.GetContract("rocketNodeDeposit") +} From 7c986dfc99f05ea433bc3180654cdae2dd7b1073 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 10:57:17 +1000 Subject: [PATCH 024/878] added contract access locks to prevent multiple queries --- node/node.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/node/node.go b/node/node.go index 02d04206e..f677b1da9 100644 --- a/node/node.go +++ b/node/node.go @@ -2,6 +2,7 @@ package node import ( "fmt" + "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -14,6 +15,11 @@ import ( ) +// Contract access locks +var rocketNodeManagerLock sync.Mutex +var rocketNodeDepositLock sync.Mutex + + // Node details type NodeDetails struct { exists bool @@ -153,9 +159,13 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.Trans // Get contracts func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNodeManagerLock.Lock() + defer rocketNodeManagerLock.Unlock() return rp.GetContract("rocketNodeManager") } func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNodeDepositLock.Lock() + defer rocketNodeDepositLock.Unlock() return rp.GetContract("rocketNodeDeposit") } From cc1db3be67a753e2a9a694912c2003b0796219dc Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 11:48:56 +1000 Subject: [PATCH 025/878] implementing minipool module --- minipool/minipool.go | 90 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 minipool/minipool.go diff --git a/minipool/minipool.go b/minipool/minipool.go new file mode 100644 index 000000000..96392df25 --- /dev/null +++ b/minipool/minipool.go @@ -0,0 +1,90 @@ +package minipool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + //"github.com/ethereum/go-ethereum/core/types" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + //"github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Contract access locks +var rocketMinipoolManagerLock sync.Mutex + + +// Get a node's minipool addresses +func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]common.Address, error) { + + // Get minipool count + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress) + if err != nil { + return []common.Address{}, err + } + + // Data + var wg errgroup.Group + addresses := make([]common.Address, minipoolCount) + + // Load addresses + for mi := int64(0); mi < minipoolCount; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi) + if err == nil { addresses[mi] = address } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + // Return + return addresses, nil + +} + + +// Get a node's minipool count +func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) (int64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(nil, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %v minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Int64(), nil +} + + +// Get a node's minipool address by index +func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index int64) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %v minipool %v address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil +} + + +// Get contracts +func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") +} + From 3f715afc066570c90c3403cb0dcd42c8978eec8b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 12:33:41 +1000 Subject: [PATCH 026/878] minor fix --- node/node.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/node/node.go b/node/node.go index f677b1da9..ffb005889 100644 --- a/node/node.go +++ b/node/node.go @@ -22,9 +22,9 @@ var rocketNodeDepositLock sync.Mutex // Node details type NodeDetails struct { - exists bool - trusted bool - timezoneLocation string + Exists bool + Trusted bool + TimezoneLocation string } @@ -65,9 +65,9 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*Nod // Return return &NodeDetails{ - exists: nodeExists, - trusted: nodeTrusted, - timezoneLocation: nodeTimezoneLocation, + Exists: nodeExists, + Trusted: nodeTrusted, + TimezoneLocation: nodeTimezoneLocation, }, nil } From 6c42572c178d079c699286b49981fee3d3380458 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 12:36:03 +1000 Subject: [PATCH 027/878] implementing minipool module --- minipool/minipool.go | 203 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 96392df25..26ac414b0 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -19,6 +19,52 @@ import ( var rocketMinipoolManagerLock sync.Mutex +// Minipool details +type MinipoolDetails struct { + Address common.Address + Exists bool + Pubkey []byte + WithdrawalTotalBalance *big.Int + WithdrawalNodeBalance *big.Int + Withdrawable bool + WithdrawalProcessed bool +} + + +// Get a node's minipool details +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]*MinipoolDetails, error) { + + // Get minipool addresses + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress) + if err != nil { + return []*MinipoolDetails{}, err + } + + // Data + var wg errgroup.Group + details := make([]*MinipoolDetails, len(minipoolAddresses)) + + // Load details + for mi, minipoolAddress := range minipoolAddresses { + mi, minipoolAddress := mi, minipoolAddress + wg.Go(func() error { + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress) + if err == nil { details[mi] = minipoolDetails } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return []*MinipoolDetails{}, err + } + + // Return + return details, nil + +} + + // Get a node's minipool addresses func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]common.Address, error) { @@ -53,6 +99,79 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr } +// Get a minipool's details +func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*MinipoolDetails, error) { + + // Minipool data + var wg errgroup.Group + var minipoolExists bool + var minipoolPubkey []byte + var minipoolWithdrawalTotalBalance *big.Int + var minipoolWithdrawalNodeBalance *big.Int + var minipoolWithdrawable bool + var minipoolWithdrawalProcessed bool + + // Get exists status + wg.Go(func() error { + exists, err := GetMinipoolExists(rp, minipoolAddress) + if err == nil { minipoolExists = exists } + return err + }) + + // Get pubkey + wg.Go(func() error { + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress) + if err == nil { minipoolPubkey = pubkey } + return err + }) + + // Get withdrawal total balance + wg.Go(func() error { + withdrawalTotalBalance, err := GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress) + if err == nil { minipoolWithdrawalTotalBalance = withdrawalTotalBalance } + return err + }) + + // Get withdrawal node balance + wg.Go(func() error { + withdrawalNodeBalance, err := GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress) + if err == nil { minipoolWithdrawalNodeBalance = withdrawalNodeBalance } + return err + }) + + // Get withdrawable status + wg.Go(func() error { + withdrawable, err := GetMinipoolWithdrawable(rp, minipoolAddress) + if err == nil { minipoolWithdrawable = withdrawable } + return err + }) + + // Get withdrawal processed status + wg.Go(func() error { + withdrawalProcessed, err := GetMinipoolWithdrawalProcessed(rp, minipoolAddress) + if err == nil { minipoolWithdrawalProcessed = withdrawalProcessed } + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &MinipoolDetails{ + Address: minipoolAddress, + Exists: minipoolExists, + Pubkey: minipoolPubkey, + WithdrawalTotalBalance: minipoolWithdrawalTotalBalance, + WithdrawalNodeBalance: minipoolWithdrawalNodeBalance, + Withdrawable: minipoolWithdrawable, + WithdrawalProcessed: minipoolWithdrawalProcessed, + }, nil + +} + + // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) (int64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) @@ -81,6 +200,90 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } +// Check whether a minipool exists +func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketMinipoolManager.Call(nil, exists, "getMinipoolExists", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %v exists status: %w", minipoolAddress.Hex(), err) + } + return *exists, nil +} + + +// Get a minipool's validator pubkey +func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address) ([]byte, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []byte{}, err + } + pubkey := new([]byte) + if err := rocketMinipoolManager.Call(nil, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool %v pubkey: %w", minipoolAddress.Hex(), err) + } + return *pubkey, nil +} + + +// Get a minipool's total balance at withdrawal +func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*big.Int, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalTotalBalance", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get minipool %v withdrawal total balance: %w", minipoolAddress.Hex(), err) + } + return *balance, nil +} + + +// Get a minipool's node balance at withdrawal +func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*big.Int, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalNodeBalance", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get minipool %v withdrawal node balance: %w", minipoolAddress.Hex(), err) + } + return *balance, nil +} + + +// Check whether a minipool is withdrawable +func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return false, err + } + withdrawable := new(bool) + if err := rocketMinipoolManager.Call(nil, withdrawable, "getMinipoolWithdrawable", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %v withdrawable status: %w", minipoolAddress.Hex(), err) + } + return *withdrawable, nil +} + + +// Check whether a minipool's validator withdrawal has been processed +func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return false, err + } + processed := new(bool) + if err := rocketMinipoolManager.Call(nil, processed, "getMinipoolWithdrawalProcessed", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %v withdrawal processed status: %w", minipoolAddress.Hex(), err) + } + return *processed, nil +} + + // Get contracts func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolManagerLock.Lock() From 426dd35c269fd7cd20445e1f1b9e092ddcc249bd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 12:42:55 +1000 Subject: [PATCH 028/878] implementing minipool module --- minipool/minipool.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 26ac414b0..9ee87ce05 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -1,6 +1,7 @@ package minipool import ( + "encoding/hex" "fmt" "math/big" "sync" @@ -200,6 +201,20 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } +// Get a minipool address by validator pubkey +func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey []byte) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { + return common.Address{}, fmt.Errorf("Could not get validator %v minipool address: %w", hex.EncodeToString(pubkey), err) + } + return *minipoolAddress, nil +} + + // Check whether a minipool exists func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) From 907b4aadc4824c0baa4c3b38f7a14a4e48e994f4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 13:31:46 +1000 Subject: [PATCH 029/878] implementing minipool module --- minipool/minipool.go | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 9ee87ce05..992a60322 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -8,16 +8,17 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - //"github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" - //"github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/contract" ) // Contract access locks var rocketMinipoolManagerLock sync.Mutex +var rocketMinipoolStatusLock sync.Mutex // Minipool details @@ -299,10 +300,43 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } +// Submit a minipool exited event +func SubmitMinipoolExited(rp *rocketpool.RocketPool, minipoolAddress common.Address, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolExited", minipoolAddress, big.NewInt(epoch)) + if err != nil { + return nil, fmt.Errorf("Could not submit minipool exited event: %w", err) + } + return txReceipt, nil +} + + +// Submit a minipool withdrawable event +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, withdrawalBalance *big.Int, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, withdrawalBalance, big.NewInt(epoch)) + if err != nil { + return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) + } + return txReceipt, nil +} + + // Get contracts func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() return rp.GetContract("rocketMinipoolManager") } +func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketMinipoolStatusLock.Lock() + defer rocketMinipoolStatusLock.Unlock() + return rp.GetContract("rocketMinipoolStatus") +} From eace8ab2c29793c45597746c6270c5f1c17a8bc9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 13:49:40 +1000 Subject: [PATCH 030/878] implementing minipool module --- minipool/minipool.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 992a60322..f18eddcbb 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -18,6 +18,7 @@ import ( // Contract access locks var rocketMinipoolManagerLock sync.Mutex +var rocketMinipoolQueueLock sync.Mutex var rocketMinipoolStatusLock sync.Mutex @@ -300,6 +301,34 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } +// Get the total length of the minipool queue +func GetQueueTotalLength(rp *rocketpool.RocketPool) (int64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(nil, length, "getTotalLength"); err != nil { + return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) + } + return (*length).Int64(), nil +} + + +// Get the total capacity of the minipool queue +func GetQueueTotalCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(nil, capacity, "getTotalCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + } + return *capacity, nil +} + + // Submit a minipool exited event func SubmitMinipoolExited(rp *rocketpool.RocketPool, minipoolAddress common.Address, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) @@ -334,6 +363,11 @@ func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, e defer rocketMinipoolManagerLock.Unlock() return rp.GetContract("rocketMinipoolManager") } +func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketMinipoolQueueLock.Lock() + defer rocketMinipoolQueueLock.Unlock() + return rp.GetContract("rocketMinipoolQueue") +} func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolStatusLock.Lock() defer rocketMinipoolStatusLock.Unlock() From 89180105592ca18d3eb4c09182a9b5553d185890 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 14:35:48 +1000 Subject: [PATCH 031/878] implementing minipool module --- minipool/minipool-contract.go | 114 ++++++++++++++++++++++++++++++++++ minipool/types.go | 30 +++++++++ 2 files changed, 144 insertions(+) create mode 100644 minipool/minipool-contract.go create mode 100644 minipool/types.go diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go new file mode 100644 index 000000000..f38838b23 --- /dev/null +++ b/minipool/minipool-contract.go @@ -0,0 +1,114 @@ +package minipool + +import ( + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Contract access locks +var rocketMinipoolLock sync.Mutex + + +// Minipool contract +type Minipool struct { + Address common.Address + Contract *bind.BoundContract + rp *rocketpool.RocketPool +} + + +// Create new minipool contract +func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, error) { + + // Get contract + contract, err := getMinipoolContract(rp, address) + if err != nil { + return nil, err + } + + // Create and return + return &Minipool{ + Address: address, + Contract: contract, + rp: rp, + }, nil +} + + +// Get status details +func (mp *Minipool) GetStatus() (MinipoolStatus, error) { + return 0, nil +} +func (mp *Minipool) GetStatusBlock() (int64, error) { + return 0, nil +} +func (mp *Minipool) GetStatusTime() (time.Time, error) { + return time.Time{}, nil +} + + +// Get deposit type +func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { + return 0, nil +} + + +// Get node details +func (mp *Minipool) GetNodeAddress() (common.Address, error) { + return common.Address{}, nil +} +func (mp *Minipool) GetNodeFee() (float64, error) { + return 0, nil +} +func (mp *Minipool) GetNodeDepositBalance() (*big.Int, error) { + return nil, nil +} +func (mp *Minipool) GetNodeRefundBalance() (*big.Int, error) { + return nil, nil +} +func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { + return false, nil +} + + +// Get user deposit details +func (mp *Minipool) GetUserDepositBalance() (*big.Int, error) { + return nil, nil +} +func (mp *Minipool) GetUserDepositAssigned() (bool, error) { + return false, nil +} + + +// Get staking details +func (mp *Minipool) GetStakingStartBalance() (*big.Int, error) { + return nil, nil +} +func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { + return nil, nil +} +func (mp *Minipool) GetStakingStartBlock() (int64, error) { + return 0, nil +} +func (mp *Minipool) GetStakingUserStartBlock() (int64, error) { + return 0, nil +} +func (mp *Minipool) GetStakingEndBlock() (int64, error) { + return 0, nil +} + + +// Get a minipool contract +func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*bind.BoundContract, error) { + rocketMinipoolLock.Lock() + defer rocketMinipoolLock.Unlock() + return rp.MakeContract("rocketMinipool", minipoolAddress) +} + diff --git a/minipool/types.go b/minipool/types.go new file mode 100644 index 000000000..206518e29 --- /dev/null +++ b/minipool/types.go @@ -0,0 +1,30 @@ +package minipool + + +// Minipool statuses +type MinipoolStatus int +const ( + Initialized MinipoolStatus = iota + Prelaunch + Staking + Exited + Withdrawable + Dissolved +) +func (s MinipoolStatus) String() string { + return []string{"Initialized", "Prelaunch", "Staking", "Exited", "Withdrawable", "Dissolved"}[s] +} + + +// Minipool deposit types +type MinipoolDeposit int +const ( + None MinipoolDeposit = iota + Full + Half + Empty +) +func (d MinipoolDeposit) String() string { + return []string{"None", "Full", "Half", "Empty"}[d] +} + From 92f6fcb4397eb6e20292a383cfe96572576cd48a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 14:52:51 +1000 Subject: [PATCH 032/878] implementing minipool module --- minipool/minipool-contract.go | 26 +++++++++++++++++++++++--- minipool/types.go | 4 ++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index f38838b23..a53e4a154 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,6 +1,7 @@ package minipool import ( + "fmt" "math/big" "sync" "time" @@ -16,6 +17,13 @@ import ( var rocketMinipoolLock sync.Mutex +// Minipool detail types +type StatusDetails struct {} +type NodeDetails struct {} +type UserDetails struct {} +type StakingDetails struct {} + + // Minipool contract type Minipool struct { Address common.Address @@ -44,13 +52,25 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, // Get status details func (mp *Minipool) GetStatus() (MinipoolStatus, error) { - return 0, nil + status := new(uint8) + if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { + return MinipoolStatus(0), fmt.Errorf("Could not get minipool %v status: %w", mp.Address.Hex(), err) + } + return MinipoolStatus(*status), nil } func (mp *Minipool) GetStatusBlock() (int64, error) { - return 0, nil + statusBlock := new(*big.Int) + if err := mp.Contract.Call(nil, statusBlock, "getStatusBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %v status changed block: %w", mp.Address.Hex(), err) + } + return (*statusBlock).Int64(), nil } func (mp *Minipool) GetStatusTime() (time.Time, error) { - return time.Time{}, nil + statusTime := new(*big.Int) + if err := mp.Contract.Call(nil, statusTime, "getStatusTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %v status changed time: %w", mp.Address.Hex(), err) + } + return time.Unix((*statusTime).Int64(), 0), nil } diff --git a/minipool/types.go b/minipool/types.go index 206518e29..d18045b06 100644 --- a/minipool/types.go +++ b/minipool/types.go @@ -2,7 +2,7 @@ package minipool // Minipool statuses -type MinipoolStatus int +type MinipoolStatus uint8 const ( Initialized MinipoolStatus = iota Prelaunch @@ -17,7 +17,7 @@ func (s MinipoolStatus) String() string { // Minipool deposit types -type MinipoolDeposit int +type MinipoolDeposit uint8 const ( None MinipoolDeposit = iota Full From 452c543c15985652ff8443b4ffe9673fd1624f7f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 15:06:00 +1000 Subject: [PATCH 033/878] implementing minipool module --- minipool/minipool-contract.go | 37 +++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index a53e4a154..9a69a6281 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -76,25 +77,49 @@ func (mp *Minipool) GetStatusTime() (time.Time, error) { // Get deposit type func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { - return 0, nil + depositType := new(uint8) + if err := mp.Contract.Call(nil, depositType, "getDepositType"); err != nil { + return MinipoolDeposit(0), fmt.Errorf("Could not get minipool %v deposit type: %w", mp.Address.Hex(), err) + } + return MinipoolDeposit(*depositType), nil } // Get node details func (mp *Minipool) GetNodeAddress() (common.Address, error) { - return common.Address{}, nil + nodeAddress := new(common.Address) + if err := mp.Contract.Call(nil, nodeAddress, "getNodeAddress"); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %v node address: %w", mp.Address.Hex(), err) + } + return *nodeAddress, nil } func (mp *Minipool) GetNodeFee() (float64, error) { - return 0, nil + nodeFee := new(*big.Int) + if err := mp.Contract.Call(nil, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get minipool %v node fee: %w", mp.Address.Hex(), err) + } + return eth.WeiToEth(*nodeFee), nil } func (mp *Minipool) GetNodeDepositBalance() (*big.Int, error) { - return nil, nil + nodeDepositBalance := new(*big.Int) + if err := mp.Contract.Call(nil, nodeDepositBalance, "getNodeDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %v node deposit balance: %w", mp.Address.Hex(), err) + } + return *nodeDepositBalance, nil } func (mp *Minipool) GetNodeRefundBalance() (*big.Int, error) { - return nil, nil + nodeRefundBalance := new(*big.Int) + if err := mp.Contract.Call(nil, nodeRefundBalance, "getNodeRefundBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %v node refund balance: %w", mp.Address.Hex(), err) + } + return *nodeRefundBalance, nil } func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { - return false, nil + nodeDepositAssigned := new(bool) + if err := mp.Contract.Call(nil, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %v node deposit assigned status: %w", mp.Address.Hex(), err) + } + return *nodeDepositAssigned, nil } From 71a0194b92d7e2e9c026d202fd8eb6c9924b5555 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 9 Jul 2020 15:11:23 +1000 Subject: [PATCH 034/878] implementing minipool module --- minipool/minipool-contract.go | 42 +++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 9a69a6281..cc7be9ff6 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -125,28 +125,56 @@ func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { // Get user deposit details func (mp *Minipool) GetUserDepositBalance() (*big.Int, error) { - return nil, nil + userDepositBalance := new(*big.Int) + if err := mp.Contract.Call(nil, userDepositBalance, "getUserDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %v user deposit balance: %w", mp.Address.Hex(), err) + } + return *userDepositBalance, nil } func (mp *Minipool) GetUserDepositAssigned() (bool, error) { - return false, nil + userDepositAssigned := new(bool) + if err := mp.Contract.Call(nil, userDepositAssigned, "getUserDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %v user deposit assigned status: %w", mp.Address.Hex(), err) + } + return *userDepositAssigned, nil } // Get staking details func (mp *Minipool) GetStakingStartBalance() (*big.Int, error) { - return nil, nil + stakingStartBalance := new(*big.Int) + if err := mp.Contract.Call(nil, stakingStartBalance, "getStakingStartBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %v staking start balance: %w", mp.Address.Hex(), err) + } + return *stakingStartBalance, nil } func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { - return nil, nil + stakingEndBalance := new(*big.Int) + if err := mp.Contract.Call(nil, stakingEndBalance, "getStakingEndBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %v staking end balance: %w", mp.Address.Hex(), err) + } + return *stakingEndBalance, nil } func (mp *Minipool) GetStakingStartBlock() (int64, error) { - return 0, nil + stakingStartBlock := new(*big.Int) + if err := mp.Contract.Call(nil, stakingStartBlock, "getStakingStartBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %v staking start block: %w", mp.Address.Hex(), err) + } + return (*stakingStartBlock).Int64(), nil } func (mp *Minipool) GetStakingUserStartBlock() (int64, error) { - return 0, nil + stakingUserStartBlock := new(*big.Int) + if err := mp.Contract.Call(nil, stakingUserStartBlock, "getStakingUserStartBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %v staking user start block: %w", mp.Address.Hex(), err) + } + return (*stakingUserStartBlock).Int64(), nil } func (mp *Minipool) GetStakingEndBlock() (int64, error) { - return 0, nil + stakingEndBlock := new(*big.Int) + if err := mp.Contract.Call(nil, stakingEndBlock, "getStakingEndBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %v staking end block: %w", mp.Address.Hex(), err) + } + return (*stakingEndBlock).Int64(), nil } From df38ddcb15eadcc5da0d10678ea9a2db2af41dcc Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 09:35:37 +1000 Subject: [PATCH 035/878] minor style fixes --- rocketpool/rocketpool.go | 8 ++++---- utils/eth/units.go | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 26437aaf4..5f84447bf 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -20,7 +20,7 @@ import ( // Cache settings -const CACHE_TTL = 300 // 5 minutes +const CacheTTL = 300 // 5 minutes // Cached data types @@ -77,7 +77,7 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Check for cached address if cached, ok := rp.getCachedAddress(contractName); ok { - if (time.Now().Unix() - cached.time <= CACHE_TTL) { + if (time.Now().Unix() - cached.time <= CacheTTL) { return cached.address, nil } else { rp.deleteCachedAddress(contractName) @@ -132,7 +132,7 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Check for cached ABI if cached, ok := rp.getCachedABI(contractName); ok { - if (time.Now().Unix() - cached.time <= CACHE_TTL) { + if (time.Now().Unix() - cached.time <= CacheTTL) { return cached.abi, nil } else { rp.deleteCachedABI(contractName) @@ -193,7 +193,7 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err // Check for cached contract if cached, ok := rp.getCachedContract(contractName); ok { - if (time.Now().Unix() - cached.time <= CACHE_TTL) { + if (time.Now().Unix() - cached.time <= CacheTTL) { return cached.contract, nil } else { rp.deleteCachedContract(contractName) diff --git a/utils/eth/units.go b/utils/eth/units.go index ce2aaa218..53c3f603d 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -6,8 +6,8 @@ import ( // Conversion factors -const WEI_PER_ETH float64 = 1e18 -const WEI_PER_GWEI float64 = 1e9 +const WeiPerEth float64 = 1e18 +const WeiPerGwei float64 = 1e9 // Convert wei to eth @@ -15,7 +15,7 @@ func WeiToEth(wei *big.Int) float64 { var weiFloat big.Float var eth big.Float weiFloat.SetInt(wei) - eth.Quo(&weiFloat, big.NewFloat(WEI_PER_ETH)) + eth.Quo(&weiFloat, big.NewFloat(WeiPerEth)) eth64, _ := eth.Float64() return eth64 } @@ -25,7 +25,7 @@ func WeiToEth(wei *big.Int) float64 { func EthToWei(eth float64) *big.Int { var weiFloat big.Float var wei big.Int - weiFloat.Mul(big.NewFloat(eth), big.NewFloat(WEI_PER_ETH)) + weiFloat.Mul(big.NewFloat(eth), big.NewFloat(WeiPerEth)) weiFloat.Int(&wei) return &wei } @@ -36,7 +36,7 @@ func WeiToGwei(wei *big.Int) float64 { var weiFloat big.Float var gwei big.Float weiFloat.SetInt(wei) - gwei.Quo(&weiFloat, big.NewFloat(WEI_PER_GWEI)) + gwei.Quo(&weiFloat, big.NewFloat(WeiPerGwei)) gwei64, _ := gwei.Float64() return gwei64 } @@ -46,7 +46,7 @@ func WeiToGwei(wei *big.Int) float64 { func GweiToWei(gwei float64) *big.Int { var weiFloat big.Float var wei big.Int - weiFloat.Mul(big.NewFloat(gwei), big.NewFloat(WEI_PER_GWEI)) + weiFloat.Mul(big.NewFloat(gwei), big.NewFloat(WeiPerGwei)) weiFloat.Int(&wei) return &wei } From af31e1f0ffa3e018fd86e2a8d874686f9bf9d073 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 09:47:39 +1000 Subject: [PATCH 036/878] minor cleanup --- minipool/minipool.go | 64 +++++++++++++++++----------------------- node/node.go | 32 +++++++++----------- rocketpool/rocketpool.go | 20 ++++++------- 3 files changed, 50 insertions(+), 66 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index f18eddcbb..d56477d42 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -105,54 +105,44 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr // Get a minipool's details func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*MinipoolDetails, error) { - // Minipool data + // Data var wg errgroup.Group - var minipoolExists bool - var minipoolPubkey []byte - var minipoolWithdrawalTotalBalance *big.Int - var minipoolWithdrawalNodeBalance *big.Int - var minipoolWithdrawable bool - var minipoolWithdrawalProcessed bool - - // Get exists status + var exists bool + var pubkey []byte + var withdrawalTotalBalance *big.Int + var withdrawalNodeBalance *big.Int + var withdrawable bool + var withdrawalProcessed bool + + // Load data wg.Go(func() error { - exists, err := GetMinipoolExists(rp, minipoolAddress) - if err == nil { minipoolExists = exists } + var err error + exists, err = GetMinipoolExists(rp, minipoolAddress) return err }) - - // Get pubkey wg.Go(func() error { - pubkey, err := GetMinipoolPubkey(rp, minipoolAddress) - if err == nil { minipoolPubkey = pubkey } + var err error + pubkey, err = GetMinipoolPubkey(rp, minipoolAddress) return err }) - - // Get withdrawal total balance wg.Go(func() error { - withdrawalTotalBalance, err := GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress) - if err == nil { minipoolWithdrawalTotalBalance = withdrawalTotalBalance } + var err error + withdrawalTotalBalance, err = GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress) return err }) - - // Get withdrawal node balance wg.Go(func() error { - withdrawalNodeBalance, err := GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress) - if err == nil { minipoolWithdrawalNodeBalance = withdrawalNodeBalance } + var err error + withdrawalNodeBalance, err = GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress) return err }) - - // Get withdrawable status wg.Go(func() error { - withdrawable, err := GetMinipoolWithdrawable(rp, minipoolAddress) - if err == nil { minipoolWithdrawable = withdrawable } + var err error + withdrawable, err = GetMinipoolWithdrawable(rp, minipoolAddress) return err }) - - // Get withdrawal processed status wg.Go(func() error { - withdrawalProcessed, err := GetMinipoolWithdrawalProcessed(rp, minipoolAddress) - if err == nil { minipoolWithdrawalProcessed = withdrawalProcessed } + var err error + withdrawalProcessed, err = GetMinipoolWithdrawalProcessed(rp, minipoolAddress) return err }) @@ -164,12 +154,12 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Return return &MinipoolDetails{ Address: minipoolAddress, - Exists: minipoolExists, - Pubkey: minipoolPubkey, - WithdrawalTotalBalance: minipoolWithdrawalTotalBalance, - WithdrawalNodeBalance: minipoolWithdrawalNodeBalance, - Withdrawable: minipoolWithdrawable, - WithdrawalProcessed: minipoolWithdrawalProcessed, + Exists: exists, + Pubkey: pubkey, + WithdrawalTotalBalance: withdrawalTotalBalance, + WithdrawalNodeBalance: withdrawalNodeBalance, + Withdrawable: withdrawable, + WithdrawalProcessed: withdrawalProcessed, }, nil } diff --git a/node/node.go b/node/node.go index ffb005889..3b3afd095 100644 --- a/node/node.go +++ b/node/node.go @@ -31,30 +31,26 @@ type NodeDetails struct { // Get a node's details func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDetails, error) { - // Node data + // Data var wg errgroup.Group - var nodeExists bool - var nodeTrusted bool - var nodeTimezoneLocation string + var exists bool + var trusted bool + var timezoneLocation string - // Get exists status + // Load data wg.Go(func() error { - exists, err := GetNodeExists(rp, nodeAddress) - if err == nil { nodeExists = exists } + var err error + exists, err = GetNodeExists(rp, nodeAddress) return err }) - - // Get trusted status wg.Go(func() error { - trusted, err := GetNodeTrusted(rp, nodeAddress) - if err == nil { nodeTrusted = trusted } + var err error + trusted, err = GetNodeTrusted(rp, nodeAddress) return err }) - - // Get timezone location wg.Go(func() error { - timezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAddress) - if err == nil { nodeTimezoneLocation = timezoneLocation } + var err error + timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress) return err }) @@ -65,9 +61,9 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*Nod // Return return &NodeDetails{ - Exists: nodeExists, - Trusted: nodeTrusted, - TimezoneLocation: nodeTimezoneLocation, + Exists: exists, + Trusted: trusted, + TimezoneLocation: timezoneLocation, }, nil } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 5f84447bf..5ac291d1b 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -200,22 +200,20 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err } } - // Contract data + // Data var wg errgroup.Group - var contractAddress *common.Address - var contractAbi *abi.ABI + var address *common.Address + var abi *abi.ABI - // Load address + // Load data wg.Go(func() error { - address, err := rp.GetAddress(contractName) - if err == nil { contractAddress = address } + var err error + address, err = rp.GetAddress(contractName) return err }) - - // Load ABI wg.Go(func() error { - abi, err := rp.GetABI(contractName) - if err == nil { contractAbi = abi } + var err error + abi, err = rp.GetABI(contractName) return err }) @@ -225,7 +223,7 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err } // Create contract - contract := bind.NewBoundContract(*contractAddress, *contractAbi, rp.Client, rp.Client, rp.Client) + contract := bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client) // Cache contract rp.setCachedContract(contractName, cachedContract{ From 329d86191a95eb481977375f2fe5297587261e09 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 09:51:13 +1000 Subject: [PATCH 037/878] implementing minipool module --- minipool/minipool-contract.go | 66 ++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index cc7be9ff6..17dfecfad 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -19,10 +20,29 @@ var rocketMinipoolLock sync.Mutex // Minipool detail types -type StatusDetails struct {} -type NodeDetails struct {} -type UserDetails struct {} -type StakingDetails struct {} +type StatusDetails struct { + Status MinipoolStatus + StatusBlock int64 + StatusTime time.Time +} +type NodeDetails struct { + Address common.Address + Fee float64 + DepositBalance *big.Int + RefundBalance *big.Int + DepositAssigned bool +} +type UserDetails struct { + DepositBalance *big.Int + DepositAssigned bool +} +type StakingDetails struct { + StartBalance *big.Int + EndBalance *big.Int + StartBlock int64 + UserStartBlock int64 + EndBlock int64 +} // Minipool contract @@ -52,6 +72,44 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, // Get status details +func (mp *Minipool) GetStatusDetails() (*StatusDetails, error) { + + // Data + var wg errgroup.Group + var status MinipoolStatus + var statusBlock int64 + var statusTime time.Time + + // Load data + wg.Go(func() error { + var err error + status, err = mp.GetStatus() + return err + }) + wg.Go(func() error { + var err error + statusBlock, err = mp.GetStatusBlock() + return err + }) + wg.Go(func() error { + var err error + statusTime, err = mp.GetStatusTime() + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &StatusDetails{ + Status: status, + StatusBlock: statusBlock, + StatusTime: statusTime, + }, nil + +} func (mp *Minipool) GetStatus() (MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { From 9cc0c2faa895d9cc5b950f7f3f078b5adedd0083 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 09:59:19 +1000 Subject: [PATCH 038/878] implementing minipool module --- minipool/minipool-contract.go | 135 ++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 17dfecfad..de3652bef 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -144,6 +144,58 @@ func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { // Get node details +func (mp *Minipool) GetNodeDetails() (*NodeDetails, error) { + + // Data + var wg errgroup.Group + var address common.Address + var fee float64 + var depositBalance *big.Int + var refundBalance *big.Int + var depositAssigned bool + + // Load data + wg.Go(func() error { + var err error + address, err = mp.GetNodeAddress() + return err + }) + wg.Go(func() error { + var err error + fee, err = mp.GetNodeFee() + return err + }) + wg.Go(func() error { + var err error + depositBalance, err = mp.GetNodeDepositBalance() + return err + }) + wg.Go(func() error { + var err error + refundBalance, err = mp.GetNodeRefundBalance() + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetNodeDepositAssigned() + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &NodeDetails{ + Address: address, + Fee: fee, + DepositBalance: depositBalance, + RefundBalance: refundBalance, + DepositAssigned: depositAssigned, + }, nil + +} func (mp *Minipool) GetNodeAddress() (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(nil, nodeAddress, "getNodeAddress"); err != nil { @@ -182,6 +234,37 @@ func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { // Get user deposit details +func (mp *Minipool) GetUserDetails() (*UserDetails, error) { + + // Data + var wg errgroup.Group + var depositBalance *big.Int + var depositAssigned bool + + // Load data + wg.Go(func() error { + var err error + depositBalance, err = mp.GetUserDepositBalance() + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetUserDepositAssigned() + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &UserDetails{ + DepositBalance: depositBalance, + DepositAssigned: depositAssigned, + }, nil + +} func (mp *Minipool) GetUserDepositBalance() (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(nil, userDepositBalance, "getUserDepositBalance"); err != nil { @@ -199,6 +282,58 @@ func (mp *Minipool) GetUserDepositAssigned() (bool, error) { // Get staking details +func (mp *Minipool) GetStakingDetails() (*StakingDetails, error) { + + // Data + var wg errgroup.Group + var startBalance *big.Int + var endBalance *big.Int + var startBlock int64 + var userStartBlock int64 + var endBlock int64 + + // Load data + wg.Go(func() error { + var err error + startBalance, err = mp.GetStakingStartBalance() + return err + }) + wg.Go(func() error { + var err error + endBalance, err = mp.GetStakingEndBalance() + return err + }) + wg.Go(func() error { + var err error + startBlock, err = mp.GetStakingStartBlock() + return err + }) + wg.Go(func() error { + var err error + userStartBlock, err = mp.GetStakingUserStartBlock() + return err + }) + wg.Go(func() error { + var err error + endBlock, err = mp.GetStakingEndBlock() + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &StakingDetails{ + StartBalance: startBalance, + EndBalance: endBalance, + StartBlock: startBlock, + UserStartBlock: userStartBlock, + EndBlock: endBlock, + }, nil + +} func (mp *Minipool) GetStakingStartBalance() (*big.Int, error) { stakingStartBalance := new(*big.Int) if err := mp.Contract.Call(nil, stakingStartBalance, "getStakingStartBalance"); err != nil { From 0020f9be011817de07ed8a483c46a97b75b34190 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 10:17:53 +1000 Subject: [PATCH 039/878] minor cleanup --- minipool/minipool.go | 9 +++------ node/node.go | 7 ++----- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index d56477d42..e33ee589d 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -16,12 +16,6 @@ import ( ) -// Contract access locks -var rocketMinipoolManagerLock sync.Mutex -var rocketMinipoolQueueLock sync.Mutex -var rocketMinipoolStatusLock sync.Mutex - - // Minipool details type MinipoolDetails struct { Address common.Address @@ -348,16 +342,19 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo // Get contracts +var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() return rp.GetContract("rocketMinipoolManager") } +var rocketMinipoolQueueLock sync.Mutex func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolQueueLock.Lock() defer rocketMinipoolQueueLock.Unlock() return rp.GetContract("rocketMinipoolQueue") } +var rocketMinipoolStatusLock sync.Mutex func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketMinipoolStatusLock.Lock() defer rocketMinipoolStatusLock.Unlock() diff --git a/node/node.go b/node/node.go index 3b3afd095..7c68f30de 100644 --- a/node/node.go +++ b/node/node.go @@ -15,11 +15,6 @@ import ( ) -// Contract access locks -var rocketNodeManagerLock sync.Mutex -var rocketNodeDepositLock sync.Mutex - - // Node details type NodeDetails struct { Exists bool @@ -154,11 +149,13 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.Trans // Get contracts +var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketNodeManagerLock.Lock() defer rocketNodeManagerLock.Unlock() return rp.GetContract("rocketNodeManager") } +var rocketNodeDepositLock sync.Mutex func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketNodeDepositLock.Lock() defer rocketNodeDepositLock.Unlock() From 8630eb2fad1d1291a98e758c6a12f76ec216ddb2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 10:32:46 +1000 Subject: [PATCH 040/878] implementing minipool module --- minipool/minipool-contract.go | 61 +++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index de3652bef..35ef2d9c3 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -8,17 +8,15 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Contract access locks -var rocketMinipoolLock sync.Mutex - - // Minipool detail types type StatusDetails struct { Status MinipoolStatus @@ -49,7 +47,7 @@ type StakingDetails struct { type Minipool struct { Address common.Address Contract *bind.BoundContract - rp *rocketpool.RocketPool + RocketPool *rocketpool.RocketPool } @@ -66,7 +64,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, return &Minipool{ Address: address, Contract: contract, - rp: rp, + RocketPool: rp, }, nil } @@ -371,7 +369,58 @@ func (mp *Minipool) GetStakingEndBlock() (int64, error) { } +// Refund node ETH from the minipool +func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "refund") + if err != nil { + return nil, fmt.Errorf("Could not refund from minipool %v: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + +// Progress the prelaunch minipool to staking +func (mp *Minipool) Stake(validatorPubkey [48]byte, validatorSignature [96]byte, depositDataRoot [32]byte, opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) + if err != nil { + return nil, fmt.Errorf("Could not stake minipool %v: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + +// Withdraw node balances & rewards from the withdrawable minipool and close it +func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "withdraw") + if err != nil { + return nil, fmt.Errorf("Could not withdraw from minipool %v: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + +// Dissolve the initialized or prelaunch minipool +func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "dissolve") + if err != nil { + return nil, fmt.Errorf("Could not dissolve minipool %v: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + +// Withdraw node balances from the dissolved minipool and close it +func (mp *Minipool) Close(opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "close") + if err != nil { + return nil, fmt.Errorf("Could not close minipool %v: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + // Get a minipool contract +var rocketMinipoolLock sync.Mutex func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*bind.BoundContract, error) { rocketMinipoolLock.Lock() defer rocketMinipoolLock.Unlock() From cb3800189c22f353713541d7af0e8a2e83a54f39 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 11:21:48 +1000 Subject: [PATCH 041/878] implemented deposit module --- deposit/deposit.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 deposit/deposit.go diff --git a/deposit/deposit.go b/deposit/deposit.go new file mode 100644 index 000000000..1b0e25efe --- /dev/null +++ b/deposit/deposit.go @@ -0,0 +1,51 @@ +package deposit + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Get the deposit pool balance +func GetBalance(rp *rocketpool.RocketPool) (*big.Int, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketDepositPool.Call(nil, balance, "getBalance"); err != nil { + return nil, fmt.Errorf("Could not get deposit pool balance: %w", err) + } + return *balance, nil +} + + +// Assign deposits +func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketDepositPool, opts, "assignDeposits") + if err != nil { + return nil, fmt.Errorf("Could not assign deposits: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketDepositPoolLock sync.Mutex +func getRocketDepositPool(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketDepositPoolLock.Lock() + defer rocketDepositPoolLock.Unlock() + return rp.GetContract("rocketDepositPool") +} + From d43a4e177530ef97f92df8db35094eef77752480 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 11:59:31 +1000 Subject: [PATCH 042/878] implementing network module --- network/network.go | 107 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 network/network.go diff --git a/network/network.go b/network/network.go new file mode 100644 index 000000000..586192256 --- /dev/null +++ b/network/network.go @@ -0,0 +1,107 @@ +package network + +import ( + "encoding/hex" + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Get the current network node commission rate +func GetNodeFee(rp *rocketpool.RocketPool) (float64, error) { + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return 0, err + } + nodeFee := new(*big.Int) + if err := rocketNetworkFees.Call(nil, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get network node fee: %w", err) + } + return eth.WeiToEth(*nodeFee), nil +} + + +// Get the withdrawal pool balance +func GetWithdrawalBalance(rp *rocketpool.RocketPool) (*big.Int, error) { + rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketNetworkWithdrawal.Call(nil, balance, "getBalance"); err != nil { + return nil, fmt.Errorf("Could not get withdrawal pool balance: %w", err) + } + return *balance, nil +} + + +// Get the current network validator withdrawal credentials +func GetWithdrawalCredentials(rp *rocketpool.RocketPool) ([32]byte, error) { + rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) + if err != nil { + return [32]byte{}, err + } + withdrawalCredentials := new([32]byte) + if err := rocketNetworkWithdrawal.Call(nil, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { + return [32]byte{}, fmt.Errorf("Could not get network withdrawal credentials: %w", err) + } + return *withdrawalCredentials, nil +} + + +// Submit network ETH balances for an epoch +func SubmitETHBalances(rp *rocketpool.RocketPool, epoch int64, total *big.Int, staking *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitETHBalances", big.NewInt(epoch), total, staking) + if err != nil { + return nil, fmt.Errorf("Could not submit network ETH balances: %w", err) + } + return txReceipt, nil +} + + +// Process a validator withdrawal from the beacon chain +func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey []byte, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey) + if err != nil { + return nil, fmt.Errorf("Could not process validator %v withdrawal: %w", hex.EncodeToString(validatorPubkey), err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNetworkBalancesLock sync.Mutex +func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances") +} +var rocketNetworkFeesLock sync.Mutex +func getRocketNetworkFees(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkFeesLock.Lock() + defer rocketNetworkFeesLock.Unlock() + return rp.GetContract("rocketNetworkFees") +} +var rocketNetworkWithdrawalLock sync.Mutex +func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkWithdrawalLock.Lock() + defer rocketNetworkWithdrawalLock.Unlock() + return rp.GetContract("rocketNetworkWithdrawal") +} + From 5dacc103f5cb47ebe409569d3415cb13020f30ff Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 14:43:11 +1000 Subject: [PATCH 043/878] implemented tokens module --- tokens/neth.go | 58 +++++++++++++++++++++++++++++++++++ tokens/tokens.go | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 tokens/neth.go create mode 100644 tokens/tokens.go diff --git a/tokens/neth.go b/tokens/neth.go new file mode 100644 index 000000000..c27cb14da --- /dev/null +++ b/tokens/neth.go @@ -0,0 +1,58 @@ +package tokens + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Get nETH balance +func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address) (*big.Int, error) { + rocketNodeETHToken, err := getRocketNodeETHToken(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketNodeETHToken, "nETH", address) +} + + +// Transfer nETH +func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeETHToken, err := getRocketNodeETHToken(rp) + if err != nil { + return nil, err + } + return transfer(rp.Client, rocketNodeETHToken, "nETH", to, amount, opts) +} + + +// Burn nETH for ETH +func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeETHToken, err := getRocketNodeETHToken(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNodeETHToken, opts, "burn", amount) + if err != nil { + return nil, fmt.Errorf("Could not burn nETH: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNodeETHTokenLock sync.Mutex +func getRocketNodeETHToken(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNodeETHTokenLock.Lock() + defer rocketNodeETHTokenLock.Unlock() + return rp.GetContract("rocketNodeETHToken") +} + diff --git a/tokens/tokens.go b/tokens/tokens.go new file mode 100644 index 000000000..8fe970602 --- /dev/null +++ b/tokens/tokens.go @@ -0,0 +1,78 @@ +package tokens + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Token balances +type Balances struct { + ETH *big.Int + NETH *big.Int +} + + +// Get token balances of an address +func GetBalances(rp *rocketpool.RocketPool, address common.Address) (*Balances, error) { + + // Data + var wg errgroup.Group + var ethBalance *big.Int + var nethBalance *big.Int + + // Load data + wg.Go(func() error { + var err error + ethBalance, err = rp.Client.BalanceAt(context.Background(), address, nil) + return err + }) + wg.Go(func() error { + var err error + nethBalance, err = GetNETHBalance(rp, address) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Return + return &Balances{ + ETH: ethBalance, + NETH: nethBalance, + }, nil + +} + + +// Get a token balance +func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address) (*big.Int, error) { + balance := new(*big.Int) + if err := tokenContract.Call(nil, balance, "balanceOf", address); err != nil { + return nil, fmt.Errorf("Could not get %v balance of %v: %w", tokenName, address.Hex(), err) + } + return *balance, nil +} + + +// Transfer tokens to an address +func transfer(client *ethclient.Client, tokenContract *bind.BoundContract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := contract.Transact(client, tokenContract, opts, "transfer", to, amount) + if err != nil { + return nil, fmt.Errorf("Could not transfer %v to %v: %w", tokenName, to.Hex(), err) + } + return txReceipt, nil +} + From 7d4e80fb23b94c97791898e3ce3b4d10a7253f89 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 15:14:07 +1000 Subject: [PATCH 044/878] implementing settings module --- settings/deposit.go | 49 ++++++++++++++++++++++++++++++++++++++ settings/minipool.go | 56 ++++++++++++++++++++++++++++++++++++++++++++ settings/network.go | 46 ++++++++++++++++++++++++++++++++++++ settings/node.go | 30 ++++++++++++++++++++++++ 4 files changed, 181 insertions(+) create mode 100644 settings/deposit.go create mode 100644 settings/minipool.go create mode 100644 settings/network.go create mode 100644 settings/node.go diff --git a/settings/deposit.go b/settings/deposit.go new file mode 100644 index 000000000..cce3336d5 --- /dev/null +++ b/settings/deposit.go @@ -0,0 +1,49 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Deposit assignments currently enabled +func GetAssignDepositsEnabled(rp *rocketpool.RocketPool) (bool, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return false, err + } + assignDepositsEnabled := new(bool) + if err := rocketDepositSettings.Call(nil, assignDepositsEnabled, "getAssignDepositsEnabled"); err != nil { + return false, fmt.Errorf("Could not get deposit assignment enabled status: %w", err) + } + return *assignDepositsEnabled, nil +} + + +// Maximum deposit assignments per transaction +func GetMaximumDepositAssignments(rp *rocketpool.RocketPool) (int64, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return 0, err + } + maximumDepositAssignments := new(*big.Int) + if err := rocketDepositSettings.Call(nil, maximumDepositAssignments, "getMaximumDepositAssignments"); err != nil { + return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) + } + return (*maximumDepositAssignments).Int64(), nil +} + + +// Get contracts +var rocketDepositSettingsLock sync.Mutex +func getRocketDepositSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketDepositSettingsLock.Lock() + defer rocketDepositSettingsLock.Unlock() + return rp.GetContract("rocketDepositSettings") +} + diff --git a/settings/minipool.go b/settings/minipool.go new file mode 100644 index 000000000..766301d98 --- /dev/null +++ b/settings/minipool.go @@ -0,0 +1,56 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { + +} + + +func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { + +} + + +func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { + +} + + +func GetMinipoolSubmitExitedEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool) (int64, error) { + +} + + +func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool) (int64, error) { + +} + + +// Get contracts +var rocketMinipoolSettingsLock sync.Mutex +func getRocketMinipoolSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketMinipoolSettingsLock.Lock() + defer rocketMinipoolSettingsLock.Unlock() + return rp.GetContract("rocketMinipoolSettings") +} + diff --git a/settings/network.go b/settings/network.go new file mode 100644 index 000000000..3efbc2d26 --- /dev/null +++ b/settings/network.go @@ -0,0 +1,46 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +func GetMinimumNodeFee(rp *rocketpool.RocketPool) (float64, error) { + +} + + +func GetTargetNodeFee(rp *rocketpool.RocketPool) (float64, error) { + +} + + +func GetMaximumNodeFee(rp *rocketpool.RocketPool) (float64, error) { + +} + + +// Get contracts +var rocketNetworkSettingsLock sync.Mutex +func getRocketNetworkSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkSettingsLock.Lock() + defer rocketNetworkSettingsLock.Unlock() + return rp.GetContract("rocketNetworkSettings") +} + diff --git a/settings/node.go b/settings/node.go new file mode 100644 index 000000000..ee491f2fc --- /dev/null +++ b/settings/node.go @@ -0,0 +1,30 @@ +package settings + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +func GetNodeDepositEnabled(rp *rocketpool.RocketPool) (bool, error) { + +} + + +// Get contracts +var rocketNodeSettingsLock sync.Mutex +func getRocketNodeSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNodeSettingsLock.Lock() + defer rocketNodeSettingsLock.Unlock() + return rp.GetContract("rocketNodeSettings") +} + From de5042a9a78a862ece63ba8a23243f3e44d12368 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 10 Jul 2020 15:41:12 +1000 Subject: [PATCH 045/878] implementing tokens module --- settings/deposit.go | 2 +- settings/minipool.go | 79 ++++++++++++++++++++++++++++++++++++++------ settings/network.go | 58 +++++++++++++++++++++++++++----- settings/node.go | 22 ++++++++++-- 4 files changed, 138 insertions(+), 23 deletions(-) diff --git a/settings/deposit.go b/settings/deposit.go index cce3336d5..bca4ab6e1 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -19,7 +19,7 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool) (bool, error) { } assignDepositsEnabled := new(bool) if err := rocketDepositSettings.Call(nil, assignDepositsEnabled, "getAssignDepositsEnabled"); err != nil { - return false, fmt.Errorf("Could not get deposit assignment enabled status: %w", err) + return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) } return *assignDepositsEnabled, nil } diff --git a/settings/minipool.go b/settings/minipool.go index 766301d98..833cbd15d 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -11,38 +11,95 @@ import ( ) +// Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + fullDepositNodeAmount := new(*big.Int) + if err := rocketMinipoolSettings.Call(nil, fullDepositNodeAmount, "getFullDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) + } + return *fullDepositNodeAmount, nil } - - func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + halfDepositNodeAmount := new(*big.Int) + if err := rocketMinipoolSettings.Call(nil, halfDepositNodeAmount, "getHalfDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) + } + return *halfDepositNodeAmount, nil } - - func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + emptyDepositNodeAmount := new(*big.Int) + if err := rocketMinipoolSettings.Call(nil, emptyDepositNodeAmount, "getEmptyDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) + } + return *emptyDepositNodeAmount, nil } +// Minipool exited event submissions currently enabled func GetMinipoolSubmitExitedEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return false, err + } + submitExitedEnabled := new(bool) + if err := rocketMinipoolSettings.Call(nil, submitExitedEnabled, "getSubmitExitedEnabled"); err != nil { + return false, fmt.Errorf("Could not get minipool exited submissions enabled status: %w", err) + } + return *submitExitedEnabled, nil } +// Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return false, err + } + submitWithdrawableEnabled := new(bool) + if err := rocketMinipoolSettings.Call(nil, submitWithdrawableEnabled, "getSubmitWithdrawableEnabled"); err != nil { + return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) + } + return *submitWithdrawableEnabled, nil } +// Timeout period in blocks for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool) (int64, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return 0, err + } + launchTimeout := new(*big.Int) + if err := rocketMinipoolSettings.Call(nil, launchTimeout, "getLaunchTimeout"); err != nil { + return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) + } + return (*launchTimeout).Int64(), nil } +// Withdrawal delay in blocks before withdrawable minipools can be closed func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool) (int64, error) { - + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return 0, err + } + withdrawalDelay := new(*big.Int) + if err := rocketMinipoolSettings.Call(nil, withdrawalDelay, "getWithdrawalDelay"); err != nil { + return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) + } + return (*withdrawalDelay).Int64(), nil } diff --git a/settings/network.go b/settings/network.go index 3efbc2d26..419fe25e7 100644 --- a/settings/network.go +++ b/settings/network.go @@ -8,31 +8,71 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return false, err + } + submitBalancesEnabled := new(bool) + if err := rocketNetworkSettings.Call(nil, submitBalancesEnabled, "getSubmitBalancesEnabled"); err != nil { + return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) + } + return *submitBalancesEnabled, nil } +// Processing validator withdrawals currently enabled func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return false, err + } + processWithdrawalsEnabled := new(bool) + if err := rocketNetworkSettings.Call(nil, processWithdrawalsEnabled, "getProcessWithdrawalsEnabled"); err != nil { + return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) + } + return *processWithdrawalsEnabled, nil } +// Node commission rate parameters func GetMinimumNodeFee(rp *rocketpool.RocketPool) (float64, error) { - + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + minimumNodeFee := new(*big.Int) + if err := rocketNetworkSettings.Call(nil, minimumNodeFee, "getMinimumNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get minimum node fee: %w", err) + } + return eth.WeiToEth(*minimumNodeFee), nil } - - func GetTargetNodeFee(rp *rocketpool.RocketPool) (float64, error) { - + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + targetNodeFee := new(*big.Int) + if err := rocketNetworkSettings.Call(nil, targetNodeFee, "getTargetNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get target node fee: %w", err) + } + return eth.WeiToEth(*targetNodeFee), nil } - - func GetMaximumNodeFee(rp *rocketpool.RocketPool) (float64, error) { - + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + maximumNodeFee := new(*big.Int) + if err := rocketNetworkSettings.Call(nil, maximumNodeFee, "getMaximumNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get maximum node fee: %w", err) + } + return eth.WeiToEth(*maximumNodeFee), nil } diff --git a/settings/node.go b/settings/node.go index ee491f2fc..b1fb82b0c 100644 --- a/settings/node.go +++ b/settings/node.go @@ -10,13 +10,31 @@ import ( ) +// Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketNodeSettings, err := getRocketNodeSettings(rp) + if err != nil { + return false, err + } + registrationEnabled := new(bool) + if err := rocketNodeSettings.Call(nil, registrationEnabled, "getRegistrationEnabled"); err != nil { + return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) + } + return *registrationEnabled, nil } +// Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool) (bool, error) { - + rocketNodeSettings, err := getRocketNodeSettings(rp) + if err != nil { + return false, err + } + depositEnabled := new(bool) + if err := rocketNodeSettings.Call(nil, depositEnabled, "getDepositEnabled"); err != nil { + return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) + } + return *depositEnabled, nil } From 9c6bbfb495d5b82051873460dde0d51cc4619b78 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 14 Jul 2020 09:26:35 +1000 Subject: [PATCH 046/878] minor cleanup --- utils/eth/units.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/utils/eth/units.go b/utils/eth/units.go index 53c3f603d..1c831a67f 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -6,8 +6,10 @@ import ( // Conversion factors -const WeiPerEth float64 = 1e18 -const WeiPerGwei float64 = 1e9 +const ( + WeiPerEth float64 = 1e18 + WeiPerGwei float64 = 1e9 +) // Convert wei to eth From 43550635d7dffb54bbde1588058d02fec797b2d2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 14 Jul 2020 09:35:46 +1000 Subject: [PATCH 047/878] type fixes --- minipool/minipool-contract.go | 24 ++++++++++++------------ minipool/minipool.go | 14 +++++++------- node/node.go | 6 +++--- tokens/tokens.go | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 35ef2d9c3..78cb00617 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -70,7 +70,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, // Get status details -func (mp *Minipool) GetStatusDetails() (*StatusDetails, error) { +func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { // Data var wg errgroup.Group @@ -97,11 +97,11 @@ func (mp *Minipool) GetStatusDetails() (*StatusDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return StatusDetails{}, err } // Return - return &StatusDetails{ + return StatusDetails{ Status: status, StatusBlock: statusBlock, StatusTime: statusTime, @@ -142,7 +142,7 @@ func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { // Get node details -func (mp *Minipool) GetNodeDetails() (*NodeDetails, error) { +func (mp *Minipool) GetNodeDetails() (NodeDetails, error) { // Data var wg errgroup.Group @@ -181,11 +181,11 @@ func (mp *Minipool) GetNodeDetails() (*NodeDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return NodeDetails{}, err } // Return - return &NodeDetails{ + return NodeDetails{ Address: address, Fee: fee, DepositBalance: depositBalance, @@ -232,7 +232,7 @@ func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { // Get user deposit details -func (mp *Minipool) GetUserDetails() (*UserDetails, error) { +func (mp *Minipool) GetUserDetails() (UserDetails, error) { // Data var wg errgroup.Group @@ -253,11 +253,11 @@ func (mp *Minipool) GetUserDetails() (*UserDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return UserDetails{}, err } // Return - return &UserDetails{ + return UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, }, nil @@ -280,7 +280,7 @@ func (mp *Minipool) GetUserDepositAssigned() (bool, error) { // Get staking details -func (mp *Minipool) GetStakingDetails() (*StakingDetails, error) { +func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { // Data var wg errgroup.Group @@ -319,11 +319,11 @@ func (mp *Minipool) GetStakingDetails() (*StakingDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return StakingDetails{}, err } // Return - return &StakingDetails{ + return StakingDetails{ StartBalance: startBalance, EndBalance: endBalance, StartBlock: startBlock, diff --git a/minipool/minipool.go b/minipool/minipool.go index e33ee589d..797236015 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -29,17 +29,17 @@ type MinipoolDetails struct { // Get a node's minipool details -func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]*MinipoolDetails, error) { +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]MinipoolDetails, error) { // Get minipool addresses minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress) if err != nil { - return []*MinipoolDetails{}, err + return []MinipoolDetails{}, err } // Data var wg errgroup.Group - details := make([]*MinipoolDetails, len(minipoolAddresses)) + details := make([]MinipoolDetails, len(minipoolAddresses)) // Load details for mi, minipoolAddress := range minipoolAddresses { @@ -53,7 +53,7 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([] // Wait for data if err := wg.Wait(); err != nil { - return []*MinipoolDetails{}, err + return []MinipoolDetails{}, err } // Return @@ -97,7 +97,7 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr // Get a minipool's details -func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*MinipoolDetails, error) { +func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address) (MinipoolDetails, error) { // Data var wg errgroup.Group @@ -142,11 +142,11 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return MinipoolDetails{}, err } // Return - return &MinipoolDetails{ + return MinipoolDetails{ Address: minipoolAddress, Exists: exists, Pubkey: pubkey, diff --git a/node/node.go b/node/node.go index 7c68f30de..e8919454b 100644 --- a/node/node.go +++ b/node/node.go @@ -24,7 +24,7 @@ type NodeDetails struct { // Get a node's details -func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*NodeDetails, error) { +func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (NodeDetails, error) { // Data var wg errgroup.Group @@ -51,11 +51,11 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (*Nod // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return NodeDetails{}, err } // Return - return &NodeDetails{ + return NodeDetails{ Exists: exists, Trusted: trusted, TimezoneLocation: timezoneLocation, diff --git a/tokens/tokens.go b/tokens/tokens.go index 8fe970602..57556ed74 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -24,7 +24,7 @@ type Balances struct { // Get token balances of an address -func GetBalances(rp *rocketpool.RocketPool, address common.Address) (*Balances, error) { +func GetBalances(rp *rocketpool.RocketPool, address common.Address) (Balances, error) { // Data var wg errgroup.Group @@ -45,11 +45,11 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address) (*Balances, // Wait for data if err := wg.Wait(); err != nil { - return nil, err + return Balances{}, err } // Return - return &Balances{ + return Balances{ ETH: ethBalance, NETH: nethBalance, }, nil From 4e3ab8950b662361484a1dc5bf180c92e73f72bb Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 15 Jul 2020 10:50:08 +1000 Subject: [PATCH 048/878] formatting fixes --- minipool/minipool-contract.go | 42 +++++++++++++++++------------------ minipool/minipool.go | 18 +++++++-------- network/network.go | 2 +- node/node.go | 6 ++--- rocketpool/rocketpool.go | 6 ++--- tokens/tokens.go | 4 ++-- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 78cb00617..27a2c7bab 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -111,21 +111,21 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { func (mp *Minipool) GetStatus() (MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { - return MinipoolStatus(0), fmt.Errorf("Could not get minipool %v status: %w", mp.Address.Hex(), err) + return MinipoolStatus(0), fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return MinipoolStatus(*status), nil } func (mp *Minipool) GetStatusBlock() (int64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(nil, statusBlock, "getStatusBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %v status changed block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Int64(), nil } func (mp *Minipool) GetStatusTime() (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(nil, statusTime, "getStatusTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %v status changed time: %w", mp.Address.Hex(), err) + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } @@ -135,7 +135,7 @@ func (mp *Minipool) GetStatusTime() (time.Time, error) { func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(nil, depositType, "getDepositType"); err != nil { - return MinipoolDeposit(0), fmt.Errorf("Could not get minipool %v deposit type: %w", mp.Address.Hex(), err) + return MinipoolDeposit(0), fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) } return MinipoolDeposit(*depositType), nil } @@ -197,35 +197,35 @@ func (mp *Minipool) GetNodeDetails() (NodeDetails, error) { func (mp *Minipool) GetNodeAddress() (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(nil, nodeAddress, "getNodeAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %v node address: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } func (mp *Minipool) GetNodeFee() (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(nil, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minipool %v node fee: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } func (mp *Minipool) GetNodeDepositBalance() (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(nil, nodeDepositBalance, "getNodeDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %v node deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } func (mp *Minipool) GetNodeRefundBalance() (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(nil, nodeRefundBalance, "getNodeRefundBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %v node refund balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(nil, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %v node deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil } @@ -266,14 +266,14 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { func (mp *Minipool) GetUserDepositBalance() (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(nil, userDepositBalance, "getUserDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %v user deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } func (mp *Minipool) GetUserDepositAssigned() (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(nil, userDepositAssigned, "getUserDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %v user deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } @@ -335,35 +335,35 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { func (mp *Minipool) GetStakingStartBalance() (*big.Int, error) { stakingStartBalance := new(*big.Int) if err := mp.Contract.Call(nil, stakingStartBalance, "getStakingStartBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %v staking start balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s staking start balance: %w", mp.Address.Hex(), err) } return *stakingStartBalance, nil } func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { stakingEndBalance := new(*big.Int) if err := mp.Contract.Call(nil, stakingEndBalance, "getStakingEndBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %v staking end balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s staking end balance: %w", mp.Address.Hex(), err) } return *stakingEndBalance, nil } func (mp *Minipool) GetStakingStartBlock() (int64, error) { stakingStartBlock := new(*big.Int) if err := mp.Contract.Call(nil, stakingStartBlock, "getStakingStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %v staking start block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s staking start block: %w", mp.Address.Hex(), err) } return (*stakingStartBlock).Int64(), nil } func (mp *Minipool) GetStakingUserStartBlock() (int64, error) { stakingUserStartBlock := new(*big.Int) if err := mp.Contract.Call(nil, stakingUserStartBlock, "getStakingUserStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %v staking user start block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s staking user start block: %w", mp.Address.Hex(), err) } return (*stakingUserStartBlock).Int64(), nil } func (mp *Minipool) GetStakingEndBlock() (int64, error) { stakingEndBlock := new(*big.Int) if err := mp.Contract.Call(nil, stakingEndBlock, "getStakingEndBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %v staking end block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s staking end block: %w", mp.Address.Hex(), err) } return (*stakingEndBlock).Int64(), nil } @@ -373,7 +373,7 @@ func (mp *Minipool) GetStakingEndBlock() (int64, error) { func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "refund") if err != nil { - return nil, fmt.Errorf("Could not refund from minipool %v: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } @@ -383,7 +383,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { func (mp *Minipool) Stake(validatorPubkey [48]byte, validatorSignature [96]byte, depositDataRoot [32]byte, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { - return nil, fmt.Errorf("Could not stake minipool %v: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } @@ -393,7 +393,7 @@ func (mp *Minipool) Stake(validatorPubkey [48]byte, validatorSignature [96]byte, func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "withdraw") if err != nil { - return nil, fmt.Errorf("Could not withdraw from minipool %v: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } @@ -403,7 +403,7 @@ func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "dissolve") if err != nil { - return nil, fmt.Errorf("Could not dissolve minipool %v: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } @@ -413,7 +413,7 @@ func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { func (mp *Minipool) Close(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "close") if err != nil { - return nil, fmt.Errorf("Could not close minipool %v: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } diff --git a/minipool/minipool.go b/minipool/minipool.go index 797236015..01287ec82 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -167,7 +167,7 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(nil, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %v minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Int64(), nil } @@ -181,7 +181,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %v minipool %v address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("Could not get node %s minipool %s address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } @@ -195,7 +195,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey []byte) (common.Addre } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { - return common.Address{}, fmt.Errorf("Could not get validator %v minipool address: %w", hex.EncodeToString(pubkey), err) + return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", hex.EncodeToString(pubkey), err) } return *minipoolAddress, nil } @@ -209,7 +209,7 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address } exists := new(bool) if err := rocketMinipoolManager.Call(nil, exists, "getMinipoolExists", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %v exists status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) } return *exists, nil } @@ -223,7 +223,7 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } pubkey := new([]byte) if err := rocketMinipoolManager.Call(nil, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool %v pubkey: %w", minipoolAddress.Hex(), err) + return []byte{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) } return *pubkey, nil } @@ -237,7 +237,7 @@ func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddres } balance := new(*big.Int) if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalTotalBalance", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get minipool %v withdrawal total balance: %w", minipoolAddress.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s withdrawal total balance: %w", minipoolAddress.Hex(), err) } return *balance, nil } @@ -251,7 +251,7 @@ func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress } balance := new(*big.Int) if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalNodeBalance", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get minipool %v withdrawal node balance: %w", minipoolAddress.Hex(), err) + return nil, fmt.Errorf("Could not get minipool %s withdrawal node balance: %w", minipoolAddress.Hex(), err) } return *balance, nil } @@ -265,7 +265,7 @@ func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.A } withdrawable := new(bool) if err := rocketMinipoolManager.Call(nil, withdrawable, "getMinipoolWithdrawable", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %v withdrawable status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("Could not get minipool %s withdrawable status: %w", minipoolAddress.Hex(), err) } return *withdrawable, nil } @@ -279,7 +279,7 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } processed := new(bool) if err := rocketMinipoolManager.Call(nil, processed, "getMinipoolWithdrawalProcessed", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %v withdrawal processed status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("Could not get minipool %s withdrawal processed status: %w", minipoolAddress.Hex(), err) } return *processed, nil } diff --git a/network/network.go b/network/network.go index 586192256..dfcab21f4 100644 --- a/network/network.go +++ b/network/network.go @@ -79,7 +79,7 @@ func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey []byte, opts * } txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey) if err != nil { - return nil, fmt.Errorf("Could not process validator %v withdrawal: %w", hex.EncodeToString(validatorPubkey), err) + return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", hex.EncodeToString(validatorPubkey), err) } return txReceipt, nil } diff --git a/node/node.go b/node/node.go index e8919454b..11cf7f301 100644 --- a/node/node.go +++ b/node/node.go @@ -72,7 +72,7 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, } exists := new(bool) if err := rocketNodeManager.Call(nil, exists, "getNodeExists", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %v exists status: %w", nodeAddress.Hex(), err) + return false, fmt.Errorf("Could not get node %s exists status: %w", nodeAddress.Hex(), err) } return *exists, nil } @@ -86,7 +86,7 @@ func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool } trusted := new(bool) if err := rocketNodeManager.Call(nil, trusted, "getNodeTrusted", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %v trusted status: %w", nodeAddress.Hex(), err) + return false, fmt.Errorf("Could not get node %s trusted status: %w", nodeAddress.Hex(), err) } return *trusted, nil } @@ -100,7 +100,7 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre } timezoneLocation := new(string) if err := rocketNodeManager.Call(nil, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { - return "", fmt.Errorf("Could not get node %v timezone location: %w", nodeAddress.Hex(), err) + return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) } return *timezoneLocation, nil } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 5ac291d1b..d8457d0ca 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -87,7 +87,7 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Get address address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.name"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %v address: %w", contractName, err) + return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) } // Cache address @@ -142,13 +142,13 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Get ABI abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %v ABI: %w", contractName, err) + return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) } // Decode ABI abi, err := decodeAbi(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode contract %v ABI: %w", contractName, err) + return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) } // Cache ABI diff --git a/tokens/tokens.go b/tokens/tokens.go index 57556ed74..9c6214132 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -61,7 +61,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address) (Balances, e func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address) (*big.Int, error) { balance := new(*big.Int) if err := tokenContract.Call(nil, balance, "balanceOf", address); err != nil { - return nil, fmt.Errorf("Could not get %v balance of %v: %w", tokenName, address.Hex(), err) + return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) } return *balance, nil } @@ -71,7 +71,7 @@ func balanceOf(tokenContract *bind.BoundContract, tokenName string, address comm func transfer(client *ethclient.Client, tokenContract *bind.BoundContract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(client, tokenContract, opts, "transfer", to, amount) if err != nil { - return nil, fmt.Errorf("Could not transfer %v to %v: %w", tokenName, to.Hex(), err) + return nil, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) } return txReceipt, nil } From ef46b7485afb0669e82e0b5bc514e2f2c14ac826 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 14:05:10 +1000 Subject: [PATCH 049/878] added send ether utility function --- utils/eth/transactions.go | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 utils/eth/transactions.go diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go new file mode 100644 index 000000000..f26b701b3 --- /dev/null +++ b/utils/eth/transactions.go @@ -0,0 +1,74 @@ +package eth + +import ( + "context" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" +) + + +// Transaction settings +const DefaultGasLimit = 21000 + + +// Send ether to an address +func SendEther(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + + // Get from address nonce + if opts.Nonce == nil { + nonce, err := client.PendingNonceAt(context.Background(), opts.From) + if err != nil { + return nil, err + } + opts.Nonce = big.NewInt(int64(nonce)) + } + + // Set default gas limit + if opts.GasLimit == 0 { + opts.GasLimit = DefaultGasLimit + } + + // Get suggested gas price + if opts.GasPrice == nil { + gasPrice, err := client.SuggestGasPrice(context.Background()) + if err != nil { + return nil, err + } + opts.GasPrice = gasPrice + } + + // Initialize transaction + tx := types.NewTransaction(opts.Nonce.Uint64(), toAddress, opts.Value, opts.GasLimit, opts.GasPrice, []byte{}) + + // Sign transaction + signedTx, err := opts.Signer(types.HomesteadSigner{}, opts.From, tx) + if err != nil { + return nil, err + } + + // Send transaction + if err = client.SendTransaction(context.Background(), signedTx); err != nil { + return nil, err + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), client, signedTx) + if err != nil { + return nil, err + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil + +} + From c1192f27cef86612d9440658aa9c377ecd982c12 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 14:32:21 +1000 Subject: [PATCH 050/878] implemented contract events helper function --- utils/contract/events.go | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 utils/contract/events.go diff --git a/utils/contract/events.go b/utils/contract/events.go new file mode 100644 index 000000000..f1d879347 --- /dev/null +++ b/utils/contract/events.go @@ -0,0 +1,63 @@ +package contract + +import ( + "bytes" + "errors" + "fmt" + "reflect" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" +) + + +// Get contract events from a transaction +// eventPrototype must be a struct type +func GetTransactionEvents(client *ethclient.Client, contractAddress common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { + + // Get event type + eventType := reflect.TypeOf(eventPrototype) + if eventType.Kind() != reflect.Struct { + return nil, errors.New("Invalid event type") + } + + // Get ABI event + abiEvent, ok := contractAbi.Events[eventName] + if !ok { + return nil, fmt.Errorf("Event '%s' does not exist on contract") + } + + // Create contract instance + contract := bind.NewBoundContract(contractAddress, *contractAbi, client, client, client) + + // Process transaction receipt logs + events := make([]interface{}, 0) + for _, log := range txReceipt.Logs { + + // Check log address matches contract address + if !bytes.Equal(log.Address.Bytes(), contractAddress.Bytes()) { + continue + } + + // Check log first topic matches event ID + if len(log.Topics) == 0 || !bytes.Equal(log.Topics[0].Bytes(), abiEvent.ID.Bytes()) { + continue + } + + // Unpack event + event := reflect.New(eventType).Interface() + if err := contract.UnpackLog(event, eventName, *log); err != nil { + return nil, fmt.Errorf("Could not unpack event data: %w", err) + } + events = append(events, event) + + } + + // Return events + return events, nil + +} + From 3787cc71fce2fe0d78420134774ec56073246633 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 14:48:26 +1000 Subject: [PATCH 051/878] implemented contract events helper function --- utils/contract/events.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index f1d879347..dc4020ddd 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -16,7 +16,7 @@ import ( // Get contract events from a transaction // eventPrototype must be a struct type -func GetTransactionEvents(client *ethclient.Client, contractAddress common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { +func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { // Get event type eventType := reflect.TypeOf(eventPrototype) @@ -31,7 +31,7 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress common.Addre } // Create contract instance - contract := bind.NewBoundContract(contractAddress, *contractAbi, client, client, client) + contract := bind.NewBoundContract(*contractAddress, *contractAbi, client, client, client) // Process transaction receipt logs events := make([]interface{}, 0) From 5e82281290aeadb4aa8ce4c14cc667228ed44316 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 14:53:17 +1000 Subject: [PATCH 052/878] bump --- utils/contract/events.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index dc4020ddd..3bd3482f4 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -15,7 +15,7 @@ import ( // Get contract events from a transaction -// eventPrototype must be a struct type +// eventPrototype must be an event struct type func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { // Get event type From d8279c47f92c6903a27abb6ef39f88d3f5c18c04 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 15:15:31 +1000 Subject: [PATCH 053/878] added contract details helper --- utils/contract/contract.go | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 utils/contract/contract.go diff --git a/utils/contract/contract.go b/utils/contract/contract.go new file mode 100644 index 000000000..217247665 --- /dev/null +++ b/utils/contract/contract.go @@ -0,0 +1,41 @@ +package contract + +import ( + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get a contract's address and ABI +func GetDetails(rp *rocketpool.RocketPool, contractName string) (*common.Address, *abi.ABI, error) { + + // Data + var wg errgroup.Group + var address *common.Address + var abi *abi.ABI + + // Load data + wg.Go(func() error { + var err error + address, err = rp.GetAddress(contractName) + return err + }) + wg.Go(func() error { + var err error + abi, err = rp.GetABI(contractName) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, nil, err + } + + // Return + return address, abi, nil + +} + From 836d42b19eca68460e64cac92234cadd8699a1b4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 16:47:03 +1000 Subject: [PATCH 054/878] minor fix --- utils/contract/events.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index 3bd3482f4..cc53a9f52 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -52,7 +52,7 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr if err := contract.UnpackLog(event, eventName, *log); err != nil { return nil, fmt.Errorf("Could not unpack event data: %w", err) } - events = append(events, event) + events = append(events, *event) } From e735d14b5cb0b0a44cf5f976385c7758db7b985d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 16:52:04 +1000 Subject: [PATCH 055/878] minor fix --- utils/contract/events.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index cc53a9f52..c7f95b1bb 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -48,11 +48,11 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr } // Unpack event - event := reflect.New(eventType).Interface() - if err := contract.UnpackLog(event, eventName, *log); err != nil { + event := reflect.Zero(eventType).Interface() + if err := contract.UnpackLog(&event, eventName, *log); err != nil { return nil, fmt.Errorf("Could not unpack event data: %w", err) } - events = append(events, *event) + events = append(events, event) } From a15419671092d4b7b108b03c56822e08410bcd5a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 17 Jul 2020 16:55:29 +1000 Subject: [PATCH 056/878] minor fix --- utils/contract/events.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index c7f95b1bb..01624f24d 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -16,6 +16,7 @@ import ( // Get contract events from a transaction // eventPrototype must be an event struct type +// Returns a slice of pointers to untyped values; assert returned events to *eventType func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { // Get event type @@ -48,8 +49,8 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr } // Unpack event - event := reflect.Zero(eventType).Interface() - if err := contract.UnpackLog(&event, eventName, *log); err != nil { + event := reflect.New(eventType).Interface() + if err := contract.UnpackLog(event, eventName, *log); err != nil { return nil, fmt.Errorf("Could not unpack event data: %w", err) } events = append(events, event) From 5a6532de4d03a701326848680ffb0b9531db174d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 20 Jul 2020 10:33:08 +1000 Subject: [PATCH 057/878] contract event helper fix --- utils/contract/events.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index 01624f24d..e3c610ae7 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -16,7 +16,7 @@ import ( // Get contract events from a transaction // eventPrototype must be an event struct type -// Returns a slice of pointers to untyped values; assert returned events to *eventType +// Returns a slice of untyped values; assert returned events to event struct type func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { // Get event type @@ -49,11 +49,11 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr } // Unpack event - event := reflect.New(eventType).Interface() - if err := contract.UnpackLog(event, eventName, *log); err != nil { + event := reflect.New(eventType) + if err := contract.UnpackLog(event.Interface(), eventName, *log); err != nil { return nil, fmt.Errorf("Could not unpack event data: %w", err) } - events = append(events, event) + events = append(events, reflect.Indirect(event).Interface()) } From 663a6b13ff351f152a44cdd11274d96c5f2ba86a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 20 Jul 2020 13:02:00 +1000 Subject: [PATCH 058/878] utility method rename --- utils/eth/transactions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index f26b701b3..8c70ca1c5 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -16,8 +16,8 @@ import ( const DefaultGasLimit = 21000 -// Send ether to an address -func SendEther(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +// Send a transaction to an address +func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { // Get from address nonce if opts.Nonce == nil { From 32acb1c66a255f597e0b562a4e40adb4fc7e61d1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 20 Jul 2020 13:09:10 +1000 Subject: [PATCH 059/878] updated minipool queue methods --- minipool/minipool.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 01287ec82..2e1d646ef 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -313,6 +313,20 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { } +// Get the capacity of the next minipool in the queue +func GetQueueNextCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(nil, capacity, "getNextCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) + } + return *capacity, nil +} + + // Submit a minipool exited event func SubmitMinipoolExited(rp *rocketpool.RocketPool, minipoolAddress common.Address, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) From 05c5abd4c87f79553bfdaf910593f807d526395b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 21 Jul 2020 09:19:28 +1000 Subject: [PATCH 060/878] updating types --- minipool/minipool-contract.go | 17 +++++++++-------- minipool/types.go => types/minipool.go | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) rename minipool/types.go => types/minipool.go (96%) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 27a2c7bab..658dfb317 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -12,6 +12,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -19,7 +20,7 @@ import ( // Minipool detail types type StatusDetails struct { - Status MinipoolStatus + Status rptypes.MinipoolStatus StatusBlock int64 StatusTime time.Time } @@ -74,7 +75,7 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { // Data var wg errgroup.Group - var status MinipoolStatus + var status rptypes.MinipoolStatus var statusBlock int64 var statusTime time.Time @@ -108,12 +109,12 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { }, nil } -func (mp *Minipool) GetStatus() (MinipoolStatus, error) { +func (mp *Minipool) GetStatus() (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { - return MinipoolStatus(0), fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + return rptypes.MinipoolStatus(0), fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } - return MinipoolStatus(*status), nil + return rptypes.MinipoolStatus(*status), nil } func (mp *Minipool) GetStatusBlock() (int64, error) { statusBlock := new(*big.Int) @@ -132,12 +133,12 @@ func (mp *Minipool) GetStatusTime() (time.Time, error) { // Get deposit type -func (mp *Minipool) GetDepositType() (MinipoolDeposit, error) { +func (mp *Minipool) GetDepositType() (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(nil, depositType, "getDepositType"); err != nil { - return MinipoolDeposit(0), fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + return rptypes.MinipoolDeposit(0), fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) } - return MinipoolDeposit(*depositType), nil + return rptypes.MinipoolDeposit(*depositType), nil } diff --git a/minipool/types.go b/types/minipool.go similarity index 96% rename from minipool/types.go rename to types/minipool.go index d18045b06..0b99a051f 100644 --- a/minipool/types.go +++ b/types/minipool.go @@ -1,4 +1,4 @@ -package minipool +package types // Minipool statuses From ebcbd3f1df4293a252420de8e9290dda0bbbfda4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 21 Jul 2020 10:32:53 +1000 Subject: [PATCH 061/878] implementing custom types --- types/beacon.go | 90 +++++++++++++++++++++++++++++++++++++++++++++++ types/minipool.go | 58 ++++++++++++++++++++++++++++-- 2 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 types/beacon.go diff --git a/types/beacon.go b/types/beacon.go new file mode 100644 index 000000000..685e9722c --- /dev/null +++ b/types/beacon.go @@ -0,0 +1,90 @@ +package types + +import ( + "encoding/hex" +) + + +// Validator pubkey +const ValidatorPubkeyLength = 48 // bytes +type ValidatorPubkey [ValidatorPubkeyLength]byte + + +// Bytes conversion +func (v ValidatorPubkey) Bytes() []byte { + return v[:] +} +func BytesToValidatorPubkey(value []byte) ValidatorPubkey { + var pubkey ValidatorPubkey + copy(pubkey[:], value) + return pubkey +} + + +// String conversion +func (v ValidatorPubkey) Hex() string { + return hex.EncodeToString(v.Bytes()) +} +func (v ValidatorPubkey) String() string { + return v.Hex() +} +func HexToValidatorPubkey(value string) (ValidatorPubkey, error) { + pubkey := make([]byte, ValidatorPubkeyLength) + _, err := hex.Decode(pubkey, []byte(value)) + return BytesToValidatorPubkey(pubkey), err +} + + +// JSON encoding +func (v ValidatorPubkey) MarshalJSON() ([]byte, error) { + return []byte(v.Hex()), nil +} +func (v *ValidatorPubkey) UnmarshalJSON(data []byte) error { + pubkey, err := HexToValidatorPubkey(string(data)) + if err != nil { return err } + *v = pubkey + return nil +} + + +// Validator signature +const ValidatorSignatureLength = 96 // bytes +type ValidatorSignature [ValidatorSignatureLength]byte + + +// Bytes conversion +func (v ValidatorSignature) Bytes() []byte { + return v[:] +} +func BytesToValidatorSignature(value []byte) ValidatorSignature { + var signature ValidatorSignature + copy(signature[:], value) + return signature +} + + +// String conversion +func (v ValidatorSignature) Hex() string { + return hex.EncodeToString(v.Bytes()) +} +func (v ValidatorSignature) String() string { + return v.Hex() +} +func HexToValidatorSignature(value string) (ValidatorSignature, error) { + signature := make([]byte, ValidatorSignatureLength) + _, err := hex.Decode(signature, []byte(value)) + return BytesToValidatorSignature(signature), err +} + + +// JSON encoding +func (v ValidatorSignature) MarshalJSON() ([]byte, error) { + return []byte(v.Hex()), nil +} +func (v *ValidatorSignature) UnmarshalJSON(data []byte) error { + signature, err := HexToValidatorSignature(string(data)) + if err != nil { return err } + *v = signature + return nil +} + diff --git a/types/minipool.go b/types/minipool.go index 0b99a051f..3bffc2987 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -1,5 +1,9 @@ package types +import ( + "fmt" +) + // Minipool statuses type MinipoolStatus uint8 @@ -11,8 +15,33 @@ const ( Withdrawable Dissolved ) +var MinipoolStatuses = []string{"Initialized", "Prelaunch", "Staking", "Exited", "Withdrawable", "Dissolved"} + + +// String conversion func (s MinipoolStatus) String() string { - return []string{"Initialized", "Prelaunch", "Staking", "Exited", "Withdrawable", "Dissolved"}[s] + if int(s) >= len(MinipoolStatuses) { return "" } + return MinipoolStatuses[s] +} +func StringToMinipoolStatus(value string) (MinipoolStatus, error) { + for status, str := range MinipoolStatuses { + if value == str { return MinipoolStatus(status), nil } + } + return 0, fmt.Errorf("Invalid minipool status '%s'", value) +} + + +// JSON encoding +func (s MinipoolStatus) MarshalJSON() ([]byte, error) { + str := s.String() + if str == "" { return []byte{}, fmt.Errorf("Invalid minipool status '%d'", s) } + return []byte(str), nil +} +func (s *MinipoolStatus) UnmarshalJSON(data []byte) error { + status, err := StringToMinipoolStatus(string(data)) + if err != nil { return err } + *s = status + return nil } @@ -24,7 +53,32 @@ const ( Half Empty ) +var MinipoolDepositTypes = []string{"None", "Full", "Half", "Empty"} + + +// String conversion func (d MinipoolDeposit) String() string { - return []string{"None", "Full", "Half", "Empty"}[d] + if int(d) >= len(MinipoolDepositTypes) { return "" } + return MinipoolDepositTypes[d] +} +func StringToMinipoolDeposit(value string) (MinipoolDeposit, error) { + for depositType, str := range MinipoolDepositTypes { + if value == str { return MinipoolDeposit(depositType), nil } + } + return 0, fmt.Errorf("Invalid minipool deposit type '%s'", value) +} + + +// JSON encoding +func (d MinipoolDeposit) MarshalJSON() ([]byte, error) { + str := d.String() + if str == "" { return []byte{}, fmt.Errorf("Invalid minipool deposit type '%d'", d) } + return []byte(str), nil +} +func (d *MinipoolDeposit) UnmarshalJSON(data []byte) error { + depositType, err := StringToMinipoolDeposit(string(data)) + if err != nil { return err } + *d = depositType + return nil } From 00f4dd88445761cd123d958d17db0064c2d93793 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 21 Jul 2020 10:48:16 +1000 Subject: [PATCH 062/878] implementing custom types --- minipool/minipool-contract.go | 2 +- minipool/minipool.go | 18 +++++++++--------- network/network.go | 15 ++++++++------- types/beacon.go | 12 ++++++++---- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 658dfb317..da4b1606f 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -381,7 +381,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { // Progress the prelaunch minipool to staking -func (mp *Minipool) Stake(validatorPubkey [48]byte, validatorSignature [96]byte, depositDataRoot [32]byte, opts *bind.TransactOpts) (*types.Receipt, error) { +func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { return nil, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) diff --git a/minipool/minipool.go b/minipool/minipool.go index 2e1d646ef..9a43fdf8b 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -1,7 +1,6 @@ package minipool import ( - "encoding/hex" "fmt" "math/big" "sync" @@ -12,6 +11,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -20,7 +20,7 @@ import ( type MinipoolDetails struct { Address common.Address Exists bool - Pubkey []byte + Pubkey rptypes.ValidatorPubkey WithdrawalTotalBalance *big.Int WithdrawalNodeBalance *big.Int Withdrawable bool @@ -102,7 +102,7 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Data var wg errgroup.Group var exists bool - var pubkey []byte + var pubkey rptypes.ValidatorPubkey var withdrawalTotalBalance *big.Int var withdrawalNodeBalance *big.Int var withdrawable bool @@ -188,14 +188,14 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in // Get a minipool address by validator pubkey -func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey []byte) (common.Address, error) { +func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { - return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", hex.EncodeToString(pubkey), err) + return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) } return *minipoolAddress, nil } @@ -216,14 +216,14 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get a minipool's validator pubkey -func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address) ([]byte, error) { +func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address) (rptypes.ValidatorPubkey, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { - return []byte{}, err + return rptypes.ValidatorPubkey{}, err } - pubkey := new([]byte) + pubkey := new(rptypes.ValidatorPubkey) if err := rocketMinipoolManager.Call(nil, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) + return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) } return *pubkey, nil } diff --git a/network/network.go b/network/network.go index dfcab21f4..cde9448e0 100644 --- a/network/network.go +++ b/network/network.go @@ -1,15 +1,16 @@ package network import ( - "encoding/hex" "fmt" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -44,14 +45,14 @@ func GetWithdrawalBalance(rp *rocketpool.RocketPool) (*big.Int, error) { // Get the current network validator withdrawal credentials -func GetWithdrawalCredentials(rp *rocketpool.RocketPool) ([32]byte, error) { +func GetWithdrawalCredentials(rp *rocketpool.RocketPool) (common.Hash, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { - return [32]byte{}, err + return common.Hash{}, err } - withdrawalCredentials := new([32]byte) + withdrawalCredentials := new(common.Hash) if err := rocketNetworkWithdrawal.Call(nil, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { - return [32]byte{}, fmt.Errorf("Could not get network withdrawal credentials: %w", err) + return common.Hash{}, fmt.Errorf("Could not get network withdrawal credentials: %w", err) } return *withdrawalCredentials, nil } @@ -72,14 +73,14 @@ func SubmitETHBalances(rp *rocketpool.RocketPool, epoch int64, total *big.Int, s // Process a validator withdrawal from the beacon chain -func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey []byte, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.ValidatorPubkey, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { return nil, err } txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey) if err != nil { - return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", hex.EncodeToString(validatorPubkey), err) + return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", validatorPubkey.Hex(), err) } return txReceipt, nil } diff --git a/types/beacon.go b/types/beacon.go index 685e9722c..2e6a82952 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -30,8 +30,10 @@ func (v ValidatorPubkey) String() string { } func HexToValidatorPubkey(value string) (ValidatorPubkey, error) { pubkey := make([]byte, ValidatorPubkeyLength) - _, err := hex.Decode(pubkey, []byte(value)) - return BytesToValidatorPubkey(pubkey), err + if _, err := hex.Decode(pubkey, []byte(value)); err != nil { + return ValidatorPubkey{}, err + } + return BytesToValidatorPubkey(pubkey), nil } @@ -72,8 +74,10 @@ func (v ValidatorSignature) String() string { } func HexToValidatorSignature(value string) (ValidatorSignature, error) { signature := make([]byte, ValidatorSignatureLength) - _, err := hex.Decode(signature, []byte(value)) - return BytesToValidatorSignature(signature), err + if _, err := hex.Decode(signature, []byte(value)); err != nil { + return ValidatorSignature{}, err + } + return BytesToValidatorSignature(signature), nil } From cb211dff71bd13b5598d5eb080ef62ccb43e9040 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 21 Jul 2020 10:51:12 +1000 Subject: [PATCH 063/878] implementing custom types --- types/beacon.go | 10 ++++------ types/minipool.go | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/types/beacon.go b/types/beacon.go index 2e6a82952..2a3a3508c 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -43,9 +43,8 @@ func (v ValidatorPubkey) MarshalJSON() ([]byte, error) { } func (v *ValidatorPubkey) UnmarshalJSON(data []byte) error { pubkey, err := HexToValidatorPubkey(string(data)) - if err != nil { return err } - *v = pubkey - return nil + if err == nil { *v = pubkey } + return err } @@ -87,8 +86,7 @@ func (v ValidatorSignature) MarshalJSON() ([]byte, error) { } func (v *ValidatorSignature) UnmarshalJSON(data []byte) error { signature, err := HexToValidatorSignature(string(data)) - if err != nil { return err } - *v = signature - return nil + if err == nil { *v = signature } + return err } diff --git a/types/minipool.go b/types/minipool.go index 3bffc2987..6f8e3355a 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -39,9 +39,8 @@ func (s MinipoolStatus) MarshalJSON() ([]byte, error) { } func (s *MinipoolStatus) UnmarshalJSON(data []byte) error { status, err := StringToMinipoolStatus(string(data)) - if err != nil { return err } - *s = status - return nil + if err == nil { *s = status } + return err } @@ -77,8 +76,7 @@ func (d MinipoolDeposit) MarshalJSON() ([]byte, error) { } func (d *MinipoolDeposit) UnmarshalJSON(data []byte) error { depositType, err := StringToMinipoolDeposit(string(data)) - if err != nil { return err } - *d = depositType - return nil + if err == nil { *d = depositType } + return err } From 3d3127f1831694eac3695d08b9d46ac433b9691a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 21 Jul 2020 11:09:31 +1000 Subject: [PATCH 064/878] minor cleanup --- minipool/minipool-contract.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index da4b1606f..8b08bd089 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -110,11 +110,11 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { } func (mp *Minipool) GetStatus() (rptypes.MinipoolStatus, error) { - status := new(uint8) + status := new(rptypes.MinipoolStatus) if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { - return rptypes.MinipoolStatus(0), fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } - return rptypes.MinipoolStatus(*status), nil + return *status, nil } func (mp *Minipool) GetStatusBlock() (int64, error) { statusBlock := new(*big.Int) @@ -134,11 +134,11 @@ func (mp *Minipool) GetStatusTime() (time.Time, error) { // Get deposit type func (mp *Minipool) GetDepositType() (rptypes.MinipoolDeposit, error) { - depositType := new(uint8) + depositType := new(rptypes.MinipoolDeposit) if err := mp.Contract.Call(nil, depositType, "getDepositType"); err != nil { - return rptypes.MinipoolDeposit(0), fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) } - return rptypes.MinipoolDeposit(*depositType), nil + return *depositType, nil } From 8c293d2ad29fdac973dfa12b92ff2d15af470e19 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 23 Jul 2020 10:10:22 +1000 Subject: [PATCH 065/878] RP contract updates --- minipool/minipool-contract.go | 69 +++++++++++++++++++++-------------- minipool/minipool.go | 18 +-------- rocketpool/rocketpool.go | 2 +- settings/minipool.go | 14 ------- types/minipool.go | 3 +- 5 files changed, 46 insertions(+), 60 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 8b08bd089..aaffb8557 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -34,13 +34,14 @@ type NodeDetails struct { type UserDetails struct { DepositBalance *big.Int DepositAssigned bool + DepositAssignedTime time.Time } type StakingDetails struct { StartBalance *big.Int EndBalance *big.Int - StartBlock int64 - UserStartBlock int64 - EndBlock int64 + StartEpoch int64 + UserStartEpoch int64 + EndEpoch int64 } @@ -239,6 +240,7 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { var wg errgroup.Group var depositBalance *big.Int var depositAssigned bool + var depositAssignedTime time.Time // Load data wg.Go(func() error { @@ -251,6 +253,11 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { depositAssigned, err = mp.GetUserDepositAssigned() return err }) + wg.Go(func() error { + var err error + depositAssignedTime, err = mp.GetUserDepositAssignedTime() + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -261,6 +268,7 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { return UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, + DepositAssignedTime: depositAssignedTime, }, nil } @@ -278,6 +286,13 @@ func (mp *Minipool) GetUserDepositAssigned() (bool, error) { } return *userDepositAssigned, nil } +func (mp *Minipool) GetUserDepositAssignedTime() (time.Time, error) { + depositAssignedTime := new(*big.Int) + if err := mp.Contract.Call(nil, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) + } + return time.Unix((*depositAssignedTime).Int64(), 0), nil +} // Get staking details @@ -287,9 +302,9 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { var wg errgroup.Group var startBalance *big.Int var endBalance *big.Int - var startBlock int64 - var userStartBlock int64 - var endBlock int64 + var startEpoch int64 + var userStartEpoch int64 + var endEpoch int64 // Load data wg.Go(func() error { @@ -304,17 +319,17 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { }) wg.Go(func() error { var err error - startBlock, err = mp.GetStakingStartBlock() + startEpoch, err = mp.GetStakingStartEpoch() return err }) wg.Go(func() error { var err error - userStartBlock, err = mp.GetStakingUserStartBlock() + userStartEpoch, err = mp.GetStakingUserStartEpoch() return err }) wg.Go(func() error { var err error - endBlock, err = mp.GetStakingEndBlock() + endEpoch, err = mp.GetStakingEndEpoch() return err }) @@ -327,9 +342,9 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { return StakingDetails{ StartBalance: startBalance, EndBalance: endBalance, - StartBlock: startBlock, - UserStartBlock: userStartBlock, - EndBlock: endBlock, + StartEpoch: startEpoch, + UserStartEpoch: userStartEpoch, + EndEpoch: endEpoch, }, nil } @@ -347,26 +362,26 @@ func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { } return *stakingEndBalance, nil } -func (mp *Minipool) GetStakingStartBlock() (int64, error) { - stakingStartBlock := new(*big.Int) - if err := mp.Contract.Call(nil, stakingStartBlock, "getStakingStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking start block: %w", mp.Address.Hex(), err) +func (mp *Minipool) GetStakingStartEpoch() (int64, error) { + stakingStartEpoch := new(*big.Int) + if err := mp.Contract.Call(nil, stakingStartEpoch, "getStakingStartEpoch"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s staking start epoch: %w", mp.Address.Hex(), err) } - return (*stakingStartBlock).Int64(), nil + return (*stakingStartEpoch).Int64(), nil } -func (mp *Minipool) GetStakingUserStartBlock() (int64, error) { - stakingUserStartBlock := new(*big.Int) - if err := mp.Contract.Call(nil, stakingUserStartBlock, "getStakingUserStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking user start block: %w", mp.Address.Hex(), err) +func (mp *Minipool) GetStakingUserStartEpoch() (int64, error) { + stakingUserStartEpoch := new(*big.Int) + if err := mp.Contract.Call(nil, stakingUserStartEpoch, "getStakingUserStartEpoch"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s staking user start epoch: %w", mp.Address.Hex(), err) } - return (*stakingUserStartBlock).Int64(), nil + return (*stakingUserStartEpoch).Int64(), nil } -func (mp *Minipool) GetStakingEndBlock() (int64, error) { - stakingEndBlock := new(*big.Int) - if err := mp.Contract.Call(nil, stakingEndBlock, "getStakingEndBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking end block: %w", mp.Address.Hex(), err) +func (mp *Minipool) GetStakingEndEpoch() (int64, error) { + stakingEndEpoch := new(*big.Int) + if err := mp.Contract.Call(nil, stakingEndEpoch, "getStakingEndEpoch"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s staking end epoch: %w", mp.Address.Hex(), err) } - return (*stakingEndBlock).Int64(), nil + return (*stakingEndEpoch).Int64(), nil } diff --git a/minipool/minipool.go b/minipool/minipool.go index 9a43fdf8b..529ac3406 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -327,27 +327,13 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { } -// Submit a minipool exited event -func SubmitMinipoolExited(rp *rocketpool.RocketPool, minipoolAddress common.Address, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return nil, err - } - txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolExited", minipoolAddress, big.NewInt(epoch)) - if err != nil { - return nil, fmt.Errorf("Could not submit minipool exited event: %w", err) - } - return txReceipt, nil -} - - // Submit a minipool withdrawable event -func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, withdrawalBalance *big.Int, epoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, withdrawalBalance *big.Int, startEpoch, endEpoch, userStartEpoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, withdrawalBalance, big.NewInt(epoch)) + txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, withdrawalBalance, big.NewInt(startEpoch), big.NewInt(endEpoch), big.NewInt(userStartEpoch)) if err != nil { return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index d8457d0ca..3811591ab 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -85,7 +85,7 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { } // Get address - address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.name"), []byte(contractName))) + address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) if err != nil { return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) } diff --git a/settings/minipool.go b/settings/minipool.go index 833cbd15d..bd5a5579c 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -47,20 +47,6 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, err } -// Minipool exited event submissions currently enabled -func GetMinipoolSubmitExitedEnabled(rp *rocketpool.RocketPool) (bool, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) - if err != nil { - return false, err - } - submitExitedEnabled := new(bool) - if err := rocketMinipoolSettings.Call(nil, submitExitedEnabled, "getSubmitExitedEnabled"); err != nil { - return false, fmt.Errorf("Could not get minipool exited submissions enabled status: %w", err) - } - return *submitExitedEnabled, nil -} - - // Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool) (bool, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) diff --git a/types/minipool.go b/types/minipool.go index 6f8e3355a..3d7577a09 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -11,11 +11,10 @@ const ( Initialized MinipoolStatus = iota Prelaunch Staking - Exited Withdrawable Dissolved ) -var MinipoolStatuses = []string{"Initialized", "Prelaunch", "Staking", "Exited", "Withdrawable", "Dissolved"} +var MinipoolStatuses = []string{"Initialized", "Prelaunch", "Staking", "Withdrawable", "Dissolved"} // String conversion From 4918dcc45f93e757cef8e489063e6c91213797da Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 23 Jul 2020 10:29:25 +1000 Subject: [PATCH 066/878] added custom struct type json tags --- minipool/minipool-contract.go | 54 +++++++++++++++++------------------ minipool/minipool.go | 14 ++++----- node/node.go | 6 ++-- tokens/tokens.go | 4 +-- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index aaffb8557..519804c39 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -20,28 +20,28 @@ import ( // Minipool detail types type StatusDetails struct { - Status rptypes.MinipoolStatus - StatusBlock int64 - StatusTime time.Time + Status rptypes.MinipoolStatus `json:"status"` + StatusBlock int64 `json:"statusBlock"` + StatusTime time.Time `json:"statusTime"` } type NodeDetails struct { - Address common.Address - Fee float64 - DepositBalance *big.Int - RefundBalance *big.Int - DepositAssigned bool + Address common.Address `json:"address"` + Fee float64 `json:"fee"` + DepositBalance *big.Int `json:"depositBalance"` + RefundBalance *big.Int `json:"refundBalance"` + DepositAssigned bool `json:"depositAssigned"` } type UserDetails struct { - DepositBalance *big.Int - DepositAssigned bool - DepositAssignedTime time.Time + DepositBalance *big.Int `json:"depositBalance"` + DepositAssigned bool `json:"depositAssigned"` + DepositAssignedTime time.Time `json:"depositAssignedTime"` } type StakingDetails struct { - StartBalance *big.Int - EndBalance *big.Int - StartEpoch int64 - UserStartEpoch int64 - EndEpoch int64 + StartBalance *big.Int `json:"startBalance"` + EndBalance *big.Int `json:"endBalance"` + StartEpoch int64 `json:"startEpoch"` + EndEpoch int64 `json:"endEpoch"` + UserStartEpoch int64 `json:"userStartEpoch"` } @@ -303,8 +303,8 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { var startBalance *big.Int var endBalance *big.Int var startEpoch int64 - var userStartEpoch int64 var endEpoch int64 + var userStartEpoch int64 // Load data wg.Go(func() error { @@ -324,12 +324,12 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { }) wg.Go(func() error { var err error - userStartEpoch, err = mp.GetStakingUserStartEpoch() + endEpoch, err = mp.GetStakingEndEpoch() return err }) wg.Go(func() error { var err error - endEpoch, err = mp.GetStakingEndEpoch() + userStartEpoch, err = mp.GetStakingUserStartEpoch() return err }) @@ -343,8 +343,8 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { StartBalance: startBalance, EndBalance: endBalance, StartEpoch: startEpoch, - UserStartEpoch: userStartEpoch, EndEpoch: endEpoch, + UserStartEpoch: userStartEpoch, }, nil } @@ -369,13 +369,6 @@ func (mp *Minipool) GetStakingStartEpoch() (int64, error) { } return (*stakingStartEpoch).Int64(), nil } -func (mp *Minipool) GetStakingUserStartEpoch() (int64, error) { - stakingUserStartEpoch := new(*big.Int) - if err := mp.Contract.Call(nil, stakingUserStartEpoch, "getStakingUserStartEpoch"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking user start epoch: %w", mp.Address.Hex(), err) - } - return (*stakingUserStartEpoch).Int64(), nil -} func (mp *Minipool) GetStakingEndEpoch() (int64, error) { stakingEndEpoch := new(*big.Int) if err := mp.Contract.Call(nil, stakingEndEpoch, "getStakingEndEpoch"); err != nil { @@ -383,6 +376,13 @@ func (mp *Minipool) GetStakingEndEpoch() (int64, error) { } return (*stakingEndEpoch).Int64(), nil } +func (mp *Minipool) GetStakingUserStartEpoch() (int64, error) { + stakingUserStartEpoch := new(*big.Int) + if err := mp.Contract.Call(nil, stakingUserStartEpoch, "getStakingUserStartEpoch"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s staking user start epoch: %w", mp.Address.Hex(), err) + } + return (*stakingUserStartEpoch).Int64(), nil +} // Refund node ETH from the minipool diff --git a/minipool/minipool.go b/minipool/minipool.go index 529ac3406..337204f87 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -18,13 +18,13 @@ import ( // Minipool details type MinipoolDetails struct { - Address common.Address - Exists bool - Pubkey rptypes.ValidatorPubkey - WithdrawalTotalBalance *big.Int - WithdrawalNodeBalance *big.Int - Withdrawable bool - WithdrawalProcessed bool + Address common.Address `json:"address"` + Exists bool `json:"exists"` + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalTotalBalance *big.Int `json:"withdrawalTotalBalance"` + WithdrawalNodeBalance *big.Int `json:"withdrawalNodeBalance"` + Withdrawable bool `json:"withdrawable"` + WithdrawalProcessed bool `json:"withdrawalProcessed"` } diff --git a/node/node.go b/node/node.go index 11cf7f301..aff8f1fbe 100644 --- a/node/node.go +++ b/node/node.go @@ -17,9 +17,9 @@ import ( // Node details type NodeDetails struct { - Exists bool - Trusted bool - TimezoneLocation string + Exists bool `json:"exists"` + Trusted bool `json:"trusted"` + TimezoneLocation string `json:"timezoneLocation"` } diff --git a/tokens/tokens.go b/tokens/tokens.go index 9c6214132..f84158327 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -18,8 +18,8 @@ import ( // Token balances type Balances struct { - ETH *big.Int - NETH *big.Int + ETH *big.Int `json:"eth"` + NETH *big.Int `json:"neth"` } From 6a7d494544d75ce9d97590c8382b1f7ff7408932 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 24 Jul 2020 11:41:35 +1000 Subject: [PATCH 067/878] added minipool getter methods --- minipool/minipool.go | 98 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 337204f87..be22cdcb6 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -28,6 +28,74 @@ type MinipoolDetails struct { } +// Get all minipool details +func GetMinipools(rp *rocketpool.RocketPool) ([]MinipoolDetails, error) { + + // Get minipool addresses + minipoolAddresses, err := GetMinipoolAddresses(rp) + if err != nil { + return []MinipoolDetails{}, err + } + + // Data + var wg errgroup.Group + details := make([]MinipoolDetails, len(minipoolAddresses)) + + // Load details + for mi, minipoolAddress := range minipoolAddresses { + mi, minipoolAddress := mi, minipoolAddress + wg.Go(func() error { + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress) + if err == nil { details[mi] = minipoolDetails } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return []MinipoolDetails{}, err + } + + // Return + return details, nil + +} + + +// Get all minipool addresses +func GetMinipoolAddresses(rp *rocketpool.RocketPool) ([]common.Address, error) { + + // Get minipool count + minipoolCount, err := GetMinipoolCount(rp) + if err != nil { + return []common.Address{}, err + } + + // Data + var wg errgroup.Group + addresses := make([]common.Address, minipoolCount) + + // Load addresses + for mi := int64(0); mi < minipoolCount; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMinipoolAt(rp, mi) + if err == nil { addresses[mi] = address } + return err + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + // Return + return addresses, nil + +} + + // Get a node's minipool details func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]MinipoolDetails, error) { @@ -159,6 +227,34 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres } +// Get the minipool count +func GetMinipoolCount(rp *rocketpool.RocketPool) (int64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(nil, minipoolCount, "getMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get minipool count: %w", err) + } + return (*minipoolCount).Int64(), nil +} + + +// Get a minipool address by index +func GetMinipoolAt(rp *rocketpool.RocketPool, index int64) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolAt", big.NewInt(index)); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + } + return *minipoolAddress, nil +} + + // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) (int64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) @@ -181,7 +277,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s minipool %s address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } From 11fe57913feb4cdc3f4056d6edff6c20a2339b73 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 28 Jul 2020 13:44:03 +1000 Subject: [PATCH 068/878] RP contract updates --- minipool/minipool-contract.go | 45 ----------------------------------- minipool/minipool.go | 19 +++++++++++++-- network/network.go | 8 +++---- settings/network.go | 14 +++++++++++ 4 files changed, 35 insertions(+), 51 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 519804c39..dc6d5229f 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -39,9 +39,6 @@ type UserDetails struct { type StakingDetails struct { StartBalance *big.Int `json:"startBalance"` EndBalance *big.Int `json:"endBalance"` - StartEpoch int64 `json:"startEpoch"` - EndEpoch int64 `json:"endEpoch"` - UserStartEpoch int64 `json:"userStartEpoch"` } @@ -302,9 +299,6 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { var wg errgroup.Group var startBalance *big.Int var endBalance *big.Int - var startEpoch int64 - var endEpoch int64 - var userStartEpoch int64 // Load data wg.Go(func() error { @@ -317,21 +311,6 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { endBalance, err = mp.GetStakingEndBalance() return err }) - wg.Go(func() error { - var err error - startEpoch, err = mp.GetStakingStartEpoch() - return err - }) - wg.Go(func() error { - var err error - endEpoch, err = mp.GetStakingEndEpoch() - return err - }) - wg.Go(func() error { - var err error - userStartEpoch, err = mp.GetStakingUserStartEpoch() - return err - }) // Wait for data if err := wg.Wait(); err != nil { @@ -342,9 +321,6 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { return StakingDetails{ StartBalance: startBalance, EndBalance: endBalance, - StartEpoch: startEpoch, - EndEpoch: endEpoch, - UserStartEpoch: userStartEpoch, }, nil } @@ -362,27 +338,6 @@ func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { } return *stakingEndBalance, nil } -func (mp *Minipool) GetStakingStartEpoch() (int64, error) { - stakingStartEpoch := new(*big.Int) - if err := mp.Contract.Call(nil, stakingStartEpoch, "getStakingStartEpoch"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking start epoch: %w", mp.Address.Hex(), err) - } - return (*stakingStartEpoch).Int64(), nil -} -func (mp *Minipool) GetStakingEndEpoch() (int64, error) { - stakingEndEpoch := new(*big.Int) - if err := mp.Contract.Call(nil, stakingEndEpoch, "getStakingEndEpoch"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking end epoch: %w", mp.Address.Hex(), err) - } - return (*stakingEndEpoch).Int64(), nil -} -func (mp *Minipool) GetStakingUserStartEpoch() (int64, error) { - stakingUserStartEpoch := new(*big.Int) - if err := mp.Contract.Call(nil, stakingUserStartEpoch, "getStakingUserStartEpoch"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s staking user start epoch: %w", mp.Address.Hex(), err) - } - return (*stakingUserStartEpoch).Int64(), nil -} // Refund node ETH from the minipool diff --git a/minipool/minipool.go b/minipool/minipool.go index be22cdcb6..c5b7ef73b 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -13,6 +13,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -423,13 +424,27 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { } +// Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances +func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int) (*big.Int, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return nil, err + } + nodeAmount := new(*big.Int) + if err := rocketMinipoolStatus.Call(nil, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { + return nil, fmt.Errorf("Could not get minipool node reward amount: %w", err) + } + return *nodeAmount, nil +} + + // Submit a minipool withdrawable event -func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, withdrawalBalance *big.Int, startEpoch, endEpoch, userStartEpoch int64, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, withdrawalBalance, big.NewInt(startEpoch), big.NewInt(endEpoch), big.NewInt(userStartEpoch)) + txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) if err != nil { return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } diff --git a/network/network.go b/network/network.go index cde9448e0..db478a8a1 100644 --- a/network/network.go +++ b/network/network.go @@ -58,15 +58,15 @@ func GetWithdrawalCredentials(rp *rocketpool.RocketPool) (common.Hash, error) { } -// Submit network ETH balances for an epoch -func SubmitETHBalances(rp *rocketpool.RocketPool, epoch int64, total *big.Int, staking *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +// Submit network balances for an epoch +func SubmitBalances(rp *rocketpool.RocketPool, block int64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitETHBalances", big.NewInt(epoch), total, staking) + txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(block), totalEth, stakingEth, rethSupply) if err != nil { - return nil, fmt.Errorf("Could not submit network ETH balances: %w", err) + return nil, fmt.Errorf("Could not submit network balances: %w", err) } return txReceipt, nil } diff --git a/settings/network.go b/settings/network.go index 419fe25e7..321eedb06 100644 --- a/settings/network.go +++ b/settings/network.go @@ -26,6 +26,20 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool) (bool, error) { } +// The frequency in blocks at which network balances should be submitted by trusted nodes +func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool) (int64, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + submitBalancesFrequency := new(*big.Int) + if err := rocketNetworkSettings.Call(nil, submitBalancesFrequency, "getSubmitBalancesFrequency"); err != nil { + return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) + } + return (*submitBalancesFrequency).Int64(), nil +} + + // Processing validator withdrawals currently enabled func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool) (bool, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) From 84a31edd96f339484514dbe0a45c94b49d34ec5f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 28 Jul 2020 14:17:32 +1000 Subject: [PATCH 069/878] added callopts to all getter methods --- deposit/deposit.go | 4 +- minipool/minipool-contract.go | 90 ++++++++++++++++---------------- minipool/minipool.go | 98 +++++++++++++++++------------------ network/network.go | 12 ++--- node/node.go | 20 +++---- settings/deposit.go | 8 +-- settings/minipool.go | 24 ++++----- settings/network.go | 24 ++++----- settings/node.go | 8 +-- tokens/neth.go | 4 +- tokens/tokens.go | 12 +++-- 11 files changed, 153 insertions(+), 151 deletions(-) diff --git a/deposit/deposit.go b/deposit/deposit.go index 1b0e25efe..6098d504f 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -14,13 +14,13 @@ import ( // Get the deposit pool balance -func GetBalance(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketDepositPool, err := getRocketDepositPool(rp) if err != nil { return nil, err } balance := new(*big.Int) - if err := rocketDepositPool.Call(nil, balance, "getBalance"); err != nil { + if err := rocketDepositPool.Call(opts, balance, "getBalance"); err != nil { return nil, fmt.Errorf("Could not get deposit pool balance: %w", err) } return *balance, nil diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index dc6d5229f..ea130913c 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -69,7 +69,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, // Get status details -func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { +func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { // Data var wg errgroup.Group @@ -80,17 +80,17 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { // Load data wg.Go(func() error { var err error - status, err = mp.GetStatus() + status, err = mp.GetStatus(opts) return err }) wg.Go(func() error { var err error - statusBlock, err = mp.GetStatusBlock() + statusBlock, err = mp.GetStatusBlock(opts) return err }) wg.Go(func() error { var err error - statusTime, err = mp.GetStatusTime() + statusTime, err = mp.GetStatusTime(opts) return err }) @@ -107,23 +107,23 @@ func (mp *Minipool) GetStatusDetails() (StatusDetails, error) { }, nil } -func (mp *Minipool) GetStatus() (rptypes.MinipoolStatus, error) { +func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(rptypes.MinipoolStatus) - if err := mp.Contract.Call(nil, status, "getStatus"); err != nil { + if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return *status, nil } -func (mp *Minipool) GetStatusBlock() (int64, error) { +func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (int64, error) { statusBlock := new(*big.Int) - if err := mp.Contract.Call(nil, statusBlock, "getStatusBlock"); err != nil { + if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Int64(), nil } -func (mp *Minipool) GetStatusTime() (time.Time, error) { +func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) - if err := mp.Contract.Call(nil, statusTime, "getStatusTime"); err != nil { + if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil @@ -131,9 +131,9 @@ func (mp *Minipool) GetStatusTime() (time.Time, error) { // Get deposit type -func (mp *Minipool) GetDepositType() (rptypes.MinipoolDeposit, error) { +func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(rptypes.MinipoolDeposit) - if err := mp.Contract.Call(nil, depositType, "getDepositType"); err != nil { + if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) } return *depositType, nil @@ -141,7 +141,7 @@ func (mp *Minipool) GetDepositType() (rptypes.MinipoolDeposit, error) { // Get node details -func (mp *Minipool) GetNodeDetails() (NodeDetails, error) { +func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -154,27 +154,27 @@ func (mp *Minipool) GetNodeDetails() (NodeDetails, error) { // Load data wg.Go(func() error { var err error - address, err = mp.GetNodeAddress() + address, err = mp.GetNodeAddress(opts) return err }) wg.Go(func() error { var err error - fee, err = mp.GetNodeFee() + fee, err = mp.GetNodeFee(opts) return err }) wg.Go(func() error { var err error - depositBalance, err = mp.GetNodeDepositBalance() + depositBalance, err = mp.GetNodeDepositBalance(opts) return err }) wg.Go(func() error { var err error - refundBalance, err = mp.GetNodeRefundBalance() + refundBalance, err = mp.GetNodeRefundBalance(opts) return err }) wg.Go(func() error { var err error - depositAssigned, err = mp.GetNodeDepositAssigned() + depositAssigned, err = mp.GetNodeDepositAssigned(opts) return err }) @@ -193,37 +193,37 @@ func (mp *Minipool) GetNodeDetails() (NodeDetails, error) { }, nil } -func (mp *Minipool) GetNodeAddress() (common.Address, error) { +func (mp *Minipool) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) - if err := mp.Contract.Call(nil, nodeAddress, "getNodeAddress"); err != nil { + if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } -func (mp *Minipool) GetNodeFee() (float64, error) { +func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) - if err := mp.Contract.Call(nil, nodeFee, "getNodeFee"); err != nil { + if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } -func (mp *Minipool) GetNodeDepositBalance() (*big.Int, error) { +func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) - if err := mp.Contract.Call(nil, nodeDepositBalance, "getNodeDepositBalance"); err != nil { + if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } -func (mp *Minipool) GetNodeRefundBalance() (*big.Int, error) { +func (mp *Minipool) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) - if err := mp.Contract.Call(nil, nodeRefundBalance, "getNodeRefundBalance"); err != nil { + if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } -func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { +func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) - if err := mp.Contract.Call(nil, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { + if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil @@ -231,7 +231,7 @@ func (mp *Minipool) GetNodeDepositAssigned() (bool, error) { // Get user deposit details -func (mp *Minipool) GetUserDetails() (UserDetails, error) { +func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Data var wg errgroup.Group @@ -242,17 +242,17 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { // Load data wg.Go(func() error { var err error - depositBalance, err = mp.GetUserDepositBalance() + depositBalance, err = mp.GetUserDepositBalance(opts) return err }) wg.Go(func() error { var err error - depositAssigned, err = mp.GetUserDepositAssigned() + depositAssigned, err = mp.GetUserDepositAssigned(opts) return err }) wg.Go(func() error { var err error - depositAssignedTime, err = mp.GetUserDepositAssignedTime() + depositAssignedTime, err = mp.GetUserDepositAssignedTime(opts) return err }) @@ -269,23 +269,23 @@ func (mp *Minipool) GetUserDetails() (UserDetails, error) { }, nil } -func (mp *Minipool) GetUserDepositBalance() (*big.Int, error) { +func (mp *Minipool) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) - if err := mp.Contract.Call(nil, userDepositBalance, "getUserDepositBalance"); err != nil { + if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } -func (mp *Minipool) GetUserDepositAssigned() (bool, error) { +func (mp *Minipool) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) - if err := mp.Contract.Call(nil, userDepositAssigned, "getUserDepositAssigned"); err != nil { + if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } -func (mp *Minipool) GetUserDepositAssignedTime() (time.Time, error) { +func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) - if err := mp.Contract.Call(nil, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { + if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) } return time.Unix((*depositAssignedTime).Int64(), 0), nil @@ -293,7 +293,7 @@ func (mp *Minipool) GetUserDepositAssignedTime() (time.Time, error) { // Get staking details -func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { +func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, error) { // Data var wg errgroup.Group @@ -303,12 +303,12 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { // Load data wg.Go(func() error { var err error - startBalance, err = mp.GetStakingStartBalance() + startBalance, err = mp.GetStakingStartBalance(opts) return err }) wg.Go(func() error { var err error - endBalance, err = mp.GetStakingEndBalance() + endBalance, err = mp.GetStakingEndBalance(opts) return err }) @@ -324,16 +324,16 @@ func (mp *Minipool) GetStakingDetails() (StakingDetails, error) { }, nil } -func (mp *Minipool) GetStakingStartBalance() (*big.Int, error) { +func (mp *Minipool) GetStakingStartBalance(opts *bind.CallOpts) (*big.Int, error) { stakingStartBalance := new(*big.Int) - if err := mp.Contract.Call(nil, stakingStartBalance, "getStakingStartBalance"); err != nil { + if err := mp.Contract.Call(opts, stakingStartBalance, "getStakingStartBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s staking start balance: %w", mp.Address.Hex(), err) } return *stakingStartBalance, nil } -func (mp *Minipool) GetStakingEndBalance() (*big.Int, error) { +func (mp *Minipool) GetStakingEndBalance(opts *bind.CallOpts) (*big.Int, error) { stakingEndBalance := new(*big.Int) - if err := mp.Contract.Call(nil, stakingEndBalance, "getStakingEndBalance"); err != nil { + if err := mp.Contract.Call(opts, stakingEndBalance, "getStakingEndBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s staking end balance: %w", mp.Address.Hex(), err) } return *stakingEndBalance, nil diff --git a/minipool/minipool.go b/minipool/minipool.go index c5b7ef73b..22fc35207 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -30,10 +30,10 @@ type MinipoolDetails struct { // Get all minipool details -func GetMinipools(rp *rocketpool.RocketPool) ([]MinipoolDetails, error) { +func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { // Get minipool addresses - minipoolAddresses, err := GetMinipoolAddresses(rp) + minipoolAddresses, err := GetMinipoolAddresses(rp, opts) if err != nil { return []MinipoolDetails{}, err } @@ -46,7 +46,7 @@ func GetMinipools(rp *rocketpool.RocketPool) ([]MinipoolDetails, error) { for mi, minipoolAddress := range minipoolAddresses { mi, minipoolAddress := mi, minipoolAddress wg.Go(func() error { - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress) + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) if err == nil { details[mi] = minipoolDetails } return err }) @@ -64,10 +64,10 @@ func GetMinipools(rp *rocketpool.RocketPool) ([]MinipoolDetails, error) { // Get all minipool addresses -func GetMinipoolAddresses(rp *rocketpool.RocketPool) ([]common.Address, error) { +func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count - minipoolCount, err := GetMinipoolCount(rp) + minipoolCount, err := GetMinipoolCount(rp, opts) if err != nil { return []common.Address{}, err } @@ -80,7 +80,7 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool) ([]common.Address, error) { for mi := int64(0); mi < minipoolCount; mi++ { mi := mi wg.Go(func() error { - address, err := GetMinipoolAt(rp, mi) + address, err := GetMinipoolAt(rp, mi, opts) if err == nil { addresses[mi] = address } return err }) @@ -98,10 +98,10 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool) ([]common.Address, error) { // Get a node's minipool details -func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]MinipoolDetails, error) { +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { // Get minipool addresses - minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress) + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) if err != nil { return []MinipoolDetails{}, err } @@ -114,7 +114,7 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([] for mi, minipoolAddress := range minipoolAddresses { mi, minipoolAddress := mi, minipoolAddress wg.Go(func() error { - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress) + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) if err == nil { details[mi] = minipoolDetails } return err }) @@ -132,10 +132,10 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address) ([] // Get a node's minipool addresses -func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address) ([]common.Address, error) { +func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count - minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress) + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) if err != nil { return []common.Address{}, err } @@ -148,7 +148,7 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr for mi := int64(0); mi < minipoolCount; mi++ { mi := mi wg.Go(func() error { - address, err := GetNodeMinipoolAt(rp, nodeAddress, mi) + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) if err == nil { addresses[mi] = address } return err }) @@ -166,7 +166,7 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr // Get a minipool's details -func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address) (MinipoolDetails, error) { +func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (MinipoolDetails, error) { // Data var wg errgroup.Group @@ -180,32 +180,32 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Load data wg.Go(func() error { var err error - exists, err = GetMinipoolExists(rp, minipoolAddress) + exists, err = GetMinipoolExists(rp, minipoolAddress, opts) return err }) wg.Go(func() error { var err error - pubkey, err = GetMinipoolPubkey(rp, minipoolAddress) + pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) return err }) wg.Go(func() error { var err error - withdrawalTotalBalance, err = GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress) + withdrawalTotalBalance, err = GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress, opts) return err }) wg.Go(func() error { var err error - withdrawalNodeBalance, err = GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress) + withdrawalNodeBalance, err = GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress, opts) return err }) wg.Go(func() error { var err error - withdrawable, err = GetMinipoolWithdrawable(rp, minipoolAddress) + withdrawable, err = GetMinipoolWithdrawable(rp, minipoolAddress, opts) return err }) wg.Go(func() error { var err error - withdrawalProcessed, err = GetMinipoolWithdrawalProcessed(rp, minipoolAddress) + withdrawalProcessed, err = GetMinipoolWithdrawalProcessed(rp, minipoolAddress, opts) return err }) @@ -229,13 +229,13 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Get the minipool count -func GetMinipoolCount(rp *rocketpool.RocketPool) (int64, error) { +func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return 0, err } minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(nil, minipoolCount, "getMinipoolCount"); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { return 0, fmt.Errorf("Could not get minipool count: %w", err) } return (*minipoolCount).Int64(), nil @@ -243,13 +243,13 @@ func GetMinipoolCount(rp *rocketpool.RocketPool) (int64, error) { // Get a minipool address by index -func GetMinipoolAt(rp *rocketpool.RocketPool, index int64) (common.Address, error) { +func GetMinipoolAt(rp *rocketpool.RocketPool, index int64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolAt", big.NewInt(index)); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(index)); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) } return *minipoolAddress, nil @@ -257,13 +257,13 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index int64) (common.Address, erro // Get a node's minipool count -func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) (int64, error) { +func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (int64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return 0, err } minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(nil, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Int64(), nil @@ -271,13 +271,13 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address) // Get a node's minipool address by index -func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index int64) (common.Address, error) { +func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index int64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil @@ -285,13 +285,13 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in // Get a minipool address by validator pubkey -func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey) (common.Address, error) { +func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(nil, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) } return *minipoolAddress, nil @@ -299,13 +299,13 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk // Check whether a minipool exists -func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { +func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return false, err } exists := new(bool) - if err := rocketMinipoolManager.Call(nil, exists, "getMinipoolExists", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) } return *exists, nil @@ -313,13 +313,13 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get a minipool's validator pubkey -func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address) (rptypes.ValidatorPubkey, error) { +func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (rptypes.ValidatorPubkey, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return rptypes.ValidatorPubkey{}, err } pubkey := new(rptypes.ValidatorPubkey) - if err := rocketMinipoolManager.Call(nil, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) } return *pubkey, nil @@ -327,13 +327,13 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get a minipool's total balance at withdrawal -func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*big.Int, error) { +func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return nil, err } balance := new(*big.Int) - if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalTotalBalance", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, balance, "getMinipoolWithdrawalTotalBalance", minipoolAddress); err != nil { return nil, fmt.Errorf("Could not get minipool %s withdrawal total balance: %w", minipoolAddress.Hex(), err) } return *balance, nil @@ -341,13 +341,13 @@ func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddres // Get a minipool's node balance at withdrawal -func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*big.Int, error) { +func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return nil, err } balance := new(*big.Int) - if err := rocketMinipoolManager.Call(nil, balance, "getMinipoolWithdrawalNodeBalance", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, balance, "getMinipoolWithdrawalNodeBalance", minipoolAddress); err != nil { return nil, fmt.Errorf("Could not get minipool %s withdrawal node balance: %w", minipoolAddress.Hex(), err) } return *balance, nil @@ -355,13 +355,13 @@ func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress // Check whether a minipool is withdrawable -func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { +func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return false, err } withdrawable := new(bool) - if err := rocketMinipoolManager.Call(nil, withdrawable, "getMinipoolWithdrawable", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, withdrawable, "getMinipoolWithdrawable", minipoolAddress); err != nil { return false, fmt.Errorf("Could not get minipool %s withdrawable status: %w", minipoolAddress.Hex(), err) } return *withdrawable, nil @@ -369,13 +369,13 @@ func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.A // Check whether a minipool's validator withdrawal has been processed -func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress common.Address) (bool, error) { +func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return false, err } processed := new(bool) - if err := rocketMinipoolManager.Call(nil, processed, "getMinipoolWithdrawalProcessed", minipoolAddress); err != nil { + if err := rocketMinipoolManager.Call(opts, processed, "getMinipoolWithdrawalProcessed", minipoolAddress); err != nil { return false, fmt.Errorf("Could not get minipool %s withdrawal processed status: %w", minipoolAddress.Hex(), err) } return *processed, nil @@ -383,13 +383,13 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c // Get the total length of the minipool queue -func GetQueueTotalLength(rp *rocketpool.RocketPool) (int64, error) { +func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) if err != nil { return 0, err } length := new(*big.Int) - if err := rocketMinipoolQueue.Call(nil, length, "getTotalLength"); err != nil { + if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) } return (*length).Int64(), nil @@ -397,13 +397,13 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool) (int64, error) { // Get the total capacity of the minipool queue -func GetQueueTotalCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) if err != nil { return nil, err } capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(nil, capacity, "getTotalCapacity"); err != nil { + if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) } return *capacity, nil @@ -411,13 +411,13 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { // Get the capacity of the next minipool in the queue -func GetQueueNextCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) if err != nil { return nil, err } capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(nil, capacity, "getNextCapacity"); err != nil { + if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) } return *capacity, nil @@ -425,13 +425,13 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool) (*big.Int, error) { // Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances -func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int) (*big.Int, error) { +func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { return nil, err } nodeAmount := new(*big.Int) - if err := rocketMinipoolStatus.Call(nil, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { + if err := rocketMinipoolStatus.Call(opts, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { return nil, fmt.Errorf("Could not get minipool node reward amount: %w", err) } return *nodeAmount, nil diff --git a/network/network.go b/network/network.go index db478a8a1..676d63a98 100644 --- a/network/network.go +++ b/network/network.go @@ -17,13 +17,13 @@ import ( // Get the current network node commission rate -func GetNodeFee(rp *rocketpool.RocketPool) (float64, error) { +func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkFees, err := getRocketNetworkFees(rp) if err != nil { return 0, err } nodeFee := new(*big.Int) - if err := rocketNetworkFees.Call(nil, nodeFee, "getNodeFee"); err != nil { + if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get network node fee: %w", err) } return eth.WeiToEth(*nodeFee), nil @@ -31,13 +31,13 @@ func GetNodeFee(rp *rocketpool.RocketPool) (float64, error) { // Get the withdrawal pool balance -func GetWithdrawalBalance(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetWithdrawalBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { return nil, err } balance := new(*big.Int) - if err := rocketNetworkWithdrawal.Call(nil, balance, "getBalance"); err != nil { + if err := rocketNetworkWithdrawal.Call(opts, balance, "getBalance"); err != nil { return nil, fmt.Errorf("Could not get withdrawal pool balance: %w", err) } return *balance, nil @@ -45,13 +45,13 @@ func GetWithdrawalBalance(rp *rocketpool.RocketPool) (*big.Int, error) { // Get the current network validator withdrawal credentials -func GetWithdrawalCredentials(rp *rocketpool.RocketPool) (common.Hash, error) { +func GetWithdrawalCredentials(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Hash, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { return common.Hash{}, err } withdrawalCredentials := new(common.Hash) - if err := rocketNetworkWithdrawal.Call(nil, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { + if err := rocketNetworkWithdrawal.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { return common.Hash{}, fmt.Errorf("Could not get network withdrawal credentials: %w", err) } return *withdrawalCredentials, nil diff --git a/node/node.go b/node/node.go index aff8f1fbe..f3c60280c 100644 --- a/node/node.go +++ b/node/node.go @@ -24,7 +24,7 @@ type NodeDetails struct { // Get a node's details -func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (NodeDetails, error) { +func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -35,17 +35,17 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (Node // Load data wg.Go(func() error { var err error - exists, err = GetNodeExists(rp, nodeAddress) + exists, err = GetNodeExists(rp, nodeAddress, opts) return err }) wg.Go(func() error { var err error - trusted, err = GetNodeTrusted(rp, nodeAddress) + trusted, err = GetNodeTrusted(rp, nodeAddress, opts) return err }) wg.Go(func() error { var err error - timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress) + timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) return err }) @@ -65,13 +65,13 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address) (Node // Check whether a node exists -func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { +func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return false, err } exists := new(bool) - if err := rocketNodeManager.Call(nil, exists, "getNodeExists", nodeAddress); err != nil { + if err := rocketNodeManager.Call(opts, exists, "getNodeExists", nodeAddress); err != nil { return false, fmt.Errorf("Could not get node %s exists status: %w", nodeAddress.Hex(), err) } return *exists, nil @@ -79,13 +79,13 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, // Get a node's trusted status -func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool, error) { +func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return false, err } trusted := new(bool) - if err := rocketNodeManager.Call(nil, trusted, "getNodeTrusted", nodeAddress); err != nil { + if err := rocketNodeManager.Call(opts, trusted, "getNodeTrusted", nodeAddress); err != nil { return false, fmt.Errorf("Could not get node %s trusted status: %w", nodeAddress.Hex(), err) } return *trusted, nil @@ -93,13 +93,13 @@ func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address) (bool // Get a node's timezone location -func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address) (string, error) { +func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return "", err } timezoneLocation := new(string) - if err := rocketNodeManager.Call(nil, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { + if err := rocketNodeManager.Call(opts, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) } return *timezoneLocation, nil diff --git a/settings/deposit.go b/settings/deposit.go index bca4ab6e1..d07df71fd 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -12,13 +12,13 @@ import ( // Deposit assignments currently enabled -func GetAssignDepositsEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return false, err } assignDepositsEnabled := new(bool) - if err := rocketDepositSettings.Call(nil, assignDepositsEnabled, "getAssignDepositsEnabled"); err != nil { + if err := rocketDepositSettings.Call(opts, assignDepositsEnabled, "getAssignDepositsEnabled"); err != nil { return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) } return *assignDepositsEnabled, nil @@ -26,13 +26,13 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool) (bool, error) { // Maximum deposit assignments per transaction -func GetMaximumDepositAssignments(rp *rocketpool.RocketPool) (int64, error) { +func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return 0, err } maximumDepositAssignments := new(*big.Int) - if err := rocketDepositSettings.Call(nil, maximumDepositAssignments, "getMaximumDepositAssignments"); err != nil { + if err := rocketDepositSettings.Call(opts, maximumDepositAssignments, "getMaximumDepositAssignments"); err != nil { return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) } return (*maximumDepositAssignments).Int64(), nil diff --git a/settings/minipool.go b/settings/minipool.go index bd5a5579c..4f36c7964 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -12,35 +12,35 @@ import ( // Required node deposit amounts -func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } fullDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(nil, fullDepositNodeAmount, "getFullDepositNodeAmount"); err != nil { + if err := rocketMinipoolSettings.Call(opts, fullDepositNodeAmount, "getFullDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) } return *fullDepositNodeAmount, nil } -func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } halfDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(nil, halfDepositNodeAmount, "getHalfDepositNodeAmount"); err != nil { + if err := rocketMinipoolSettings.Call(opts, halfDepositNodeAmount, "getHalfDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) } return *halfDepositNodeAmount, nil } -func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, error) { +func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } emptyDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(nil, emptyDepositNodeAmount, "getEmptyDepositNodeAmount"); err != nil { + if err := rocketMinipoolSettings.Call(opts, emptyDepositNodeAmount, "getEmptyDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) } return *emptyDepositNodeAmount, nil @@ -48,13 +48,13 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool) (*big.Int, err // Minipool withdrawable event submissions currently enabled -func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return false, err } submitWithdrawableEnabled := new(bool) - if err := rocketMinipoolSettings.Call(nil, submitWithdrawableEnabled, "getSubmitWithdrawableEnabled"); err != nil { + if err := rocketMinipoolSettings.Call(opts, submitWithdrawableEnabled, "getSubmitWithdrawableEnabled"); err != nil { return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) } return *submitWithdrawableEnabled, nil @@ -62,13 +62,13 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool) (bool, erro // Timeout period in blocks for prelaunch minipools to launch -func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool) (int64, error) { +func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return 0, err } launchTimeout := new(*big.Int) - if err := rocketMinipoolSettings.Call(nil, launchTimeout, "getLaunchTimeout"); err != nil { + if err := rocketMinipoolSettings.Call(opts, launchTimeout, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } return (*launchTimeout).Int64(), nil @@ -76,13 +76,13 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool) (int64, error) { // Withdrawal delay in blocks before withdrawable minipools can be closed -func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool) (int64, error) { +func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return 0, err } withdrawalDelay := new(*big.Int) - if err := rocketMinipoolSettings.Call(nil, withdrawalDelay, "getWithdrawalDelay"); err != nil { + if err := rocketMinipoolSettings.Call(opts, withdrawalDelay, "getWithdrawalDelay"); err != nil { return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) } return (*withdrawalDelay).Int64(), nil diff --git a/settings/network.go b/settings/network.go index 321eedb06..89a2d5957 100644 --- a/settings/network.go +++ b/settings/network.go @@ -13,13 +13,13 @@ import ( // Network balance submissions currently enabled -func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return false, err } submitBalancesEnabled := new(bool) - if err := rocketNetworkSettings.Call(nil, submitBalancesEnabled, "getSubmitBalancesEnabled"); err != nil { + if err := rocketNetworkSettings.Call(opts, submitBalancesEnabled, "getSubmitBalancesEnabled"); err != nil { return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) } return *submitBalancesEnabled, nil @@ -27,13 +27,13 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool) (bool, error) { // The frequency in blocks at which network balances should be submitted by trusted nodes -func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool) (int64, error) { +func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } submitBalancesFrequency := new(*big.Int) - if err := rocketNetworkSettings.Call(nil, submitBalancesFrequency, "getSubmitBalancesFrequency"); err != nil { + if err := rocketNetworkSettings.Call(opts, submitBalancesFrequency, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) } return (*submitBalancesFrequency).Int64(), nil @@ -41,13 +41,13 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool) (int64, error) { // Processing validator withdrawals currently enabled -func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return false, err } processWithdrawalsEnabled := new(bool) - if err := rocketNetworkSettings.Call(nil, processWithdrawalsEnabled, "getProcessWithdrawalsEnabled"); err != nil { + if err := rocketNetworkSettings.Call(opts, processWithdrawalsEnabled, "getProcessWithdrawalsEnabled"); err != nil { return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) } return *processWithdrawalsEnabled, nil @@ -55,35 +55,35 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool) (bool, error) { // Node commission rate parameters -func GetMinimumNodeFee(rp *rocketpool.RocketPool) (float64, error) { +func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } minimumNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(nil, minimumNodeFee, "getMinimumNodeFee"); err != nil { + if err := rocketNetworkSettings.Call(opts, minimumNodeFee, "getMinimumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minimum node fee: %w", err) } return eth.WeiToEth(*minimumNodeFee), nil } -func GetTargetNodeFee(rp *rocketpool.RocketPool) (float64, error) { +func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } targetNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(nil, targetNodeFee, "getTargetNodeFee"); err != nil { + if err := rocketNetworkSettings.Call(opts, targetNodeFee, "getTargetNodeFee"); err != nil { return 0, fmt.Errorf("Could not get target node fee: %w", err) } return eth.WeiToEth(*targetNodeFee), nil } -func GetMaximumNodeFee(rp *rocketpool.RocketPool) (float64, error) { +func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } maximumNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(nil, maximumNodeFee, "getMaximumNodeFee"); err != nil { + if err := rocketNetworkSettings.Call(opts, maximumNodeFee, "getMaximumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get maximum node fee: %w", err) } return eth.WeiToEth(*maximumNodeFee), nil diff --git a/settings/node.go b/settings/node.go index b1fb82b0c..2f82138ca 100644 --- a/settings/node.go +++ b/settings/node.go @@ -11,13 +11,13 @@ import ( // Node registrations currently enabled -func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketNodeSettings, err := getRocketNodeSettings(rp) if err != nil { return false, err } registrationEnabled := new(bool) - if err := rocketNodeSettings.Call(nil, registrationEnabled, "getRegistrationEnabled"); err != nil { + if err := rocketNodeSettings.Call(opts, registrationEnabled, "getRegistrationEnabled"); err != nil { return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) } return *registrationEnabled, nil @@ -25,13 +25,13 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool) (bool, error) { // Node deposits currently enabled -func GetNodeDepositEnabled(rp *rocketpool.RocketPool) (bool, error) { +func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketNodeSettings, err := getRocketNodeSettings(rp) if err != nil { return false, err } depositEnabled := new(bool) - if err := rocketNodeSettings.Call(nil, depositEnabled, "getDepositEnabled"); err != nil { + if err := rocketNodeSettings.Call(opts, depositEnabled, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) } return *depositEnabled, nil diff --git a/tokens/neth.go b/tokens/neth.go index c27cb14da..0082b45b8 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -15,12 +15,12 @@ import ( // Get nETH balance -func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address) (*big.Int, error) { +func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeETHToken, err := getRocketNodeETHToken(rp) if err != nil { return nil, err } - return balanceOf(rocketNodeETHToken, "nETH", address) + return balanceOf(rocketNodeETHToken, "nETH", address, opts) } diff --git a/tokens/tokens.go b/tokens/tokens.go index f84158327..e392098d3 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -24,7 +24,7 @@ type Balances struct { // Get token balances of an address -func GetBalances(rp *rocketpool.RocketPool, address common.Address) (Balances, error) { +func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Balances, error) { // Data var wg errgroup.Group @@ -34,12 +34,14 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address) (Balances, e // Load data wg.Go(func() error { var err error - ethBalance, err = rp.Client.BalanceAt(context.Background(), address, nil) + var blockNumber *big.Int + if opts != nil { blockNumber = opts.BlockNumber } + ethBalance, err = rp.Client.BalanceAt(context.Background(), address, blockNumber) return err }) wg.Go(func() error { var err error - nethBalance, err = GetNETHBalance(rp, address) + nethBalance, err = GetNETHBalance(rp, address, opts) return err }) @@ -58,9 +60,9 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address) (Balances, e // Get a token balance -func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address) (*big.Int, error) { +func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { balance := new(*big.Int) - if err := tokenContract.Call(nil, balance, "balanceOf", address); err != nil { + if err := tokenContract.Call(opts, balance, "balanceOf", address); err != nil { return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) } return *balance, nil From 7c8e11e52a5b2ff63afda7ed7a15a27f44b7675b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 28 Jul 2020 16:31:57 +1000 Subject: [PATCH 070/878] added network balances block getter --- network/network.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/network/network.go b/network/network.go index 676d63a98..ceb6b4542 100644 --- a/network/network.go +++ b/network/network.go @@ -16,6 +16,20 @@ import ( ) +// Get the block number which network balances are current for +func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return 0, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network balances block: %w", err) + } + return (*balancesBlock).Int64(), nil +} + + // Get the current network node commission rate func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkFees, err := getRocketNetworkFees(rp) From 62f21cfd6caf038c563e1df649090c552fb7a46f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 29 Jul 2020 10:34:36 +1000 Subject: [PATCH 071/878] added token total supply getter --- tokens/reth.go | 30 ++++++++++++++++++++++++++++++ tokens/tokens.go | 16 ++++++++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tokens/reth.go diff --git a/tokens/reth.go b/tokens/reth.go new file mode 100644 index 000000000..94d4a4424 --- /dev/null +++ b/tokens/reth.go @@ -0,0 +1,30 @@ +package tokens + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get rETH total supply +func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketETHToken, "rETH", opts) +} + + +// Get contracts +var rocketETHTokenLock sync.Mutex +func getRocketETHToken(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketETHTokenLock.Lock() + defer rocketETHTokenLock.Unlock() + return rp.GetContract("rocketETHToken") +} + diff --git a/tokens/tokens.go b/tokens/tokens.go index e392098d3..fb74a91c9 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -26,6 +26,10 @@ type Balances struct { // Get token balances of an address func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Balances, error) { + // Get call options block number + var blockNumber *big.Int + if opts != nil { blockNumber = opts.BlockNumber } + // Data var wg errgroup.Group var ethBalance *big.Int @@ -34,8 +38,6 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Load data wg.Go(func() error { var err error - var blockNumber *big.Int - if opts != nil { blockNumber = opts.BlockNumber } ethBalance, err = rp.Client.BalanceAt(context.Background(), address, blockNumber) return err }) @@ -59,6 +61,16 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } +// Get a token's total supply +func totalSupply(tokenContract *bind.BoundContract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { + totalSupply := new(*big.Int) + if err := tokenContract.Call(opts, totalSupply, "totalSupply"); err != nil { + return nil, fmt.Errorf("Could not get %s total supply: %w", tokenName, err) + } + return *totalSupply, nil +} + + // Get a token balance func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { balance := new(*big.Int) From 30e7e305647859700e2c4ea4fa64b9c9e2c90e01 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 3 Aug 2020 15:34:10 +1000 Subject: [PATCH 072/878] updated types --- minipool/minipool-contract.go | 8 ++++---- minipool/minipool.go | 24 ++++++++++++------------ network/network.go | 4 ++-- settings/deposit.go | 4 ++-- settings/minipool.go | 8 ++++---- settings/network.go | 4 ++-- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index ea130913c..deeeaf90b 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -21,7 +21,7 @@ import ( // Minipool detail types type StatusDetails struct { Status rptypes.MinipoolStatus `json:"status"` - StatusBlock int64 `json:"statusBlock"` + StatusBlock uint64 `json:"statusBlock"` StatusTime time.Time `json:"statusTime"` } type NodeDetails struct { @@ -74,7 +74,7 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) // Data var wg errgroup.Group var status rptypes.MinipoolStatus - var statusBlock int64 + var statusBlock uint64 var statusTime time.Time // Load data @@ -114,12 +114,12 @@ func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, erro } return *status, nil } -func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (int64, error) { +func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } - return (*statusBlock).Int64(), nil + return (*statusBlock).Uint64(), nil } func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) diff --git a/minipool/minipool.go b/minipool/minipool.go index 22fc35207..1d8f2ed70 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -77,7 +77,7 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com addresses := make([]common.Address, minipoolCount) // Load addresses - for mi := int64(0); mi < minipoolCount; mi++ { + for mi := uint64(0); mi < minipoolCount; mi++ { mi := mi wg.Go(func() error { address, err := GetMinipoolAt(rp, mi, opts) @@ -145,7 +145,7 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr addresses := make([]common.Address, minipoolCount) // Load addresses - for mi := int64(0); mi < minipoolCount; mi++ { + for mi := uint64(0); mi < minipoolCount; mi++ { mi := mi wg.Go(func() error { address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) @@ -229,7 +229,7 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Get the minipool count -func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return 0, err @@ -238,18 +238,18 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, er if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { return 0, fmt.Errorf("Could not get minipool count: %w", err) } - return (*minipoolCount).Int64(), nil + return (*minipoolCount).Uint64(), nil } // Get a minipool address by index -func GetMinipoolAt(rp *rocketpool.RocketPool, index int64, opts *bind.CallOpts) (common.Address, error) { +func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(index)); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) } return *minipoolAddress, nil @@ -257,7 +257,7 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index int64, opts *bind.CallOpts) // Get a node's minipool count -func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (int64, error) { +func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return 0, err @@ -266,18 +266,18 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) } - return (*minipoolCount).Int64(), nil + return (*minipoolCount).Uint64(), nil } // Get a node's minipool address by index -func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index int64, opts *bind.CallOpts) (common.Address, error) { +func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(index)); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil @@ -383,7 +383,7 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c // Get the total length of the minipool queue -func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) if err != nil { return 0, err @@ -392,7 +392,7 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) } - return (*length).Int64(), nil + return (*length).Uint64(), nil } diff --git a/network/network.go b/network/network.go index ceb6b4542..416eb1a10 100644 --- a/network/network.go +++ b/network/network.go @@ -17,7 +17,7 @@ import ( // Get the block number which network balances are current for -func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { return 0, err @@ -26,7 +26,7 @@ func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, er if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { return 0, fmt.Errorf("Could not get network balances block: %w", err) } - return (*balancesBlock).Int64(), nil + return (*balancesBlock).Uint64(), nil } diff --git a/settings/deposit.go b/settings/deposit.go index d07df71fd..baaa9f626 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -26,7 +26,7 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b // Maximum deposit assignments per transaction -func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return 0, err @@ -35,7 +35,7 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts if err := rocketDepositSettings.Call(opts, maximumDepositAssignments, "getMaximumDepositAssignments"); err != nil { return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) } - return (*maximumDepositAssignments).Int64(), nil + return (*maximumDepositAssignments).Uint64(), nil } diff --git a/settings/minipool.go b/settings/minipool.go index 4f36c7964..b1ddd01b2 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -62,7 +62,7 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. // Timeout period in blocks for prelaunch minipools to launch -func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return 0, err @@ -71,12 +71,12 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (i if err := rocketMinipoolSettings.Call(opts, launchTimeout, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } - return (*launchTimeout).Int64(), nil + return (*launchTimeout).Uint64(), nil } // Withdrawal delay in blocks before withdrawable minipools can be closed -func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return 0, err @@ -85,7 +85,7 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err := rocketMinipoolSettings.Call(opts, withdrawalDelay, "getWithdrawalDelay"); err != nil { return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) } - return (*withdrawalDelay).Int64(), nil + return (*withdrawalDelay).Uint64(), nil } diff --git a/settings/network.go b/settings/network.go index 89a2d5957..7ec50b868 100644 --- a/settings/network.go +++ b/settings/network.go @@ -27,7 +27,7 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b // The frequency in blocks at which network balances should be submitted by trusted nodes -func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (int64, error) { +func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err @@ -36,7 +36,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err := rocketNetworkSettings.Call(opts, submitBalancesFrequency, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) } - return (*submitBalancesFrequency).Int64(), nil + return (*submitBalancesFrequency).Uint64(), nil } From 700d84f4679e295ca4308ea9e798747178d4797d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 3 Aug 2020 15:36:28 +1000 Subject: [PATCH 073/878] updated types --- network/network.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/network/network.go b/network/network.go index 416eb1a10..319fad1ed 100644 --- a/network/network.go +++ b/network/network.go @@ -73,12 +73,12 @@ func GetWithdrawalCredentials(rp *rocketpool.RocketPool, opts *bind.CallOpts) (c // Submit network balances for an epoch -func SubmitBalances(rp *rocketpool.RocketPool, block int64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(block), totalEth, stakingEth, rethSupply) + txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) if err != nil { return nil, fmt.Errorf("Could not submit network balances: %w", err) } From 59fe0867d434deb7eee51f7f9fb17bf189ea40a3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 12 Aug 2020 13:52:16 +1000 Subject: [PATCH 074/878] minor type fixes --- minipool/minipool.go | 2 +- network/network.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 1d8f2ed70..5a15f2c66 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -291,7 +291,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk return common.Address{}, err } minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey); err != nil { + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) } return *minipoolAddress, nil diff --git a/network/network.go b/network/network.go index 319fad1ed..56b103223 100644 --- a/network/network.go +++ b/network/network.go @@ -92,7 +92,7 @@ func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.Valida if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey) + txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey[:]) if err != nil { return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", validatorPubkey.Hex(), err) } From ee1743e8d2f0d070cfa89230c9835017e421cecd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 12 Aug 2020 15:19:43 +1000 Subject: [PATCH 075/878] added node validating pubkeys getter --- minipool/minipool.go | 69 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 5a15f2c66..c8d96aa9d 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -165,6 +165,47 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr } +// Get a node's validating minipool pubkeys +func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) { + + // Get minipool count + minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + // Data + var wg errgroup.Group + pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) + + // Load pubkeys + for mi := uint64(0); mi < minipoolCount; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) + if err != nil { + return err + } + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) + if err != nil { + return err + } + pubkeys[mi] = pubkey + return nil + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + // Return + return pubkeys, nil + +} + + // Get a minipool's details func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (MinipoolDetails, error) { @@ -284,6 +325,34 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } +// Get a node's validating minipool count +func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + + +// Get a node's validating minipool address by index +func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil +} + + // Get a minipool address by validator pubkey func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) From 5dda9748ddfd2569a6d2f8028a51a6ce65f3c2df Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 13 Aug 2020 11:33:53 +1000 Subject: [PATCH 076/878] custom type JSON encoding fixes --- types/beacon.go | 13 +++++++++---- types/minipool.go | 21 +++++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/types/beacon.go b/types/beacon.go index 2a3a3508c..ebec99712 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -2,6 +2,7 @@ package types import ( "encoding/hex" + "encoding/json" ) @@ -39,10 +40,12 @@ func HexToValidatorPubkey(value string) (ValidatorPubkey, error) { // JSON encoding func (v ValidatorPubkey) MarshalJSON() ([]byte, error) { - return []byte(v.Hex()), nil + return json.Marshal(v.Hex()) } func (v *ValidatorPubkey) UnmarshalJSON(data []byte) error { - pubkey, err := HexToValidatorPubkey(string(data)) + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { return err } + pubkey, err := HexToValidatorPubkey(dataStr) if err == nil { *v = pubkey } return err } @@ -82,10 +85,12 @@ func HexToValidatorSignature(value string) (ValidatorSignature, error) { // JSON encoding func (v ValidatorSignature) MarshalJSON() ([]byte, error) { - return []byte(v.Hex()), nil + return json.Marshal(v.Hex()) } func (v *ValidatorSignature) UnmarshalJSON(data []byte) error { - signature, err := HexToValidatorSignature(string(data)) + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { return err } + signature, err := HexToValidatorSignature(dataStr) if err == nil { *v = signature } return err } diff --git a/types/minipool.go b/types/minipool.go index 3d7577a09..f711733d2 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -1,6 +1,7 @@ package types import ( + "encoding/json" "fmt" ) @@ -33,11 +34,15 @@ func StringToMinipoolStatus(value string) (MinipoolStatus, error) { // JSON encoding func (s MinipoolStatus) MarshalJSON() ([]byte, error) { str := s.String() - if str == "" { return []byte{}, fmt.Errorf("Invalid minipool status '%d'", s) } - return []byte(str), nil + if str == "" { + return []byte{}, fmt.Errorf("Invalid minipool status '%d'", s) + } + return json.Marshal(str) } func (s *MinipoolStatus) UnmarshalJSON(data []byte) error { - status, err := StringToMinipoolStatus(string(data)) + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { return err } + status, err := StringToMinipoolStatus(dataStr) if err == nil { *s = status } return err } @@ -70,11 +75,15 @@ func StringToMinipoolDeposit(value string) (MinipoolDeposit, error) { // JSON encoding func (d MinipoolDeposit) MarshalJSON() ([]byte, error) { str := d.String() - if str == "" { return []byte{}, fmt.Errorf("Invalid minipool deposit type '%d'", d) } - return []byte(str), nil + if str == "" { + return []byte{}, fmt.Errorf("Invalid minipool deposit type '%d'", d) + } + return json.Marshal(str) } func (d *MinipoolDeposit) UnmarshalJSON(data []byte) error { - depositType, err := StringToMinipoolDeposit(string(data)) + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { return err } + depositType, err := StringToMinipoolDeposit(dataStr) if err == nil { *d = depositType } return err } From c430afba9ad3c9fa02d83118fd5425ae1bda5720 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 13 Aug 2020 15:00:37 +1000 Subject: [PATCH 077/878] minor type fixes --- minipool/minipool-contract.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index deeeaf90b..16dda97a5 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -108,11 +108,11 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) } func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { - status := new(rptypes.MinipoolStatus) + status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } - return *status, nil + return rptypes.MinipoolStatus(*status), nil } func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) @@ -132,11 +132,11 @@ func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { // Get deposit type func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { - depositType := new(rptypes.MinipoolDeposit) + depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) } - return *depositType, nil + return rptypes.MinipoolDeposit(*depositType), nil } From 6e76e0462995138b3ff88b5b6acc8bafd3c054a2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 5 Nov 2020 11:17:40 +1000 Subject: [PATCH 078/878] query minipool data in batches --- minipool/minipool.go | 200 +++++++++++++++++++++++++------------------ 1 file changed, 118 insertions(+), 82 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index c8d96aa9d..b2bdd6560 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -17,6 +17,10 @@ import ( ) +// Settings +const MinipoolBatchSize = 50 + + // Minipool details type MinipoolDetails struct { Address common.Address `json:"address"` @@ -38,23 +42,30 @@ func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDet return []MinipoolDetails{}, err } - // Data - var wg errgroup.Group + // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolBatchSize + if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress := minipoolAddresses[mi] + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) + if err == nil { details[mi] = minipoolDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MinipoolDetails{}, err + } - // Load details - for mi, minipoolAddress := range minipoolAddresses { - mi, minipoolAddress := mi, minipoolAddress - wg.Go(func() error { - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) - if err == nil { details[mi] = minipoolDetails } - return err - }) - } - - // Wait for data - if err := wg.Wait(); err != nil { - return []MinipoolDetails{}, err } // Return @@ -72,23 +83,29 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com return []common.Address{}, err } - // Data - var wg errgroup.Group + // Load minipool addresses in batches addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolBatchSize + if mei > minipoolCount { mei = minipoolCount } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMinipoolAt(rp, mi, opts) + if err == nil { addresses[mi] = address } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } - // Load addresses - for mi := uint64(0); mi < minipoolCount; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetMinipoolAt(rp, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - - // Wait for data - if err := wg.Wait(); err != nil { - return []common.Address{}, err } // Return @@ -106,23 +123,30 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return []MinipoolDetails{}, err } - // Data - var wg errgroup.Group + // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolBatchSize + if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress := minipoolAddresses[mi] + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) + if err == nil { details[mi] = minipoolDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MinipoolDetails{}, err + } - // Load details - for mi, minipoolAddress := range minipoolAddresses { - mi, minipoolAddress := mi, minipoolAddress - wg.Go(func() error { - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) - if err == nil { details[mi] = minipoolDetails } - return err - }) - } - - // Wait for data - if err := wg.Wait(); err != nil { - return []MinipoolDetails{}, err } // Return @@ -140,23 +164,29 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr return []common.Address{}, err } - // Data - var wg errgroup.Group + // Load minipool addresses in batches addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolBatchSize + if mei > minipoolCount { mei = minipoolCount } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) + if err == nil { addresses[mi] = address } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } - // Load addresses - for mi := uint64(0); mi < minipoolCount; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - - // Wait for data - if err := wg.Wait(); err != nil { - return []common.Address{}, err } // Return @@ -174,30 +204,36 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com return []rptypes.ValidatorPubkey{}, err } - // Data - var wg errgroup.Group + // Load pubkeys in batches pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolBatchSize + if mei > minipoolCount { mei = minipoolCount } + + // Load pubkeys + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) + if err != nil { + return err + } + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) + if err != nil { + return err + } + pubkeys[mi] = pubkey + return nil + }) + } + if err := wg.Wait(); err != nil { + return []rptypes.ValidatorPubkey{}, err + } - // Load pubkeys - for mi := uint64(0); mi < minipoolCount; mi++ { - mi := mi - wg.Go(func() error { - minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) - if err != nil { - return err - } - pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) - if err != nil { - return err - } - pubkeys[mi] = pubkey - return nil - }) - } - - // Wait for data - if err := wg.Wait(); err != nil { - return []rptypes.ValidatorPubkey{}, err } // Return From e79c6a7154c003939957c2fbdaab14500f094014 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 5 Nov 2020 12:22:15 +1000 Subject: [PATCH 079/878] updated minipool data batch settings --- minipool/minipool.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index b2bdd6560..210db9ed8 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -18,7 +18,10 @@ import ( // Settings -const MinipoolBatchSize = 50 +const ( + MinipoolAddressBatchSize = 50 + MinipoolDetailsBatchSize = 20 +) // Minipool details @@ -44,11 +47,11 @@ func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDet // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) - for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolBatchSize { + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolBatchSize + mei := bsi + MinipoolDetailsBatchSize if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } // Load details @@ -85,11 +88,11 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com // Load minipool addresses in batches addresses := make([]common.Address, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolBatchSize + mei := bsi + MinipoolAddressBatchSize if mei > minipoolCount { mei = minipoolCount } // Load addresses @@ -125,11 +128,11 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opt // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) - for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolBatchSize { + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolBatchSize + mei := bsi + MinipoolDetailsBatchSize if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } // Load details @@ -166,11 +169,11 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr // Load minipool addresses in batches addresses := make([]common.Address, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolBatchSize + mei := bsi + MinipoolAddressBatchSize if mei > minipoolCount { mei = minipoolCount } // Load addresses @@ -206,11 +209,11 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com // Load pubkeys in batches pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolBatchSize { + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolBatchSize + mei := bsi + MinipoolAddressBatchSize if mei > minipoolCount { mei = minipoolCount } // Load pubkeys From 6ea317003c2c990e5c2a2c14358995405320e8e0 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 10:21:43 +1000 Subject: [PATCH 080/878] minor fix --- utils/contract/events.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/contract/events.go b/utils/contract/events.go index e3c610ae7..e0b408203 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -28,7 +28,7 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr // Get ABI event abiEvent, ok := contractAbi.Events[eventName] if !ok { - return nil, fmt.Errorf("Event '%s' does not exist on contract") + return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) } // Create contract instance From 2bc58bb46bc1541c170b875347e97f64d552628a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 10:22:24 +1000 Subject: [PATCH 081/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 41 +++++++++++++++++++++++++++++++++++ utils/test/config.go | 6 +++++ 2 files changed, 47 insertions(+) create mode 100644 rocketpool/rocketpool_test.go create mode 100644 utils/test/config.go diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go new file mode 100644 index 000000000..b5b57ec9b --- /dev/null +++ b/rocketpool/rocketpool_test.go @@ -0,0 +1,41 @@ +package rocketpool + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/utils/test" +) + + +func TestGetAddress(t *testing.T) { + + // Initialize eth client + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + + // Initialize contract manager + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get contract address + address1, err := rp.GetAddress("rocketDepositPool") + if err != nil { + t.Errorf("Could not get contract address: %s", err) + } else if bytes.Equal(address1.Bytes(), common.Address{}.Bytes()) { + t.Error("Contract address was not found") + } + + // Get cached contract address + address2, err := rp.GetAddress("rocketDepositPool") + if err != nil { + t.Errorf("Could not get cached contract address: %s", err) + } else if !bytes.Equal(address2.Bytes(), address1.Bytes()) { + t.Error("Cached contract address did not match original contract address") + } + +} + diff --git a/utils/test/config.go b/utils/test/config.go new file mode 100644 index 000000000..99501510a --- /dev/null +++ b/utils/test/config.go @@ -0,0 +1,6 @@ +package test + +const ( + Eth1ProviderAddress = "http://127.0.0.1:8545" + RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" +) From a41f4cc656dadd209b3def956dd4920f8dc24be2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 10:43:25 +1000 Subject: [PATCH 082/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 39 ++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go index b5b57ec9b..610a04d16 100644 --- a/rocketpool/rocketpool_test.go +++ b/rocketpool/rocketpool_test.go @@ -13,11 +13,9 @@ import ( func TestGetAddress(t *testing.T) { - // Initialize eth client + // Setup client, err := ethclient.Dial(test.Eth1ProviderAddress) if err != nil { t.Fatal(err) } - - // Initialize contract manager rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) if err != nil { t.Fatal(err) } @@ -39,3 +37,38 @@ func TestGetAddress(t *testing.T) { } + +func TestGetAddresses(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get contract addresses + addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Errorf("Could not get contract addresses: %s", err) + } else { + for ai, address := range addresses1 { + if bytes.Equal(address.Bytes(), common.Address{}.Bytes()) { + t.Errorf("Contract address %d was not found", ai) + } + } + } + + // Get cached contract addresses + addresses2, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Errorf("Could not get cached contract addresses: %s", err) + } else { + for ai := 0; ai < len(addresses2); ai++ { + if !bytes.Equal(addresses2[ai].Bytes(), addresses1[ai].Bytes()) { + t.Errorf("Cached contract address %d did not match original contract address", ai) + } + } + } + +} + From 26e2f23e6bd76a5cb71880c2de9d443ae5017cfa Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 11:05:59 +1000 Subject: [PATCH 083/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go index 610a04d16..5baf1db10 100644 --- a/rocketpool/rocketpool_test.go +++ b/rocketpool/rocketpool_test.go @@ -2,6 +2,7 @@ package rocketpool import ( "bytes" + "encoding/json" "testing" "github.com/ethereum/go-ethereum/common" @@ -72,3 +73,67 @@ func TestGetAddresses(t *testing.T) { } + +func TestGetABI(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get ABI + abi1, err := rp.GetABI("rocketDepositPool") + if err != nil { + t.Errorf("Could not get contract ABI: %s", err) + } + + // Get cached ABI + abi2, err := rp.GetABI("rocketDepositPool") + if err != nil { + t.Errorf("Could not get cached contract ABI: %s", err) + } else { + abi2Json, err := json.Marshal(abi2) + if err != nil { t.Fatal(err) } + abi1Json, err := json.Marshal(abi1) + if err != nil { t.Fatal(err) } + if !bytes.Equal(abi2Json, abi1Json) { + t.Error("Cached contract ABI did not match original contract ABI") + } + } + +} + + +func TestGetABIs(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get ABIs + abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Errorf("Could not get contract ABIs: %s", err) + } + + // Get cached ABIs + abis2, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Errorf("Could not get cached contract ABIs: %s", err) + } else { + for ai := 0; ai < len(abis2); ai++ { + abi2Json, err := json.Marshal(abis2[ai]) + if err != nil { t.Fatal(err) } + abi1Json, err := json.Marshal(abis1[ai]) + if err != nil { t.Fatal(err) } + if !bytes.Equal(abi2Json, abi1Json) { + t.Errorf("Cached contract ABI %d did not match original contract ABI", ai) + } + } + } + +} + From 2166bdb5a2f7fa4ddec4c8ec999e4c23c2f43eaf Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 11:20:07 +1000 Subject: [PATCH 084/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go index 5baf1db10..e147e42fc 100644 --- a/rocketpool/rocketpool_test.go +++ b/rocketpool/rocketpool_test.go @@ -137,3 +137,66 @@ func TestGetABIs(t *testing.T) { } + +func TestGetContract(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get contract + if _, err := rp.GetContract("rocketDepositPool"); err != nil { + t.Errorf("Could not get contract: %s", err) + } + + // Get cached contract + if _, err := rp.GetContract("rocketDepositPool"); err != nil { + t.Errorf("Could not get cached contract: %s", err) + } + +} + + +func TestGetContracts(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Get contracts + if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { + t.Errorf("Could not get contracts: %s", err) + } + + // Get cached contracts + if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { + t.Errorf("Could not get cached contracts: %s", err) + } + +} + + +func TestMakeContract(t *testing.T) { + + // Setup + client, err := ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { t.Fatal(err) } + + // Make contract + if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { + t.Errorf("Could not make contract: %s", err) + } + + // Make contract with cached ABI + if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x2222222222222222222222222222222222222222")); err != nil { + t.Errorf("Could not make contract with cached ABI: %s", err) + } + +} + From 03aa3688f3a3388a90b3fea715ae9193e6a786ec Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 11:55:22 +1000 Subject: [PATCH 085/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 67 +++++++++++++---------------------- 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go index e147e42fc..0061045ab 100644 --- a/rocketpool/rocketpool_test.go +++ b/rocketpool/rocketpool_test.go @@ -3,6 +3,8 @@ package rocketpool import ( "bytes" "encoding/json" + "log" + "os" "testing" "github.com/ethereum/go-ethereum/common" @@ -12,13 +14,30 @@ import ( ) -func TestGetAddress(t *testing.T) { +var ( + client *ethclient.Client + rp *RocketPool +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } + +func TestGetAddress(t *testing.T) { // Get contract address address1, err := rp.GetAddress("rocketDepositPool") @@ -41,12 +60,6 @@ func TestGetAddress(t *testing.T) { func TestGetAddresses(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Get contract addresses addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") if err != nil { @@ -76,12 +89,6 @@ func TestGetAddresses(t *testing.T) { func TestGetABI(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Get ABI abi1, err := rp.GetABI("rocketDepositPool") if err != nil { @@ -107,12 +114,6 @@ func TestGetABI(t *testing.T) { func TestGetABIs(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Get ABIs abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") if err != nil { @@ -140,12 +141,6 @@ func TestGetABIs(t *testing.T) { func TestGetContract(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Get contract if _, err := rp.GetContract("rocketDepositPool"); err != nil { t.Errorf("Could not get contract: %s", err) @@ -161,12 +156,6 @@ func TestGetContract(t *testing.T) { func TestGetContracts(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Get contracts if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { t.Errorf("Could not get contracts: %s", err) @@ -182,12 +171,6 @@ func TestGetContracts(t *testing.T) { func TestMakeContract(t *testing.T) { - // Setup - client, err := ethclient.Dial(test.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } - rp, err := NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) - if err != nil { t.Fatal(err) } - // Make contract if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { t.Errorf("Could not make contract: %s", err) From 0b30c273b06ae37dfb1945bb155f5d0fcdf27f8f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 13:44:13 +1000 Subject: [PATCH 086/878] implementing contract manager tests --- rocketpool/rocketpool_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/rocketpool/rocketpool_test.go b/rocketpool/rocketpool_test.go index 0061045ab..b2eec76b2 100644 --- a/rocketpool/rocketpool_test.go +++ b/rocketpool/rocketpool_test.go @@ -42,7 +42,7 @@ func TestGetAddress(t *testing.T) { // Get contract address address1, err := rp.GetAddress("rocketDepositPool") if err != nil { - t.Errorf("Could not get contract address: %s", err) + t.Fatalf("Could not get contract address: %s", err) } else if bytes.Equal(address1.Bytes(), common.Address{}.Bytes()) { t.Error("Contract address was not found") } @@ -50,7 +50,7 @@ func TestGetAddress(t *testing.T) { // Get cached contract address address2, err := rp.GetAddress("rocketDepositPool") if err != nil { - t.Errorf("Could not get cached contract address: %s", err) + t.Fatalf("Could not get cached contract address: %s", err) } else if !bytes.Equal(address2.Bytes(), address1.Bytes()) { t.Error("Cached contract address did not match original contract address") } @@ -63,7 +63,7 @@ func TestGetAddresses(t *testing.T) { // Get contract addresses addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Errorf("Could not get contract addresses: %s", err) + t.Fatalf("Could not get contract addresses: %s", err) } else { for ai, address := range addresses1 { if bytes.Equal(address.Bytes(), common.Address{}.Bytes()) { @@ -75,7 +75,7 @@ func TestGetAddresses(t *testing.T) { // Get cached contract addresses addresses2, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Errorf("Could not get cached contract addresses: %s", err) + t.Fatalf("Could not get cached contract addresses: %s", err) } else { for ai := 0; ai < len(addresses2); ai++ { if !bytes.Equal(addresses2[ai].Bytes(), addresses1[ai].Bytes()) { @@ -92,13 +92,13 @@ func TestGetABI(t *testing.T) { // Get ABI abi1, err := rp.GetABI("rocketDepositPool") if err != nil { - t.Errorf("Could not get contract ABI: %s", err) + t.Fatalf("Could not get contract ABI: %s", err) } // Get cached ABI abi2, err := rp.GetABI("rocketDepositPool") if err != nil { - t.Errorf("Could not get cached contract ABI: %s", err) + t.Fatalf("Could not get cached contract ABI: %s", err) } else { abi2Json, err := json.Marshal(abi2) if err != nil { t.Fatal(err) } @@ -117,13 +117,13 @@ func TestGetABIs(t *testing.T) { // Get ABIs abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Errorf("Could not get contract ABIs: %s", err) + t.Fatalf("Could not get contract ABIs: %s", err) } // Get cached ABIs abis2, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Errorf("Could not get cached contract ABIs: %s", err) + t.Fatalf("Could not get cached contract ABIs: %s", err) } else { for ai := 0; ai < len(abis2); ai++ { abi2Json, err := json.Marshal(abis2[ai]) @@ -143,12 +143,12 @@ func TestGetContract(t *testing.T) { // Get contract if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Errorf("Could not get contract: %s", err) + t.Fatalf("Could not get contract: %s", err) } // Get cached contract if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Errorf("Could not get cached contract: %s", err) + t.Fatalf("Could not get cached contract: %s", err) } } @@ -158,12 +158,12 @@ func TestGetContracts(t *testing.T) { // Get contracts if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Errorf("Could not get contracts: %s", err) + t.Fatalf("Could not get contracts: %s", err) } // Get cached contracts if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Errorf("Could not get cached contracts: %s", err) + t.Fatalf("Could not get cached contracts: %s", err) } } @@ -173,12 +173,12 @@ func TestMakeContract(t *testing.T) { // Make contract if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { - t.Errorf("Could not make contract: %s", err) + t.Fatalf("Could not make contract: %s", err) } // Make contract with cached ABI if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x2222222222222222222222222222222222222222")); err != nil { - t.Errorf("Could not make contract with cached ABI: %s", err) + t.Fatalf("Could not make contract with cached ABI: %s", err) } } From 1fa40423587087a28cbf3c720049ca5fc8d0b880 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 13:46:21 +1000 Subject: [PATCH 087/878] implementing node tests --- node/node_test.go | 75 +++++++++++++++++++++++++++++++++ utils/test/accounts/accounts.go | 46 ++++++++++++++++++++ utils/test/config.go | 15 +++++++ utils/test/evm/evm.go | 46 ++++++++++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 node/node_test.go create mode 100644 utils/test/accounts/accounts.go create mode 100644 utils/test/evm/evm.go diff --git a/node/node_test.go b/node/node_test.go new file mode 100644 index 000000000..c4238401a --- /dev/null +++ b/node/node_test.go @@ -0,0 +1,75 @@ +package node + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/utils/test/accounts" + "github.com/rocket-pool/rocketpool-go/utils/test/evm" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + + +func TestRegisterNode(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Get initial node status + exists1, err := GetNodeExists(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else if exists1 { + t.Error("Node already existed before registration") + } + + // Register node + if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get updated node status + exists2, err := GetNodeExists(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else if !exists2 { + t.Error("Node did not exist after registration") + } + +} + diff --git a/utils/test/accounts/accounts.go b/utils/test/accounts/accounts.go new file mode 100644 index 000000000..635b30b7b --- /dev/null +++ b/utils/test/accounts/accounts.go @@ -0,0 +1,46 @@ +package accounts + +import ( + "crypto/ecdsa" + "encoding/hex" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/rocket-pool/rocketpool-go/utils/test" +) + + +// An account containing a keypair and address +type Account struct { + PrivateKey *ecdsa.PrivateKey + Address common.Address +} + + +// Get an account by index +func GetAccount(index uint8) (*Account, error) { + + // Get private key data + privateKeyBytes, err := hex.DecodeString(test.AccountPrivateKeys[index]) + if err != nil { return nil, err } + + // Get private key + privateKey, err := crypto.ToECDSA(privateKeyBytes) + if err != nil { return nil, err } + + // Return account + return &Account{ + PrivateKey: privateKey, + Address: crypto.PubkeyToAddress(privateKey.PublicKey), + }, nil + +} + + +// Get a transactor for an account +func (a *Account) GetTransactor() *bind.TransactOpts { + return bind.NewKeyedTransactor(a.PrivateKey) +} + diff --git a/utils/test/config.go b/utils/test/config.go index 99501510a..f512491d2 100644 --- a/utils/test/config.go +++ b/utils/test/config.go @@ -1,6 +1,21 @@ package test + const ( Eth1ProviderAddress = "http://127.0.0.1:8545" RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" ) + +var AccountPrivateKeys = []string{ + "c6d2ac9b00bd599c4ce9d3a69c91e496eb9e79781d9dc84c79bafa7618f45f37", + "025515b79bbe5edf008112d19a14457e6bea72dc4660667eeb2c3225c8285618", + "02984e048155b5a3b80162a2041e096c3f99b9b4324bc7ff3e56e96d37f1500b", + "5894075a2b08d7585fd4b354914326da5c9b05f92a737b8789f127ba7a21f939", + "5a18d98ff88545ab82044b31ace49ad252056b89445913dc6a5653eca58c438a", + "ea8a7f5637ca1ae8ee6783850af1c0c57cdc5e66d1dcb92fd636908ad9b4cc04", + "836915de8841cd4e3a24b80c9c33e59be8db8ab3daf32d5edce56597b905bbf0", + "759b3437ff0fd1af70a5a367ac281c73f6dca2e17a4650a7f939fb50ad15f6cd", + "dde1c7fcfe3fa4c5e824e2e0cf5d8cef98692cde611b070d054045c2826aecb4", + "418bb76e4af529837d39f4812201c6e4b9b3d5d521f66047b6f34a6d7bc0c811", +} + diff --git a/utils/test/evm/evm.go b/utils/test/evm/evm.go new file mode 100644 index 000000000..dcf822646 --- /dev/null +++ b/utils/test/evm/evm.go @@ -0,0 +1,46 @@ +package evm + +import ( + "github.com/ethereum/go-ethereum/rpc" + + "github.com/rocket-pool/rocketpool-go/utils/test" +) + + +// The ID of the current snapshot of the EVM state +var snapshotId string + + +// Take a snapshot of the EVM state +func TakeSnapshot() error { + + // Initialize RPC client + client, err := rpc.Dial(test.Eth1ProviderAddress) + if err != nil { return err } + + // Make RPC call + var response string + if err := client.Call(&response, "evm_snapshot"); err != nil { return err } + + // Set snapshot ID & return + snapshotId = response + return nil + +} + + +// Restore a snapshot of the EVM state +func RevertSnapshot() error { + + // Initialize RPC client + client, err := rpc.Dial(test.Eth1ProviderAddress) + if err != nil { return err } + + // Make RPC call + if err := client.Call(nil, "evm_revert", snapshotId); err != nil { return err } + + // Return + return nil + +} + From 672ea3ce2dfc1f0189c4ba5a9d25e78bcbce0274 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 14:00:01 +1000 Subject: [PATCH 088/878] implementing node tests --- node/node_test.go | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index c4238401a..5ce752b22 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -50,26 +50,32 @@ func TestRegisterNode(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Get initial node status - exists1, err := GetNodeExists(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } else if exists1 { + // Get initial node exists status + if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if exists { t.Error("Node already existed before registration") } // Register node - if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + nodeTimezoneLocation := "Australia/Brisbane" + if _, err := RegisterNode(rp, nodeTimezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get updated node status - exists2, err := GetNodeExists(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } else if !exists2 { + // Get updated node exists status + if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !exists { t.Error("Node did not exist after registration") } + // Get node timezone location + if timezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if timezoneLocation != nodeTimezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", timezoneLocation) + } + } From 597a12301511510cd3c9963f7a0f7cc0f06bd0a1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 19 Jan 2021 15:01:53 +1000 Subject: [PATCH 089/878] implementing node tests --- node/node_test.go | 88 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index 5ce752b22..2cd4a9ef4 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/utils/test" "github.com/rocket-pool/rocketpool-go/utils/test/accounts" "github.com/rocket-pool/rocketpool-go/utils/test/evm" @@ -44,13 +45,40 @@ func TestMain(m *testing.M) { } +func TestGetNodeDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + timezoneLocation := "Australia/Brisbane" + if _, err := RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get node details + if details, err := GetNodeDetails(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else { + if !details.Exists { + t.Error("Incorrect node exists status") + } + if details.TimezoneLocation != timezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", details.TimezoneLocation) + } + } + +} + + func TestRegisterNode(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Get initial node exists status + // Check initial node exists status if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if exists { @@ -58,24 +86,68 @@ func TestRegisterNode(t *testing.T) { } // Register node - nodeTimezoneLocation := "Australia/Brisbane" - if _, err := RegisterNode(rp, nodeTimezoneLocation, nodeAccount.GetTransactor()); err != nil { + if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get updated node exists status + // Check updated node exists status if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if !exists { t.Error("Node did not exist after registration") } - // Get node timezone location - if timezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { +} + + +func TestSetTimezoneLocation(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + timezoneLocation := "Australia/Brisbane" + if _, err := RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set timezone + timezoneLocation = "Australia/Sydney" + if _, err := SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check node timezone location + if nodeTimezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if timezoneLocation != nodeTimezoneLocation { - t.Errorf("Incorrect node timezone location '%s'", timezoneLocation) + } else if nodeTimezoneLocation != timezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", nodeTimezoneLocation) } } + +func TestDeposit(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Deposit + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := Deposit(rp, 0, opts); err != nil { + t.Fatal(err) + } + + // Check deposit + // TODO: implement + +} + From 5fbf79ed5855f350dd602e2939208c231856f57d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 20 Jan 2021 09:17:39 +1000 Subject: [PATCH 090/878] implementing various unit tests --- deposit/deposit_test.go | 94 +++++++++++++++++++++++++++++++++++++++++ network/network_test.go | 45 ++++++++++++++++++++ node/node_test.go | 5 ++- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 deposit/deposit_test.go create mode 100644 network/network_test.go diff --git a/deposit/deposit_test.go b/deposit/deposit_test.go new file mode 100644 index 000000000..9874f0062 --- /dev/null +++ b/deposit/deposit_test.go @@ -0,0 +1,94 @@ +package deposit + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/utils/test/accounts" + "github.com/rocket-pool/rocketpool-go/utils/test/evm" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + + +func TestGetBalance(t *testing.T) { + + // Make staker deposit + // TODO: implement + + // Get deposit pool balance + balance, err := GetBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Check deposit pool balance + // TODO: implement + _ = balance + +} + + +func TestAssignDeposits(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Make staker & node deposits + // TODO: implement + + // Get initial deposit pool balance + balance1, err := GetBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Assign deposits + if _, err := AssignDeposits(rp, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check updated deposit pool balance + balance2, err := GetBalance(rp, nil) + if err != nil { + t.Fatal(err) + } else if balance2.Cmp(balance1) != -1 { + t.Error("Deposit pool balance did not decrease after assigning deposits") + } + +} + diff --git a/network/network_test.go b/network/network_test.go new file mode 100644 index 000000000..74dedc56f --- /dev/null +++ b/network/network_test.go @@ -0,0 +1,45 @@ +package network + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/utils/test/accounts" + "github.com/rocket-pool/rocketpool-go/utils/test/evm" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(test.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/node/node_test.go b/node/node_test.go index 2cd4a9ef4..0f65efe7e 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -139,6 +139,9 @@ func TestDeposit(t *testing.T) { t.Fatal(err) } + // Get initial node minipool count + // TODO: implement + // Deposit opts := nodeAccount.GetTransactor() opts.Value = eth.EthToWei(16) @@ -146,7 +149,7 @@ func TestDeposit(t *testing.T) { t.Fatal(err) } - // Check deposit + // Check updated node minipool count // TODO: implement } From 96ca7431a1c55073bea6a5008417330c8ba47b5d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 20 Jan 2021 10:30:11 +1000 Subject: [PATCH 091/878] restructuring tests --- {utils/test => tests}/config.go | 2 +- {deposit => tests/deposit}/deposit_test.go | 19 ++++++------ {network => tests/network}/network_test.go | 10 +++--- {node => tests/node}/node_test.go | 31 ++++++++++--------- .../rocketpool}/rocketpool_test.go | 9 +++--- .../test => tests/utils}/accounts/accounts.go | 4 +-- .../evm.go => tests/utils/evm/snapshots.go | 6 ++-- 7 files changed, 42 insertions(+), 39 deletions(-) rename {utils/test => tests}/config.go (98%) rename {deposit => tests/deposit}/deposit_test.go (74%) rename {network => tests/network}/network_test.go (73%) rename {node => tests/node}/node_test.go (71%) rename {rocketpool => tests/rocketpool}/rocketpool_test.go (94%) rename {utils/test => tests/utils}/accounts/accounts.go (87%) rename utils/test/evm/evm.go => tests/utils/evm/snapshots.go (82%) diff --git a/utils/test/config.go b/tests/config.go similarity index 98% rename from utils/test/config.go rename to tests/config.go index f512491d2..964a85d8f 100644 --- a/utils/test/config.go +++ b/tests/config.go @@ -1,4 +1,4 @@ -package test +package tests const ( diff --git a/deposit/deposit_test.go b/tests/deposit/deposit_test.go similarity index 74% rename from deposit/deposit_test.go rename to tests/deposit/deposit_test.go index 9874f0062..984fffb83 100644 --- a/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -8,10 +8,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/test" - "github.com/rocket-pool/rocketpool-go/utils/test/accounts" - "github.com/rocket-pool/rocketpool-go/utils/test/evm" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" ) @@ -27,11 +28,11 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(test.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts @@ -50,7 +51,7 @@ func TestGetBalance(t *testing.T) { // TODO: implement // Get deposit pool balance - balance, err := GetBalance(rp, nil) + balance, err := deposit.GetBalance(rp, nil) if err != nil { t.Fatal(err) } @@ -72,18 +73,18 @@ func TestAssignDeposits(t *testing.T) { // TODO: implement // Get initial deposit pool balance - balance1, err := GetBalance(rp, nil) + balance1, err := deposit.GetBalance(rp, nil) if err != nil { t.Fatal(err) } // Assign deposits - if _, err := AssignDeposits(rp, userAccount.GetTransactor()); err != nil { + if _, err := deposit.AssignDeposits(rp, userAccount.GetTransactor()); err != nil { t.Fatal(err) } // Check updated deposit pool balance - balance2, err := GetBalance(rp, nil) + balance2, err := deposit.GetBalance(rp, nil) if err != nil { t.Fatal(err) } else if balance2.Cmp(balance1) != -1 { diff --git a/network/network_test.go b/tests/network/network_test.go similarity index 73% rename from network/network_test.go rename to tests/network/network_test.go index 74dedc56f..3f9842d40 100644 --- a/network/network_test.go +++ b/tests/network/network_test.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/test" - "github.com/rocket-pool/rocketpool-go/utils/test/accounts" - "github.com/rocket-pool/rocketpool-go/utils/test/evm" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + //"github.com/rocket-pool/rocketpool-go/tests/utils/evm" ) @@ -27,11 +27,11 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(test.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/node/node_test.go b/tests/node/node_test.go similarity index 71% rename from node/node_test.go rename to tests/node/node_test.go index 0f65efe7e..a450be628 100644 --- a/node/node_test.go +++ b/tests/node/node_test.go @@ -8,11 +8,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/test" - "github.com/rocket-pool/rocketpool-go/utils/test/accounts" - "github.com/rocket-pool/rocketpool-go/utils/test/evm" ) @@ -28,11 +29,11 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(test.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts @@ -53,12 +54,12 @@ func TestGetNodeDetails(t *testing.T) { // Register node timezoneLocation := "Australia/Brisbane" - if _, err := RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get node details - if details, err := GetNodeDetails(rp, nodeAccount.Address, nil); err != nil { + if details, err := node.GetNodeDetails(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else { if !details.Exists { @@ -79,19 +80,19 @@ func TestRegisterNode(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Check initial node exists status - if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if exists { t.Error("Node already existed before registration") } // Register node - if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Check updated node exists status - if exists, err := GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if !exists { t.Error("Node did not exist after registration") @@ -108,18 +109,18 @@ func TestSetTimezoneLocation(t *testing.T) { // Register node timezoneLocation := "Australia/Brisbane" - if _, err := RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set timezone timezoneLocation = "Australia/Sydney" - if _, err := SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + if _, err := node.SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Check node timezone location - if nodeTimezoneLocation, err := GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { + if nodeTimezoneLocation, err := node.GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if nodeTimezoneLocation != timezoneLocation { t.Errorf("Incorrect node timezone location '%s'", nodeTimezoneLocation) @@ -135,7 +136,7 @@ func TestDeposit(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Register node - if _, err := RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -145,7 +146,7 @@ func TestDeposit(t *testing.T) { // Deposit opts := nodeAccount.GetTransactor() opts.Value = eth.EthToWei(16) - if _, err := Deposit(rp, 0, opts); err != nil { + if _, err := node.Deposit(rp, 0, opts); err != nil { t.Fatal(err) } diff --git a/rocketpool/rocketpool_test.go b/tests/rocketpool/rocketpool_test.go similarity index 94% rename from rocketpool/rocketpool_test.go rename to tests/rocketpool/rocketpool_test.go index b2eec76b2..09fc9ff8d 100644 --- a/rocketpool/rocketpool_test.go +++ b/tests/rocketpool/rocketpool_test.go @@ -10,13 +10,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" ) var ( client *ethclient.Client - rp *RocketPool + rp *rocketpool.RocketPool ) @@ -24,11 +25,11 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(test.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = NewRocketPool(client, common.HexToAddress(test.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Run tests diff --git a/utils/test/accounts/accounts.go b/tests/utils/accounts/accounts.go similarity index 87% rename from utils/test/accounts/accounts.go rename to tests/utils/accounts/accounts.go index 635b30b7b..3f406f288 100644 --- a/utils/test/accounts/accounts.go +++ b/tests/utils/accounts/accounts.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/tests" ) @@ -23,7 +23,7 @@ type Account struct { func GetAccount(index uint8) (*Account, error) { // Get private key data - privateKeyBytes, err := hex.DecodeString(test.AccountPrivateKeys[index]) + privateKeyBytes, err := hex.DecodeString(tests.AccountPrivateKeys[index]) if err != nil { return nil, err } // Get private key diff --git a/utils/test/evm/evm.go b/tests/utils/evm/snapshots.go similarity index 82% rename from utils/test/evm/evm.go rename to tests/utils/evm/snapshots.go index dcf822646..ce289d56e 100644 --- a/utils/test/evm/evm.go +++ b/tests/utils/evm/snapshots.go @@ -3,7 +3,7 @@ package evm import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/rocket-pool/rocketpool-go/utils/test" + "github.com/rocket-pool/rocketpool-go/tests" ) @@ -15,7 +15,7 @@ var snapshotId string func TakeSnapshot() error { // Initialize RPC client - client, err := rpc.Dial(test.Eth1ProviderAddress) + client, err := rpc.Dial(tests.Eth1ProviderAddress) if err != nil { return err } // Make RPC call @@ -33,7 +33,7 @@ func TakeSnapshot() error { func RevertSnapshot() error { // Initialize RPC client - client, err := rpc.Dial(test.Eth1ProviderAddress) + client, err := rpc.Dial(tests.Eth1ProviderAddress) if err != nil { return err } // Make RPC call From 321748320a243cec307122e35e0d59332fc200a1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 20 Jan 2021 16:13:26 +1000 Subject: [PATCH 092/878] implementing deposit module unit tests --- deposit/deposit.go | 28 +++++++++++++++ settings/deposit.go | 16 +++++++++ tests/deposit/deposit_test.go | 64 ++++++++++++++++++++++++++++------- 3 files changed, 96 insertions(+), 12 deletions(-) diff --git a/deposit/deposit.go b/deposit/deposit.go index 6098d504f..4d3c67613 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -27,6 +27,34 @@ func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error } +// Get the excess deposit pool balance +func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + excessBalance := new(*big.Int) + if err := rocketDepositPool.Call(opts, excessBalance, "getExcessBalance"); err != nil { + return nil, fmt.Errorf("Could not get deposit pool excess balance: %w", err) + } + return *excessBalance, nil +} + + +// Make a deposit +func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketDepositPool, opts, "deposit") + if err != nil { + return nil, fmt.Errorf("Could not deposit: %w", err) + } + return txReceipt, nil +} + + // Assign deposits func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDepositPool, err := getRocketDepositPool(rp) diff --git a/settings/deposit.go b/settings/deposit.go index baaa9f626..c6e3247cc 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -6,8 +6,10 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -39,6 +41,20 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } +// Set deposit assignments currently enabled +func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.TransactOpts, value bool) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketDepositSettings, opts, "setAssignDepositsEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) + } + return txReceipt, nil +} + + // Get contracts var rocketDepositSettingsLock sync.Mutex func getRocketDepositSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 984fffb83..aebe9165a 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -9,10 +9,13 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -20,6 +23,8 @@ var ( client *ethclient.Client rp *rocketpool.RocketPool + ownerAccount *accounts.Account + nodeAccount *accounts.Account userAccount *accounts.Account ) @@ -36,6 +41,10 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } userAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } @@ -45,20 +54,35 @@ func TestMain(m *testing.M) { } -func TestGetBalance(t *testing.T) { +func TestDeposit(t *testing.T) { - // Make staker deposit - // TODO: implement + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Get deposit pool balance - balance, err := deposit.GetBalance(rp, nil) - if err != nil { + // Deposit amount + depositAmount := eth.EthToWei(10) + + // Make deposit + opts := userAccount.GetTransactor() + opts.Value = depositAmount + if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } - // Check deposit pool balance - // TODO: implement - _ = balance + // Get & check deposit pool balance + if balance, err := deposit.GetBalance(rp, nil); err != nil { + t.Error(err) + } else if balance.Cmp(depositAmount) != 0 { + t.Error("Incorrect deposit pool balance") + } + + // Get & check deposit pool excess balance + if excessBalance, err := deposit.GetExcessBalance(rp, nil); err != nil { + t.Error(err) + } else if excessBalance.Cmp(depositAmount) != 0 { + t.Error("Incorrect deposit pool excess balance") + } } @@ -69,8 +93,24 @@ func TestAssignDeposits(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Make staker & node deposits - // TODO: implement + // Disable deposit assignments + if _, err := settings.SetAssignDepositsEnabled(rp, ownerAccount.GetTransactor(), false); err != nil { t.Fatal(err) } + + // Make user deposit + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = eth.EthToWei(32) + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Make node deposit + nodeDepositOpts := nodeAccount.GetTransactor() + nodeDepositOpts.Value = eth.EthToWei(16) + if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } + + // Re-enable deposit assignments + if _, err := settings.SetAssignDepositsEnabled(rp, ownerAccount.GetTransactor(), true); err != nil { t.Fatal(err) } // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) @@ -83,7 +123,7 @@ func TestAssignDeposits(t *testing.T) { t.Fatal(err) } - // Check updated deposit pool balance + // Get & check updated deposit pool balance balance2, err := deposit.GetBalance(rp, nil) if err != nil { t.Fatal(err) From 37fed319c107b385f740470e6e33ab24386f9512 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 20 Jan 2021 16:45:33 +1000 Subject: [PATCH 093/878] updating node module --- node/node.go | 242 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) diff --git a/node/node.go b/node/node.go index f3c60280c..79495e96c 100644 --- a/node/node.go +++ b/node/node.go @@ -2,6 +2,7 @@ package node import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -15,14 +16,184 @@ import ( ) +// Settings +const ( + NodeAddressBatchSize = 50 + NodeDetailsBatchSize = 20 +) + + // Node details type NodeDetails struct { + Address common.Address `json:"address"` Exists bool `json:"exists"` Trusted bool `json:"trusted"` TimezoneLocation string `json:"timezoneLocation"` } +// Get all node details +func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { + + // Get node addresses + nodeAddresses, err := GetNodeAddresses(rp, opts) + if err != nil { + return []NodeDetails{}, err + } + + // Load node details in batches + details := make([]NodeDetails, len(nodeAddresses)) + for bsi := 0; bsi < len(nodeAddresses); bsi += NodeDetailsBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeDetailsBatchSize + if nei > len(nodeAddresses) { nei = len(nodeAddresses) } + + // Load details + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + nodeAddress := nodeAddresses[ni] + nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) + if err == nil { details[ni] = nodeDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []NodeDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get all node addresses +func GetNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + // Get node count + nodeCount, err := GetNodeCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load node addresses in batches + addresses := make([]common.Address, nodeCount) + for bsi := uint64(0); bsi < nodeCount; bsi += NodeAddressBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeAddressBatchSize + if nei > nodeCount { nei = nodeCount } + + // Load addresses + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + address, err := GetNodeAt(rp, ni, opts) + if err == nil { addresses[ni] = address } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil + +} + + +// Get all trusted node details +func GetTrustedNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { + + // Get trusted node addresses + trustedNodeAddresses, err := GetTrustedNodeAddresses(rp, opts) + if err != nil { + return []NodeDetails{}, err + } + + // Load node details in batches + details := make([]NodeDetails, len(trustedNodeAddresses)) + for bsi := 0; bsi < len(trustedNodeAddresses); bsi += NodeDetailsBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeDetailsBatchSize + if nei > len(trustedNodeAddresses) { nei = len(trustedNodeAddresses) } + + // Load details + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + nodeAddress := trustedNodeAddresses[ni] + nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) + if err == nil { details[ni] = nodeDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []NodeDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get all trusted node addresses +func GetTrustedNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + // Get trusted node count + trustedNodeCount, err := GetTrustedNodeCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load node addresses in batches + addresses := make([]common.Address, trustedNodeCount) + for bsi := uint64(0); bsi < trustedNodeCount; bsi += NodeAddressBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeAddressBatchSize + if nei > trustedNodeCount { nei = trustedNodeCount } + + // Load addresses + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + address, err := GetTrustedNodeAt(rp, ni, opts) + if err == nil { addresses[ni] = address } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil + +} + + // Get a node's details func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NodeDetails, error) { @@ -56,6 +227,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Return return NodeDetails{ + Address: nodeAddress, Exists: exists, Trusted: trusted, TimezoneLocation: timezoneLocation, @@ -64,6 +236,62 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts } +// Get the number of nodes in the network +func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + nodeCount := new(*big.Int) + if err := rocketNodeManager.Call(opts, nodeCount, "getNodeCount"); err != nil { + return 0, fmt.Errorf("Could not get node count: %w", err) + } + return (*nodeCount).Uint64(), nil +} + + +// Get a node address by index +func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Address{}, err + } + nodeAddress := new(common.Address) + if err := rocketNodeManager.Call(opts, nodeAddress, "getNodeAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %d address: %w", index, err) + } + return *nodeAddress, nil +} + + +// Get the number of trusted nodes in the network +func GetTrustedNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + trustedNodeCount := new(*big.Int) + if err := rocketNodeManager.Call(opts, trustedNodeCount, "getTrustedNodeCount"); err != nil { + return 0, fmt.Errorf("Could not get trusted node count: %w", err) + } + return (*trustedNodeCount).Uint64(), nil +} + + +// Get a trusted node address by index +func GetTrustedNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Address{}, err + } + trustedNodeAddress := new(common.Address) + if err := rocketNodeManager.Call(opts, trustedNodeAddress, "getTrustedNodeAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get trusted node %d address: %w", index, err) + } + return *trustedNodeAddress, nil +} + + // Check whether a node exists func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -120,6 +348,20 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } +// Set a node's trusted status +func SetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address, trusted bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "setNodeTrusted", nodeAddress, trusted) + if err != nil { + return nil, fmt.Errorf("Could not set node trusted status: %w", err) + } + return txReceipt, nil +} + + // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNodeManager, err := getRocketNodeManager(rp) From 88aa7cf281cb001dba8b070acd292f88de75f04b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 20 Jan 2021 17:18:50 +1000 Subject: [PATCH 094/878] implementing node module unit tests --- tests/node/node_test.go | 84 +++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index a450be628..541ac6a6d 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -1,6 +1,7 @@ package node import ( + "bytes" "log" "os" "testing" @@ -8,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" @@ -46,56 +48,51 @@ func TestMain(m *testing.M) { } -func TestGetNodeDetails(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - timezoneLocation := "Australia/Brisbane" - if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get node details - if details, err := node.GetNodeDetails(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else { - if !details.Exists { - t.Error("Incorrect node exists status") - } - if details.TimezoneLocation != timezoneLocation { - t.Errorf("Incorrect node timezone location '%s'", details.TimezoneLocation) - } - } - -} - - func TestRegisterNode(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Check initial node exists status + // Get & check initial node exists status if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if exists { t.Error("Node already existed before registration") } + // Get & check initial node details + if details, err := node.GetNodes(rp, nil); err != nil { + t.Error(err) + } else if len(details) > 0 { + t.Error("Incorrect initial node count") + } + // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + timezoneLocation := "Australia/Brisbane" + if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Check updated node exists status - if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + // Get & check updated node details + if details, err := node.GetNodes(rp, nil); err != nil { t.Error(err) - } else if !exists { - t.Error("Node did not exist after registration") + } else if len(details) == 0 { + t.Error("Incorrect updated node count") + } else { + nodeDetails := details[0] + if !bytes.Equal(nodeDetails.Address.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect node address %s", nodeDetails.Address.Hex()) + } + if !nodeDetails.Exists { + t.Error("Incorrect node exists status") + } + if nodeDetails.Trusted { + t.Error("Incorrect node trusted status") + } + if nodeDetails.TimezoneLocation != timezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) + } } } @@ -108,18 +105,17 @@ func TestSetTimezoneLocation(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Register node - timezoneLocation := "Australia/Brisbane" - if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set timezone - timezoneLocation = "Australia/Sydney" + timezoneLocation := "Australia/Sydney" if _, err := node.SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Check node timezone location + // Get & check node timezone location if nodeTimezoneLocation, err := node.GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if nodeTimezoneLocation != timezoneLocation { @@ -141,7 +137,10 @@ func TestDeposit(t *testing.T) { } // Get initial node minipool count - // TODO: implement + minipoolCount1, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } // Deposit opts := nodeAccount.GetTransactor() @@ -150,8 +149,13 @@ func TestDeposit(t *testing.T) { t.Fatal(err) } - // Check updated node minipool count - // TODO: implement + // Get & check updated node minipool count + minipoolCount2, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else if minipoolCount2 != minipoolCount1 + 1 { + t.Error("Incorrect node minipool count") + } } From a465a6ac5bf48ef749f61adf07bdd0801cc7a520 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 11:17:18 +1000 Subject: [PATCH 095/878] minor cleanup --- tests/node/node_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index 541ac6a6d..0e851956c 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -87,9 +87,6 @@ func TestRegisterNode(t *testing.T) { if !nodeDetails.Exists { t.Error("Incorrect node exists status") } - if nodeDetails.Trusted { - t.Error("Incorrect node trusted status") - } if nodeDetails.TimezoneLocation != timezoneLocation { t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) } From 09c83a2f056aad8133217a4813f8f1a70bf67861 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 11:31:21 +1000 Subject: [PATCH 096/878] restructuring node module --- node/deposit.go | 37 +++++++++++++++++++++++++++++++++++++ node/node.go | 21 --------------------- 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 node/deposit.go diff --git a/node/deposit.go b/node/deposit.go new file mode 100644 index 000000000..36629ee30 --- /dev/null +++ b/node/deposit.go @@ -0,0 +1,37 @@ +package node + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Make a node deposit +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNodeDeposit, opts, "deposit", eth.EthToWei(minimumNodeFee)) + if err != nil { + return nil, fmt.Errorf("Could not make node deposit: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNodeDepositLock sync.Mutex +func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNodeDepositLock.Lock() + defer rocketNodeDepositLock.Unlock() + return rp.GetContract("rocketNodeDeposit") +} + diff --git a/node/node.go b/node/node.go index 79495e96c..7b72bf0da 100644 --- a/node/node.go +++ b/node/node.go @@ -12,7 +12,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/contract" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -376,20 +375,6 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } -// Make a node deposit -func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := contract.Transact(rp.Client, rocketNodeDeposit, opts, "deposit", eth.EthToWei(minimumNodeFee)) - if err != nil { - return nil, fmt.Errorf("Could not make node deposit: %w", err) - } - return txReceipt, nil -} - - // Get contracts var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { @@ -397,10 +382,4 @@ func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error defer rocketNodeManagerLock.Unlock() return rp.GetContract("rocketNodeManager") } -var rocketNodeDepositLock sync.Mutex -func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { - rocketNodeDepositLock.Lock() - defer rocketNodeDepositLock.Unlock() - return rp.GetContract("rocketNodeDeposit") -} From c5deb81ad03028ed9559b4ac9fffe6f45ecb6d46 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 11:35:49 +1000 Subject: [PATCH 097/878] restructuring network module --- network/balances.go | 65 +++++++++++++++++++++++++++ network/fees.go | 36 +++++++++++++++ network/{network.go => withdrawal.go} | 55 ----------------------- 3 files changed, 101 insertions(+), 55 deletions(-) create mode 100644 network/balances.go create mode 100644 network/fees.go rename network/{network.go => withdrawal.go} (52%) diff --git a/network/balances.go b/network/balances.go new file mode 100644 index 000000000..b9ba91cd2 --- /dev/null +++ b/network/balances.go @@ -0,0 +1,65 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Get the block number which network balances are current for +func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return 0, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network balances block: %w", err) + } + return (*balancesBlock).Uint64(), nil +} + + +// Get the current network total ETH balance +func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balance, "getBalance"); err != nil { + return nil, fmt.Errorf("Could not get withdrawal pool balance: %w", err) + } + return *balance, nil +} + + +// Submit network balances for an epoch +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + if err != nil { + return nil, fmt.Errorf("Could not submit network balances: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNetworkBalancesLock sync.Mutex +func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances") +} + diff --git a/network/fees.go b/network/fees.go new file mode 100644 index 000000000..eb83c7d53 --- /dev/null +++ b/network/fees.go @@ -0,0 +1,36 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Get the current network node commission rate +func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return 0, err + } + nodeFee := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get network node fee: %w", err) + } + return eth.WeiToEth(*nodeFee), nil +} + + +// Get contracts +var rocketNetworkFeesLock sync.Mutex +func getRocketNetworkFees(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { + rocketNetworkFeesLock.Lock() + defer rocketNetworkFeesLock.Unlock() + return rp.GetContract("rocketNetworkFees") +} + diff --git a/network/network.go b/network/withdrawal.go similarity index 52% rename from network/network.go rename to network/withdrawal.go index 56b103223..177e8ad89 100644 --- a/network/network.go +++ b/network/withdrawal.go @@ -12,38 +12,9 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Get the block number which network balances are current for -func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return 0, err - } - balancesBlock := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network balances block: %w", err) - } - return (*balancesBlock).Uint64(), nil -} - - -// Get the current network node commission rate -func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) - if err != nil { - return 0, err - } - nodeFee := new(*big.Int) - if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get network node fee: %w", err) - } - return eth.WeiToEth(*nodeFee), nil -} - - // Get the withdrawal pool balance func GetWithdrawalBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) @@ -72,20 +43,6 @@ func GetWithdrawalCredentials(rp *rocketpool.RocketPool, opts *bind.CallOpts) (c } -// Submit network balances for an epoch -func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) - if err != nil { - return nil, fmt.Errorf("Could not submit network balances: %w", err) - } - return txReceipt, nil -} - - // Process a validator withdrawal from the beacon chain func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.ValidatorPubkey, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) @@ -101,18 +58,6 @@ func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.Valida // Get contracts -var rocketNetworkBalancesLock sync.Mutex -func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { - rocketNetworkBalancesLock.Lock() - defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances") -} -var rocketNetworkFeesLock sync.Mutex -func getRocketNetworkFees(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { - rocketNetworkFeesLock.Lock() - defer rocketNetworkFeesLock.Unlock() - return rp.GetContract("rocketNetworkFees") -} var rocketNetworkWithdrawalLock sync.Mutex func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { rocketNetworkWithdrawalLock.Lock() From c9d7b31e388643b956c6712619c202d3955659cd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 11:45:09 +1000 Subject: [PATCH 098/878] updating network module --- network/balances.go | 51 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/network/balances.go b/network/balances.go index b9ba91cd2..37d9cc7f9 100644 --- a/network/balances.go +++ b/network/balances.go @@ -10,6 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -33,11 +34,53 @@ func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In if err != nil { return nil, err } - balance := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, balance, "getBalance"); err != nil { - return nil, fmt.Errorf("Could not get withdrawal pool balance: %w", err) + totalEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalEthBalance, "getTotalETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network total ETH balance: %w", err) } - return *balance, nil + return *totalEthBalance, nil +} + + +// Get the current network staking ETH balance +func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + stakingEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, stakingEthBalance, "getStakingETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network staking ETH balance: %w", err) + } + return *stakingEthBalance, nil +} + + +// Get the current network total rETH supply +func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + totalRethSupply := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalRethSupply, "getTotalRETHSupply"); err != nil { + return nil, fmt.Errorf("Could not get network total rETH supply: %w", err) + } + return *totalRethSupply, nil +} + + +// Get the current network ETH utilization rate +func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return 0, err + } + ethUtilizationRate := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, ethUtilizationRate, "getETHUtilizationRate"); err != nil { + return 0, fmt.Errorf("Could not get network ETH utilization rate: %w", err) + } + return eth.WeiToEth(*ethUtilizationRate), nil } From ed3c6bc2518a2aab7eb880a0eaabf568ac96d6fb Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 12:02:16 +1000 Subject: [PATCH 099/878] updating network module --- network/fees.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/network/fees.go b/network/fees.go index eb83c7d53..8ded0c5ee 100644 --- a/network/fees.go +++ b/network/fees.go @@ -12,6 +12,20 @@ import ( ) +// Get the current network node demand in ETH +func GetNodeDemand(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return nil, err + } + nodeDemand := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeDemand, "getNodeDemand"); err != nil { + return nil, fmt.Errorf("Could not get network node demand: %w", err) + } + return *nodeDemand, nil +} + + // Get the current network node commission rate func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkFees, err := getRocketNetworkFees(rp) @@ -26,6 +40,20 @@ func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) } +// Get the network node fee for a node demand value +func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bind.CallOpts) (float64, error) { + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return 0, err + } + nodeFee := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFeeByDemand", nodeDemand); err != nil { + return 0, fmt.Errorf("Could not get node fee by node demand: %w", err) + } + return eth.WeiToEth(*nodeFee), nil +} + + // Get contracts var rocketNetworkFeesLock sync.Mutex func getRocketNetworkFees(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { From 6029a9ca10d1f30cadbc9636505ecc11277902ce Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 12:25:40 +1000 Subject: [PATCH 100/878] implementing network module unit tests --- tests/network/network_test.go | 65 ++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 3f9842d40..da7e4b11d 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -8,10 +8,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - //"github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -19,6 +22,7 @@ var ( client *ethclient.Client rp *rocketpool.RocketPool + ownerAccount *accounts.Account nodeAccount *accounts.Account ) @@ -35,6 +39,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } @@ -43,3 +49,60 @@ func TestMain(m *testing.M) { } + +func TestSubmitBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Submit balances + var balancesBlock uint64 = 100 + totalEth := eth.EthToWei(100) + stakingEth := eth.EthToWei(80) + rethSupply := eth.EthToWei(70) + if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check network balances block + if networkBalancesBlock, err := network.GetBalancesBlock(rp, nil); err != nil { + t.Error(err) + } else if networkBalancesBlock != balancesBlock { + t.Errorf("Incorrect network balances block %d", networkBalancesBlock) + } + + // Get & check network total ETH + if networkTotalEth, err := network.GetTotalETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkTotalEth.Cmp(totalEth) != 0 { + t.Errorf("Incorrect network total ETH balance %s", networkTotalEth.String()) + } + + // Get & check network staking ETH + if networkStakingEth, err := network.GetStakingETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkStakingEth.Cmp(stakingEth) != 0 { + t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) + } + + // Get & check network + if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { + t.Error(err) + } else if networkRethSupply.Cmp(rethSupply) != 0 { + t.Errorf("Incorrect network total rETH supply %s", networkRethSupply.String()) + } + + // Get & check ETH utilization rate + if ethUtilizationRate, err := network.GetETHUtilizationRate(rp, nil); err != nil { + t.Error(err) + } else if ethUtilizationRate != eth.WeiToEth(stakingEth) / eth.WeiToEth(totalEth) { + t.Errorf("Incorrect network ETH utilization rate %f", ethUtilizationRate) + } + +} + From 11e160d5c565887bb556176deac50006aed57b43 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 13:44:56 +1000 Subject: [PATCH 101/878] implementing network module unit tests --- settings/network.go | 11 +++++ tests/network/network_test.go | 77 +++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/settings/network.go b/settings/network.go index 7ec50b868..a9ac36244 100644 --- a/settings/network.go +++ b/settings/network.go @@ -88,6 +88,17 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*maximumNodeFee), nil } +func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + nodeFeeDemandRange := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, nodeFeeDemandRange, "getNodeFeeDemandRange"); err != nil { + return nil, fmt.Errorf("Could not get node fee demand range: %w", err) + } + return *nodeFeeDemandRange, nil +} // Get contracts diff --git a/tests/network/network_test.go b/tests/network/network_test.go index da7e4b11d..3bdc7be50 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -2,15 +2,18 @@ package network import ( "log" + "math/big" "os" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" @@ -24,6 +27,7 @@ var ( ownerAccount *accounts.Account nodeAccount *accounts.Account + userAccount *accounts.Account ) @@ -43,6 +47,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } // Run tests os.Exit(m.Run()) @@ -106,3 +112,74 @@ func TestSubmitBalances(t *testing.T) { } + +func TestNodeFee(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Get settings + targetNodeFee, err := settings.GetTargetNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + minNodeFee, err := settings.GetMinimumNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + maxNodeFee, err := settings.GetMaximumNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + demandRange, err := settings.GetNodeFeeDemandRange(rp, nil) + if err != nil { t.Fatal(err) } + + // Get & check initial node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node demand value %s", nodeDemand.String()) + } + + // Get & check initial node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect initial node fee %f", nodeFee) + } + + // Make user deposit + opts := userAccount.GetTransactor() + opts.Value = demandRange + if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } + + // Get & check updated node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(opts.Value) != 0 { + t.Errorf("Incorrect updated node demand value %s", nodeDemand.String()) + } + + // Get & check updated node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect updated node fee %f", nodeFee) + } + + // Get & check node fees by demand values + negDemandRange := new(big.Int) + negDemandRange.Neg(demandRange) + if nodeFee, err := network.GetNodeFeeByDemand(rp, big.NewInt(0), nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect node fee for zero demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, negDemandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != minNodeFee { + t.Errorf("Incorrect node fee for negative demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, demandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect node fee for positive demand %f", nodeFee) + } + +} + From 545867b60765aade5ddfaaa68f23ed7f27c33e18 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 14:08:49 +1000 Subject: [PATCH 102/878] updating network module --- network/withdrawal.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/network/withdrawal.go b/network/withdrawal.go index 177e8ad89..c43a84ead 100644 --- a/network/withdrawal.go +++ b/network/withdrawal.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -43,6 +44,34 @@ func GetWithdrawalCredentials(rp *rocketpool.RocketPool, opts *bind.CallOpts) (c } +// Set the network validator withdrawal credentials +func SetWithdrawalCredentials(rp *rocketpool.RocketPool, withdrawalCredentials common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "setWithdrawalCredentials", withdrawalCredentials) + if err != nil { + return nil, fmt.Errorf("Could not set network withdrawal credentials: %w", err) + } + return txReceipt, nil +} + + +// Transfer a validator balance to the withdrawal contract +func TransferWithdrawal(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkWithdrawalAddress, err := getRocketNetworkWithdrawalAddress(rp) + if err != nil { + return nil, err + } + txReceipt, err := eth.SendTransaction(rp.Client, *rocketNetworkWithdrawalAddress, opts) + if err != nil { + return nil, fmt.Errorf("Could not transfer validator balance: %w", err) + } + return txReceipt, nil +} + + // Process a validator withdrawal from the beacon chain func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.ValidatorPubkey, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) @@ -64,4 +93,10 @@ func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*bind.BoundContract, defer rocketNetworkWithdrawalLock.Unlock() return rp.GetContract("rocketNetworkWithdrawal") } +var rocketNetworkWithdrawalAddressLock sync.Mutex +func getRocketNetworkWithdrawalAddress(rp *rocketpool.RocketPool) (*common.Address, error) { + rocketNetworkWithdrawalAddressLock.Lock() + defer rocketNetworkWithdrawalAddressLock.Unlock() + return rp.GetAddress("rocketNetworkWithdrawal") +} From e59b6f2769d7dae14e187d2f02c0381297c8853c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 14:26:05 +1000 Subject: [PATCH 103/878] implementing network module unit tests --- network/withdrawal.go | 2 +- tests/network/network_test.go | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/network/withdrawal.go b/network/withdrawal.go index c43a84ead..792e8120b 100644 --- a/network/withdrawal.go +++ b/network/withdrawal.go @@ -50,7 +50,7 @@ func SetWithdrawalCredentials(rp *rocketpool.RocketPool, withdrawalCredentials c if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "setWithdrawalCredentials", withdrawalCredentials) + txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "setWithdrawalCredentials", withdrawalCredentials.Bytes()) if err != nil { return nil, fmt.Errorf("Could not set network withdrawal credentials: %w", err) } diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 3bdc7be50..00602af04 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -1,6 +1,7 @@ package network import ( + "bytes" "log" "math/big" "os" @@ -183,3 +184,49 @@ func TestNodeFee(t *testing.T) { } + +func TestSetWithdrawalCredentials(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set withdrawal credentials + withdrawalCredentials := common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") + if _, err := network.SetWithdrawalCredentials(rp, withdrawalCredentials, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check withdrawal credentials + if networkWithdrawalCredentials, err := network.GetWithdrawalCredentials(rp, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(networkWithdrawalCredentials.Bytes(), withdrawalCredentials.Bytes()) { + t.Errorf("Incorrect network withdrawal credentials %s", networkWithdrawalCredentials.Hex()) + } + +} + + +func TestTransferWithdrawal(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Transfer validator balance + opts := userAccount.GetTransactor() + opts.Value = eth.EthToWei(50) + opts.GasLimit = 100000 + if _, err := network.TransferWithdrawal(rp, opts); err != nil { + t.Fatal(err) + } + + // Get & check withdrawal contract balance + if withdrawalBalance, err := network.GetWithdrawalBalance(rp, nil); err != nil { + t.Error(err) + } else if withdrawalBalance.Cmp(opts.Value) != 0 { + t.Errorf("Incorrect withdrawal contract balance %s", withdrawalBalance.String()) + } + +} + From fa5403af5e32b69eef85b719ed185127f1952e07 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 14:38:47 +1000 Subject: [PATCH 104/878] implementing network module unit tests --- tests/network/network_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 00602af04..4acb21e61 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -230,3 +230,8 @@ func TestTransferWithdrawal(t *testing.T) { } + +func TestProcessWithdrawal(t *testing.T) { + // TODO: implement +} + From e98be8158caeafdaa8329230b2fd17e7303b7e8a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 14:46:13 +1000 Subject: [PATCH 105/878] updating tokens module --- tokens/neth.go | 10 ++++++++++ tokens/reth.go | 38 ++++++++++++++++++++++++++++++++++++++ tokens/tokens.go | 8 ++++++++ 3 files changed, 56 insertions(+) diff --git a/tokens/neth.go b/tokens/neth.go index 0082b45b8..53ae9d8e8 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -14,6 +14,16 @@ import ( ) +// Get nETH total supply +func GetNETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeETHToken, err := getRocketNodeETHToken(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketNodeETHToken, "nETH", opts) +} + + // Get nETH balance func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeETHToken, err := getRocketNodeETHToken(rp) diff --git a/tokens/reth.go b/tokens/reth.go index 94d4a4424..55baa1428 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -1,12 +1,16 @@ package tokens import ( + "fmt" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -20,6 +24,40 @@ func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } +// Get rETH balance +func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketETHToken, "rETH", address, opts) +} + + +// Transfer rETH +func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + return transfer(rp.Client, rocketETHToken, "rETH", to, amount, opts) +} + + +// Burn rETH for ETH +func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketETHToken, opts, "burn", amount) + if err != nil { + return nil, fmt.Errorf("Could not burn rETH: %w", err) + } + return txReceipt, nil +} + + // Get contracts var rocketETHTokenLock sync.Mutex func getRocketETHToken(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { diff --git a/tokens/tokens.go b/tokens/tokens.go index fb74a91c9..e1d545e05 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -20,6 +20,7 @@ import ( type Balances struct { ETH *big.Int `json:"eth"` NETH *big.Int `json:"neth"` + RETH *big.Int `json:"reth"` } @@ -34,6 +35,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C var wg errgroup.Group var ethBalance *big.Int var nethBalance *big.Int + var rethBalance *big.Int // Load data wg.Go(func() error { @@ -46,6 +48,11 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C nethBalance, err = GetNETHBalance(rp, address, opts) return err }) + wg.Go(func() error { + var err error + rethBalance, err = GetRETHBalance(rp, address, opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -56,6 +63,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C return Balances{ ETH: ethBalance, NETH: nethBalance, + RETH: rethBalance, }, nil } From d88529058a253e6e29f98a71881c18ea2fc1a6a5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 15:15:00 +1000 Subject: [PATCH 106/878] implementing tokens module unit tests --- tests/tokens/tokens_test.go | 91 +++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/tokens/tokens_test.go diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go new file mode 100644 index 000000000..dcd6b210e --- /dev/null +++ b/tests/tokens/tokens_test.go @@ -0,0 +1,91 @@ +package tokens + +import ( + "log" + "math/big" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + + +func TestRETHBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Get & check rETH total supply + if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if rethTotalSupply.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH total supply %s", rethTotalSupply.String()) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, userAccount.Address, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } + +} + + +// Mint an amount of rETH to an account +func mintRETH(account *accounts.Account, amount *big.Int) error { + opts := account.GetTransactor() + opts.Value = amount + _, err := deposit.Deposit(rp, opts) + return err +} + From 384f76589d25f3e0293012bda85d1b232aeafd26 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 21 Jan 2021 15:37:30 +1000 Subject: [PATCH 107/878] implementing tokens module unit tests --- tests/tokens/tokens_test.go | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index dcd6b210e..c39583ee1 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -81,6 +81,71 @@ func TestRETHBalances(t *testing.T) { } +func TestTransferRETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Transfer rETH + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } + +} + + +func TestBurnRETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Get initial balances + balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Burn rETH + burnAmount := eth.EthToWei(50) + if _, err := tokens.BurnRETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated balances + balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else { + if balances2.RETH.Cmp(balances1.RETH) != -1 { + t.Error("rETH balance did not decrease after burning rETH") + } + if balances2.ETH.Cmp(balances1.ETH) != 1 { + t.Error("ETH balance did not increase after burning rETH") + } + } + +} + + // Mint an amount of rETH to an account func mintRETH(account *accounts.Account, amount *big.Int) error { opts := account.GetTransactor() From b6350561fdf7f8b4a04fa915e34bd20e7e870356 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:07:50 +1000 Subject: [PATCH 108/878] updating settings module --- settings/deposit.go | 25 +++++++++++-------------- settings/minipool.go | 13 +++++++++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/settings/deposit.go b/settings/deposit.go index c6e3247cc..2ddce3e8c 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -25,6 +25,17 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *assignDepositsEnabled, nil } +func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, assignDepositsEnabled bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketDepositSettings, opts, "setAssignDepositsEnabled", assignDepositsEnabled) + if err != nil { + return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) + } + return txReceipt, nil +} // Maximum deposit assignments per transaction @@ -41,20 +52,6 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } -// Set deposit assignments currently enabled -func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.TransactOpts, value bool) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) - if err != nil { - return nil, err - } - txReceipt, err := contract.Transact(rp.Client, rocketDepositSettings, opts, "setAssignDepositsEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) - } - return txReceipt, nil -} - - // Get contracts var rocketDepositSettingsLock sync.Mutex func getRocketDepositSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { diff --git a/settings/minipool.go b/settings/minipool.go index b1ddd01b2..deea2e028 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -6,8 +6,10 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -87,6 +89,17 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*withdrawalDelay).Uint64(), nil } +func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, withdrawalDelay uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := contract.Transact(rp.Client, rocketMinipoolSettings, opts, "setWithdrawalDelay", big.NewInt(int64(withdrawalDelay))) + if err != nil { + return nil, fmt.Errorf("Could not set minipool withdrawal delay: %w", err) + } + return txReceipt, nil +} // Get contracts From a75eb1e86bfcaaa4535c4ba06b929cebe6d2c7db Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:08:11 +1000 Subject: [PATCH 109/878] minor deposit test fix --- tests/deposit/deposit_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index aebe9165a..e874f740e 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -94,7 +94,7 @@ func TestAssignDeposits(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Disable deposit assignments - if _, err := settings.SetAssignDepositsEnabled(rp, ownerAccount.GetTransactor(), false); err != nil { t.Fatal(err) } + if _, err := settings.SetAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Make user deposit userDepositOpts := userAccount.GetTransactor() @@ -110,7 +110,7 @@ func TestAssignDeposits(t *testing.T) { if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } // Re-enable deposit assignments - if _, err := settings.SetAssignDepositsEnabled(rp, ownerAccount.GetTransactor(), true); err != nil { t.Fatal(err) } + if _, err := settings.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) From 5829985ba0b3f3a96eb764c3231db2d78b9b5552 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:09:38 +1000 Subject: [PATCH 110/878] added tests validator utils --- go.mod | 6 ++++ go.sum | 20 +++++++++++ tests/config.go | 6 ++++ tests/utils/validator/deposit-data.go | 52 +++++++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 tests/utils/validator/deposit-data.go diff --git a/go.mod b/go.mod index 20070d164..40df4dff2 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,12 @@ module github.com/rocket-pool/rocketpool-go go 1.13 require ( + github.com/dgraph-io/ristretto v0.0.3 // indirect github.com/ethereum/go-ethereum v1.9.15 + github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect + github.com/minio/highwayhash v1.0.1 // indirect + github.com/protolambda/zssz v0.1.5 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 // indirect + github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f ) diff --git a/go.sum b/go.sum index 1135d98f1..aca742d68 100644 --- a/go.sum +++ b/go.sum @@ -36,7 +36,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= +github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= @@ -46,6 +49,8 @@ github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt github.com/ethereum/go-ethereum v1.9.15 h1:wrWl+QrtutRUJ9LZXdUqBoGoo2b1tOCYRDrAOQhCY3A= github.com/ethereum/go-ethereum v1.9.15/go.mod h1:slT8bPPRhXsyNTwHQxrOnjuTZ1sDXRajW11EkJ84QJ0= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 h1:9VDpsWq096+oGMDTT/SgBD/VgZYf4pTF+KTPmZ+OaKM= +github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= @@ -92,6 +97,12 @@ github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -116,6 +127,12 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= +github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 h1:SMro7Z5L2ACvcKREIVJDn8LvoVTY1TY2rTlPJmDlUWc= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= +github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= +github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -155,6 +172,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTm golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= @@ -174,4 +192,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/tests/config.go b/tests/config.go index 964a85d8f..a56286f52 100644 --- a/tests/config.go +++ b/tests/config.go @@ -6,6 +6,12 @@ const ( RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" ) +const ( + ValidatorPubkey = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30e" + ValidatorSignature = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e33" + WithdrawalCredentials = "00d77be6277f1cdcfce33fdcb127b95fe91e09eec04aecc521dc94866f0055f0" +) + var AccountPrivateKeys = []string{ "c6d2ac9b00bd599c4ce9d3a69c91e496eb9e79781d9dc84c79bafa7618f45f37", "025515b79bbe5edf008112d19a14457e6bea72dc4660667eeb2c3225c8285618", diff --git a/tests/utils/validator/deposit-data.go b/tests/utils/validator/deposit-data.go new file mode 100644 index 000000000..9abad1f66 --- /dev/null +++ b/tests/utils/validator/deposit-data.go @@ -0,0 +1,52 @@ +package validator + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/prysmaticlabs/go-ssz" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/types" +) + + +// Deposit settings +const depositAmount = 32000000000 // gwei + + +// Deposit data +type depositData struct { + PublicKey []byte `ssz-size:"48"` + WithdrawalCredentials []byte `ssz-size:"32"` + Amount uint64 + Signature []byte `ssz-size:"96"` +} + + +// Get the validator pubkey +func GetValidatorPubkey() (types.ValidatorPubkey, error) { + return types.HexToValidatorPubkey(tests.ValidatorPubkey) +} + + +// Get the validator deposit signature +func GetValidatorSignature() (types.ValidatorSignature, error) { + return types.HexToValidatorSignature(tests.ValidatorSignature) +} + + +// Get the withdrawal credentials +func GetWithdrawalCredentials() common.Hash { + return common.HexToHash(tests.WithdrawalCredentials) +} + + +// Get the validator deposit depositDataRoot +func GetDepositDataRoot(validatorPubkey types.ValidatorPubkey, withdrawalCredentials common.Hash, validatorSignature types.ValidatorSignature) (common.Hash, error) { + return ssz.HashTreeRoot(depositData{ + PublicKey: validatorPubkey.Bytes(), + WithdrawalCredentials: withdrawalCredentials[:], + Amount: depositAmount, + Signature: validatorSignature.Bytes(), + }) +} + From 080c1f0f3b47a3bf6bbd5f03e453204ca0743b35 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:14:26 +1000 Subject: [PATCH 111/878] minor test fixes --- tests/deposit/deposit_test.go | 12 +++--------- tests/network/network_test.go | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index e874f740e..4292d072d 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -60,12 +60,9 @@ func TestDeposit(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Deposit amount - depositAmount := eth.EthToWei(10) - // Make deposit opts := userAccount.GetTransactor() - opts.Value = depositAmount + opts.Value = eth.EthToWei(10) if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } @@ -73,14 +70,14 @@ func TestDeposit(t *testing.T) { // Get & check deposit pool balance if balance, err := deposit.GetBalance(rp, nil); err != nil { t.Error(err) - } else if balance.Cmp(depositAmount) != 0 { + } else if balance.Cmp(opts.Value) != 0 { t.Error("Incorrect deposit pool balance") } // Get & check deposit pool excess balance if excessBalance, err := deposit.GetExcessBalance(rp, nil); err != nil { t.Error(err) - } else if excessBalance.Cmp(depositAmount) != 0 { + } else if excessBalance.Cmp(opts.Value) != 0 { t.Error("Incorrect deposit pool excess balance") } @@ -109,9 +106,6 @@ func TestAssignDeposits(t *testing.T) { nodeDepositOpts.Value = eth.EthToWei(16) if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } - // Re-enable deposit assignments - if _, err := settings.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) if err != nil { diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 4acb21e61..949a56225 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -97,7 +97,7 @@ func TestSubmitBalances(t *testing.T) { t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) } - // Get & check network + // Get & check network rETH supply if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { t.Error(err) } else if networkRethSupply.Cmp(rethSupply) != 0 { From 8e37cd10141698bc5379f1615939877e654c20e1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:30:31 +1000 Subject: [PATCH 112/878] minor fix --- tests/deposit/deposit_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 4292d072d..0bc3f12da 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -106,6 +106,9 @@ func TestAssignDeposits(t *testing.T) { nodeDepositOpts.Value = eth.EthToWei(16) if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } + // Re-enable deposit assignments + if _, err := settings.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) if err != nil { From 5630205fce2e92f0ea90c2f82f35600c1f34439c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 14:34:14 +1000 Subject: [PATCH 113/878] implementing token helpers --- tests/utils/tokens/neth.go | 78 ++++++++++++++++++++++++++++++++++++++ tests/utils/tokens/reth.go | 26 +++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 tests/utils/tokens/neth.go create mode 100644 tests/utils/tokens/reth.go diff --git a/tests/utils/tokens/neth.go b/tests/utils/tokens/neth.go new file mode 100644 index 000000000..ea0e99ab9 --- /dev/null +++ b/tests/utils/tokens/neth.go @@ -0,0 +1,78 @@ +package tokens + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Minipool created event +type minipoolCreated struct { + Minipool common.Address + Node common.Address + Time *big.Int +} + + +// Mint an amount of nETH to an account +func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { + + // Register trusted node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return err } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { return err } + if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } + + // Make node deposit + opts := toAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + txReceipt, err := node.Deposit(rp, 0, opts) + if err != nil { return err } + + // Get created minipool address + minipoolManagerAddress, minipoolManagerABI, err := contract.GetDetails(rp, "rocketMinipoolManager") + if err != nil { return err } + minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, minipoolManagerAddress, minipoolManagerABI, txReceipt, "MinipoolCreated", minipoolCreated{}) + if err != nil || len(minipoolCreatedEvents) == 0 { + return errors.New("Could not get minipool created event") + } + minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool + + // Stake minipool + mp, err := minipool.NewMinipool(rp, minipoolAddress) + if err != nil { return err } + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { return err } + validatorSignature, err := validator.GetValidatorSignature() + if err != nil { return err } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + if err != nil { return err } + if _, err := mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, toAccount.GetTransactor()); err != nil { return err } + + // Disable minipool withdrawal delay + withdrawalDelay, err := settings.GetMinipoolWithdrawalDelay(rp, nil) + if err != nil { return err } + if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } + + // Mark minipool as withdrawable and withdraw + if _, err := minipool.SubmitMinipoolWithdrawable(rp, minipoolAddress, eth.EthToWei(32), amount, nodeAccount.GetTransactor()); err != nil { return err } + if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } + + // Re-enable minipool withdrawal delay + if _, err := settings.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } + + // Return + return nil + +} + diff --git a/tests/utils/tokens/reth.go b/tests/utils/tokens/reth.go new file mode 100644 index 000000000..f725732df --- /dev/null +++ b/tests/utils/tokens/reth.go @@ -0,0 +1,26 @@ +package tokens + +import ( + "math/big" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + //"github.com/rocket-pool/rocketpool-go/tokens" +) + + +// Mint an amount of rETH to an account +func MintRETH(rp *rocketpool.RocketPool, toAccount *accounts.Account, amount *big.Int) error { + + // Get rETH exchange rate + // TODO: implement + + // Deposit from account to mint rETH + opts := toAccount.GetTransactor() + opts.Value = amount + _, err := deposit.Deposit(rp, opts) + return err + +} + From 5456385dd5520a0218487f9057258124e8611266 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 15:02:11 +1000 Subject: [PATCH 114/878] updating tokens module --- tokens/reth.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tokens/reth.go b/tokens/reth.go index 55baa1428..5827f7c32 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/contract" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -34,6 +35,48 @@ func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bin } +// Get the ETH value of an amount of rETH +func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + ethValue := new(*big.Int) + if err := rocketETHToken.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { + return nil, fmt.Errorf("Could not get ETH value of rETH amount: %w", err) + } + return *ethValue, nil +} + + +// Get the rETH value of an amount of ETH +func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + rethValue := new(*big.Int) + if err := rocketETHToken.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { + return nil, fmt.Errorf("Could not get rETH value of ETH amount: %w", err) + } + return *rethValue, nil +} + + +// Get the current ETH : rETH exchange rate +func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return 0, err + } + exchangeRate := new(*big.Int) + if err := rocketETHToken.Call(opts, exchangeRate, "getExchangeRate"); err != nil { + return 0, fmt.Errorf("Could not get rETH exchange rate: %w", err) + } + return eth.WeiToEth(*exchangeRate), nil +} + + // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketETHToken, err := getRocketETHToken(rp) From 09422466dd01021ff9b9e6404e9756779fd292dc Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 15:02:30 +1000 Subject: [PATCH 115/878] implementing token helpers --- tests/utils/tokens/reth.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/utils/tokens/reth.go b/tests/utils/tokens/reth.go index f725732df..aaf819d79 100644 --- a/tests/utils/tokens/reth.go +++ b/tests/utils/tokens/reth.go @@ -6,20 +6,21 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - //"github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/tokens" ) // Mint an amount of rETH to an account func MintRETH(rp *rocketpool.RocketPool, toAccount *accounts.Account, amount *big.Int) error { - // Get rETH exchange rate - // TODO: implement + // Get ETH value of amount + ethValue, err := tokens.GetETHValueOfRETH(rp, amount, nil) + if err != nil { return err } // Deposit from account to mint rETH opts := toAccount.GetTransactor() - opts.Value = amount - _, err := deposit.Deposit(rp, opts) + opts.Value = ethValue + _, err = deposit.Deposit(rp, opts) return err } From 1bcced0ca8346f086cde09189ed246be61935354 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 15:02:54 +1000 Subject: [PATCH 116/878] implementing tokens module unit tests --- tests/tokens/tokens_test.go | 45 +++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index c39583ee1..6b3d6538c 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -2,18 +2,17 @@ package tokens import ( "log" - "math/big" "os" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -54,6 +53,33 @@ func TestMain(m *testing.M) { } +func TestNETHBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint nETH + nethAmount := eth.EthToWei(100) + if err := tokenutils.MintNETH(rp, ownerAccount, nodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + + // Get & check nETH total supply + if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if nethTotalSupply.Cmp(nethAmount) != 0 { + t.Errorf("Incorrect nETH total supply %s", nethTotalSupply.String()) + } + + // Get & check nETH account balance + if nethBalance, err := tokens.GetNETHBalance(rp, userAccount.Address, nil); err != nil { + t.Error(err) + } else if nethBalance.Cmp(nethAmount) != 0 { + t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) + } + +} + + func TestRETHBalances(t *testing.T) { // State snapshotting @@ -62,7 +88,7 @@ func TestRETHBalances(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Get & check rETH total supply if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { @@ -89,7 +115,7 @@ func TestTransferRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Transfer rETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") @@ -116,7 +142,7 @@ func TestBurnRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := mintRETH(userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Get initial balances balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) @@ -145,12 +171,3 @@ func TestBurnRETH(t *testing.T) { } - -// Mint an amount of rETH to an account -func mintRETH(account *accounts.Account, amount *big.Int) error { - opts := account.GetTransactor() - opts.Value = amount - _, err := deposit.Deposit(rp, opts) - return err -} - From 88b157823d8fdf2ed10f4e25c1b1ef92d1a88dcb Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 15:13:21 +1000 Subject: [PATCH 117/878] updating tokens module --- tokens/reth.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tokens/reth.go b/tokens/reth.go index 5827f7c32..211db6f94 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -77,6 +77,34 @@ func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float6 } +// Get the total amount of ETH collateral available for rETH trades +func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + totalCollateral := new(*big.Int) + if err := rocketETHToken.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { + return nil, fmt.Errorf("Could not get rETH total collateral: %w", err) + } + return *totalCollateral, nil +} + + +// Get the rETH collateralization rate +func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return 0, err + } + collateralRate := new(*big.Int) + if err := rocketETHToken.Call(opts, collateralRate, "getCollateralRate"); err != nil { + return 0, fmt.Errorf("Could not get rETH collateral rate: %w", err) + } + return eth.WeiToEth(*collateralRate), nil +} + + // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketETHToken, err := getRocketETHToken(rp) From d83e164ffb7d715f5593020e503e430a075a03fd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 22 Jan 2021 15:47:04 +1000 Subject: [PATCH 118/878] minor cleanup --- tests/utils/tokens/neth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/tokens/neth.go b/tests/utils/tokens/neth.go index ea0e99ab9..8805ed085 100644 --- a/tests/utils/tokens/neth.go +++ b/tests/utils/tokens/neth.go @@ -28,7 +28,7 @@ type minipoolCreated struct { // Mint an amount of nETH to an account func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { - // Register trusted node + // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return err } if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { return err } if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } From 3e7f94a02c361689f3398aa1d02d16b8fc2adf9e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 28 Jan 2021 16:34:43 +1000 Subject: [PATCH 119/878] implementing test helpers --- tests/utils/minipool/minipool.go | 68 ++++++++++++++++++++++++++++++++ tests/utils/tokens/neth.go | 43 +++----------------- 2 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 tests/utils/minipool/minipool.go diff --git a/tests/utils/minipool/minipool.go b/tests/utils/minipool/minipool.go new file mode 100644 index 000000000..7b543ea81 --- /dev/null +++ b/tests/utils/minipool/minipool.go @@ -0,0 +1,68 @@ +package minipool + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/utils/contract" +) + + +// Minipool created event +type minipoolCreated struct { + Minipool common.Address + Node common.Address + Time *big.Int +} + + +// Create a minipool +func CreateMinipool(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int) (*minipool.Minipool, error) { + + // Make node deposit + opts := nodeAccount.GetTransactor() + opts.Value = depositAmount + txReceipt, err := node.Deposit(rp, 0, opts) + if err != nil { return nil, err } + + // Get minipool manager contract details + minipoolManagerAddress, minipoolManagerABI, err := contract.GetDetails(rp, "rocketMinipoolManager") + if err != nil { return nil, err } + + // Get created minipool address + minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, minipoolManagerAddress, minipoolManagerABI, txReceipt, "MinipoolCreated", minipoolCreated{}) + if err != nil || len(minipoolCreatedEvents) == 0 { + return nil, errors.New("Could not get minipool created event") + } + minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool + + // Return minipool instance + return minipool.NewMinipool(rp, minipoolAddress) + +} + + +// Stake a minipool +func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount *accounts.Account) error { + + // Get validator data + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { return err } + validatorSignature, err := validator.GetValidatorSignature() + if err != nil { return err } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + if err != nil { return err } + + // Stake minipool & return + _, err = mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()) + return err + +} + diff --git a/tests/utils/tokens/neth.go b/tests/utils/tokens/neth.go index 8805ed085..ec2ea51d3 100644 --- a/tests/utils/tokens/neth.go +++ b/tests/utils/tokens/neth.go @@ -1,30 +1,18 @@ package tokens import ( - "errors" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" - "github.com/rocket-pool/rocketpool-go/utils/contract" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Minipool created event -type minipoolCreated struct { - Minipool common.Address - Node common.Address - Time *big.Int -} - - // Mint an amount of nETH to an account func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { @@ -33,31 +21,10 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAcc if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { return err } if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } - // Make node deposit - opts := toAccount.GetTransactor() - opts.Value = eth.EthToWei(32) - txReceipt, err := node.Deposit(rp, 0, opts) - if err != nil { return err } - - // Get created minipool address - minipoolManagerAddress, minipoolManagerABI, err := contract.GetDetails(rp, "rocketMinipoolManager") - if err != nil { return err } - minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, minipoolManagerAddress, minipoolManagerABI, txReceipt, "MinipoolCreated", minipoolCreated{}) - if err != nil || len(minipoolCreatedEvents) == 0 { - return errors.New("Could not get minipool created event") - } - minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool - - // Stake minipool - mp, err := minipool.NewMinipool(rp, minipoolAddress) - if err != nil { return err } - validatorPubkey, err := validator.GetValidatorPubkey() - if err != nil { return err } - validatorSignature, err := validator.GetValidatorSignature() - if err != nil { return err } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + // Create & stake minipool + mp, err := minipoolutils.CreateMinipool(rp, toAccount, eth.EthToWei(32)) if err != nil { return err } - if _, err := mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, toAccount.GetTransactor()); err != nil { return err } + if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return err } // Disable minipool withdrawal delay withdrawalDelay, err := settings.GetMinipoolWithdrawalDelay(rp, nil) @@ -65,7 +32,7 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAcc if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } // Mark minipool as withdrawable and withdraw - if _, err := minipool.SubmitMinipoolWithdrawable(rp, minipoolAddress, eth.EthToWei(32), amount, nodeAccount.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, nodeAccount.GetTransactor()); err != nil { return err } if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } // Re-enable minipool withdrawal delay From 8d5e4125f0e59a8f75a759e022cdc74613fa2d94 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 28 Jan 2021 16:42:09 +1000 Subject: [PATCH 120/878] minor cleanup --- tests/utils/minipool/minipool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/minipool/minipool.go b/tests/utils/minipool/minipool.go index 7b543ea81..b19721c5a 100644 --- a/tests/utils/minipool/minipool.go +++ b/tests/utils/minipool/minipool.go @@ -52,7 +52,7 @@ func CreateMinipool(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, de // Stake a minipool func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount *accounts.Account) error { - // Get validator data + // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey() if err != nil { return err } validatorSignature, err := validator.GetValidatorSignature() From a211eaa9ad65ed17b81feaba61e5732ec3759038 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 28 Jan 2021 16:47:47 +1000 Subject: [PATCH 121/878] implementing tokens module unit tests --- tests/tokens/tokens_test.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index 6b3d6538c..805544b7b 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -80,6 +80,33 @@ func TestNETHBalances(t *testing.T) { } +func TestTransferNETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint nETH + nethAmount := eth.EthToWei(100) + if err := tokenutils.MintNETH(rp, ownerAccount, nodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + + // Transfer nETH + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferNETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check nETH account balance + if nethBalance, err := tokens.GetNETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if nethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) + } + +} + + func TestRETHBalances(t *testing.T) { // State snapshotting From f9b03a7442606a7085e457c3fd1dd3996c835e2b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 10:59:07 +1000 Subject: [PATCH 122/878] implementing RP bound contract wrapper type --- deposit/deposit.go | 2 +- minipool/minipool-contract.go | 4 ++-- minipool/minipool.go | 6 ++--- network/balances.go | 2 +- network/fees.go | 2 +- network/withdrawal.go | 12 +++------- node/deposit.go | 2 +- node/node.go | 2 +- rocketpool/contract.go | 22 +++++++++++++++++ rocketpool/rocketpool.go | 22 +++++++++++------ settings/deposit.go | 2 +- settings/minipool.go | 2 +- settings/network.go | 2 +- settings/node.go | 2 +- tests/utils/minipool/minipool.go | 6 ++--- tokens/neth.go | 2 +- tokens/reth.go | 2 +- tokens/tokens.go | 6 ++--- utils/contract/contract.go | 41 -------------------------------- utils/contract/events.go | 16 +++++-------- utils/contract/transactions.go | 6 +++-- 21 files changed, 72 insertions(+), 91 deletions(-) create mode 100644 rocketpool/contract.go delete mode 100644 utils/contract/contract.go diff --git a/deposit/deposit.go b/deposit/deposit.go index 4d3c67613..9bdc29d9d 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -71,7 +71,7 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types. // Get contracts var rocketDepositPoolLock sync.Mutex -func getRocketDepositPool(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketDepositPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketDepositPoolLock.Lock() defer rocketDepositPoolLock.Unlock() return rp.GetContract("rocketDepositPool") diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 16dda97a5..4d8929c04 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -45,7 +45,7 @@ type StakingDetails struct { // Minipool contract type Minipool struct { Address common.Address - Contract *bind.BoundContract + Contract *rocketpool.Contract RocketPool *rocketpool.RocketPool } @@ -392,7 +392,7 @@ func (mp *Minipool) Close(opts *bind.TransactOpts) (*types.Receipt, error) { // Get a minipool contract var rocketMinipoolLock sync.Mutex -func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*bind.BoundContract, error) { +func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { rocketMinipoolLock.Lock() defer rocketMinipoolLock.Unlock() return rp.MakeContract("rocketMinipool", minipoolAddress) diff --git a/minipool/minipool.go b/minipool/minipool.go index 210db9ed8..156df4ed3 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -562,19 +562,19 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() return rp.GetContract("rocketMinipoolManager") } var rocketMinipoolQueueLock sync.Mutex -func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolQueueLock.Lock() defer rocketMinipoolQueueLock.Unlock() return rp.GetContract("rocketMinipoolQueue") } var rocketMinipoolStatusLock sync.Mutex -func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolStatusLock.Lock() defer rocketMinipoolStatusLock.Unlock() return rp.GetContract("rocketMinipoolStatus") diff --git a/network/balances.go b/network/balances.go index 37d9cc7f9..ab8c1402a 100644 --- a/network/balances.go +++ b/network/balances.go @@ -100,7 +100,7 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt // Get contracts var rocketNetworkBalancesLock sync.Mutex -func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNetworkBalancesLock.Lock() defer rocketNetworkBalancesLock.Unlock() return rp.GetContract("rocketNetworkBalances") diff --git a/network/fees.go b/network/fees.go index 8ded0c5ee..94cbe0c5a 100644 --- a/network/fees.go +++ b/network/fees.go @@ -56,7 +56,7 @@ func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bi // Get contracts var rocketNetworkFeesLock sync.Mutex -func getRocketNetworkFees(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNetworkFees(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNetworkFeesLock.Lock() defer rocketNetworkFeesLock.Unlock() return rp.GetContract("rocketNetworkFees") diff --git a/network/withdrawal.go b/network/withdrawal.go index 792e8120b..2432f734b 100644 --- a/network/withdrawal.go +++ b/network/withdrawal.go @@ -60,11 +60,11 @@ func SetWithdrawalCredentials(rp *rocketpool.RocketPool, withdrawalCredentials c // Transfer a validator balance to the withdrawal contract func TransferWithdrawal(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkWithdrawalAddress, err := getRocketNetworkWithdrawalAddress(rp) + rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { return nil, err } - txReceipt, err := eth.SendTransaction(rp.Client, *rocketNetworkWithdrawalAddress, opts) + txReceipt, err := eth.SendTransaction(rp.Client, *(rocketNetworkWithdrawal.Address), opts) if err != nil { return nil, fmt.Errorf("Could not transfer validator balance: %w", err) } @@ -88,15 +88,9 @@ func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.Valida // Get contracts var rocketNetworkWithdrawalLock sync.Mutex -func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNetworkWithdrawalLock.Lock() defer rocketNetworkWithdrawalLock.Unlock() return rp.GetContract("rocketNetworkWithdrawal") } -var rocketNetworkWithdrawalAddressLock sync.Mutex -func getRocketNetworkWithdrawalAddress(rp *rocketpool.RocketPool) (*common.Address, error) { - rocketNetworkWithdrawalAddressLock.Lock() - defer rocketNetworkWithdrawalAddressLock.Unlock() - return rp.GetAddress("rocketNetworkWithdrawal") -} diff --git a/node/deposit.go b/node/deposit.go index 36629ee30..7bdb1a6d1 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -29,7 +29,7 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.Trans // Get contracts var rocketNodeDepositLock sync.Mutex -func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNodeDepositLock.Lock() defer rocketNodeDepositLock.Unlock() return rp.GetContract("rocketNodeDeposit") diff --git a/node/node.go b/node/node.go index 7b72bf0da..44bba4cb6 100644 --- a/node/node.go +++ b/node/node.go @@ -377,7 +377,7 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt // Get contracts var rocketNodeManagerLock sync.Mutex -func getRocketNodeManager(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNodeManagerLock.Lock() defer rocketNodeManagerLock.Unlock() return rp.GetContract("rocketNodeManager") diff --git a/rocketpool/contract.go b/rocketpool/contract.go new file mode 100644 index 000000000..4d9ba8095 --- /dev/null +++ b/rocketpool/contract.go @@ -0,0 +1,22 @@ +package rocketpool + +import ( + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + + +// Contract type wraps go-ethereum bound contract +type Contract struct { + Contract *bind.BoundContract + Address *common.Address + ABI *abi.ABI +} + + +// Call a contract method +func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return c.Contract.Call(opts, result, method, params...) +} + diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 3811591ab..cbf5b6d9d 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -33,7 +33,7 @@ type cachedABI struct { time int64 } type cachedContract struct { - contract *bind.BoundContract + contract *Contract time int64 } @@ -189,7 +189,7 @@ func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { // Load Rocket Pool contracts -func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, error) { +func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { // Check for cached contract if cached, ok := rp.getCachedContract(contractName); ok { @@ -223,7 +223,11 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err } // Create contract - contract := bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client) + contract := &Contract{ + Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), + Address: address, + ABI: abi, + } // Cache contract rp.setCachedContract(contractName, cachedContract{ @@ -235,11 +239,11 @@ func (rp *RocketPool) GetContract(contractName string) (*bind.BoundContract, err return contract, nil } -func (rp *RocketPool) GetContracts(contractNames ...string) ([]*bind.BoundContract, error) { +func (rp *RocketPool) GetContracts(contractNames ...string) ([]*Contract, error) { // Data var wg errgroup.Group - contracts := make([]*bind.BoundContract, len(contractNames)) + contracts := make([]*Contract, len(contractNames)) // Load contracts for ci, contractName := range contractNames { @@ -263,7 +267,7 @@ func (rp *RocketPool) GetContracts(contractNames ...string) ([]*bind.BoundContra // Create a Rocket Pool contract instance -func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*bind.BoundContract, error) { +func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*Contract, error) { // Load ABI abi, err := rp.GetABI(contractName) @@ -272,7 +276,11 @@ func (rp *RocketPool) MakeContract(contractName string, address common.Address) } // Create and return - return bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), nil + return &Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + }, nil } diff --git a/settings/deposit.go b/settings/deposit.go index 2ddce3e8c..102bbf06c 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -54,7 +54,7 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts // Get contracts var rocketDepositSettingsLock sync.Mutex -func getRocketDepositSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketDepositSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketDepositSettingsLock.Lock() defer rocketDepositSettingsLock.Unlock() return rp.GetContract("rocketDepositSettings") diff --git a/settings/minipool.go b/settings/minipool.go index deea2e028..d73b311ba 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -104,7 +104,7 @@ func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, withdrawalDelay uint6 // Get contracts var rocketMinipoolSettingsLock sync.Mutex -func getRocketMinipoolSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketMinipoolSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolSettingsLock.Lock() defer rocketMinipoolSettingsLock.Unlock() return rp.GetContract("rocketMinipoolSettings") diff --git a/settings/network.go b/settings/network.go index a9ac36244..357b8b4ed 100644 --- a/settings/network.go +++ b/settings/network.go @@ -103,7 +103,7 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big // Get contracts var rocketNetworkSettingsLock sync.Mutex -func getRocketNetworkSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNetworkSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNetworkSettingsLock.Lock() defer rocketNetworkSettingsLock.Unlock() return rp.GetContract("rocketNetworkSettings") diff --git a/settings/node.go b/settings/node.go index 2f82138ca..e84dcbd7d 100644 --- a/settings/node.go +++ b/settings/node.go @@ -40,7 +40,7 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool // Get contracts var rocketNodeSettingsLock sync.Mutex -func getRocketNodeSettings(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNodeSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNodeSettingsLock.Lock() defer rocketNodeSettingsLock.Unlock() return rp.GetContract("rocketNodeSettings") diff --git a/tests/utils/minipool/minipool.go b/tests/utils/minipool/minipool.go index b19721c5a..695ec0280 100644 --- a/tests/utils/minipool/minipool.go +++ b/tests/utils/minipool/minipool.go @@ -32,12 +32,12 @@ func CreateMinipool(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, de txReceipt, err := node.Deposit(rp, 0, opts) if err != nil { return nil, err } - // Get minipool manager contract details - minipoolManagerAddress, minipoolManagerABI, err := contract.GetDetails(rp, "rocketMinipoolManager") + // Get minipool manager contract + rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager") if err != nil { return nil, err } // Get created minipool address - minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, minipoolManagerAddress, minipoolManagerABI, txReceipt, "MinipoolCreated", minipoolCreated{}) + minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, rocketMinipoolManager, txReceipt, "MinipoolCreated", minipoolCreated{}) if err != nil || len(minipoolCreatedEvents) == 0 { return nil, errors.New("Could not get minipool created event") } diff --git a/tokens/neth.go b/tokens/neth.go index 53ae9d8e8..6d5e5381b 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -60,7 +60,7 @@ func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt // Get contracts var rocketNodeETHTokenLock sync.Mutex -func getRocketNodeETHToken(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketNodeETHToken(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketNodeETHTokenLock.Lock() defer rocketNodeETHTokenLock.Unlock() return rp.GetContract("rocketNodeETHToken") diff --git a/tokens/reth.go b/tokens/reth.go index 211db6f94..b78d2afff 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -131,7 +131,7 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt // Get contracts var rocketETHTokenLock sync.Mutex -func getRocketETHToken(rp *rocketpool.RocketPool) (*bind.BoundContract, error) { +func getRocketETHToken(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketETHTokenLock.Lock() defer rocketETHTokenLock.Unlock() return rp.GetContract("rocketETHToken") diff --git a/tokens/tokens.go b/tokens/tokens.go index e1d545e05..0954adf97 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -70,7 +70,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Get a token's total supply -func totalSupply(tokenContract *bind.BoundContract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { +func totalSupply(tokenContract *rocketpool.Contract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { totalSupply := new(*big.Int) if err := tokenContract.Call(opts, totalSupply, "totalSupply"); err != nil { return nil, fmt.Errorf("Could not get %s total supply: %w", tokenName, err) @@ -80,7 +80,7 @@ func totalSupply(tokenContract *bind.BoundContract, tokenName string, opts *bind // Get a token balance -func balanceOf(tokenContract *bind.BoundContract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { +func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { balance := new(*big.Int) if err := tokenContract.Call(opts, balance, "balanceOf", address); err != nil { return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) @@ -90,7 +90,7 @@ func balanceOf(tokenContract *bind.BoundContract, tokenName string, address comm // Transfer tokens to an address -func transfer(client *ethclient.Client, tokenContract *bind.BoundContract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func transfer(client *ethclient.Client, tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := contract.Transact(client, tokenContract, opts, "transfer", to, amount) if err != nil { return nil, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) diff --git a/utils/contract/contract.go b/utils/contract/contract.go deleted file mode 100644 index 217247665..000000000 --- a/utils/contract/contract.go +++ /dev/null @@ -1,41 +0,0 @@ -package contract - -import ( - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/rocketpool" -) - - -// Get a contract's address and ABI -func GetDetails(rp *rocketpool.RocketPool, contractName string) (*common.Address, *abi.ABI, error) { - - // Data - var wg errgroup.Group - var address *common.Address - var abi *abi.ABI - - // Load data - wg.Go(func() error { - var err error - address, err = rp.GetAddress(contractName) - return err - }) - wg.Go(func() error { - var err error - abi, err = rp.GetABI(contractName) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return nil, nil, err - } - - // Return - return address, abi, nil - -} - diff --git a/utils/contract/events.go b/utils/contract/events.go index e0b408203..9d1cca2ae 100644 --- a/utils/contract/events.go +++ b/utils/contract/events.go @@ -6,18 +6,17 @@ import ( "fmt" "reflect" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Get contract events from a transaction // eventPrototype must be an event struct type // Returns a slice of untyped values; assert returned events to event struct type -func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Address, contractAbi *abi.ABI, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { +func GetTransactionEvents(client *ethclient.Client, contract *rocketpool.Contract, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { // Get event type eventType := reflect.TypeOf(eventPrototype) @@ -26,20 +25,17 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr } // Get ABI event - abiEvent, ok := contractAbi.Events[eventName] + abiEvent, ok := contract.ABI.Events[eventName] if !ok { return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) } - // Create contract instance - contract := bind.NewBoundContract(*contractAddress, *contractAbi, client, client, client) - // Process transaction receipt logs events := make([]interface{}, 0) for _, log := range txReceipt.Logs { // Check log address matches contract address - if !bytes.Equal(log.Address.Bytes(), contractAddress.Bytes()) { + if !bytes.Equal(log.Address.Bytes(), contract.Address.Bytes()) { continue } @@ -50,7 +46,7 @@ func GetTransactionEvents(client *ethclient.Client, contractAddress *common.Addr // Unpack event event := reflect.New(eventType) - if err := contract.UnpackLog(event.Interface(), eventName, *log); err != nil { + if err := contract.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { return nil, fmt.Errorf("Could not unpack event data: %w", err) } events = append(events, reflect.Indirect(event).Interface()) diff --git a/utils/contract/transactions.go b/utils/contract/transactions.go index d8202ccef..443e68ba7 100644 --- a/utils/contract/transactions.go +++ b/utils/contract/transactions.go @@ -7,14 +7,16 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Transact on a contract method and wait for a receipt -func Transact(client *ethclient.Client, contract *bind.BoundContract, opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { +func Transact(client *ethclient.Client, contract *rocketpool.Contract, opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { // Send transaction - tx, err := contract.Transact(opts, method, params...) + tx, err := contract.Contract.Transact(opts, method, params...) if err != nil { return nil, err } From d8f2a8814a6f3a8b45b831338f43d6440f8c6d92 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 11:30:55 +1000 Subject: [PATCH 123/878] implementing RP bound contract wrapper type --- deposit/deposit.go | 5 +- minipool/minipool-contract.go | 11 ++-- minipool/minipool.go | 3 +- network/balances.go | 3 +- network/withdrawal.go | 8 +-- node/deposit.go | 3 +- node/node.go | 7 +- rocketpool/contract.go | 107 +++++++++++++++++++++++++++++++ rocketpool/rocketpool.go | 2 + settings/deposit.go | 3 +- settings/minipool.go | 3 +- tests/network/network_test.go | 1 - tests/utils/minipool/minipool.go | 3 +- tokens/neth.go | 3 +- tokens/reth.go | 3 +- tokens/tokens.go | 3 +- utils/contract/events.go | 60 ----------------- utils/contract/transactions.go | 39 ----------- 18 files changed, 131 insertions(+), 136 deletions(-) delete mode 100644 utils/contract/events.go delete mode 100644 utils/contract/transactions.go diff --git a/deposit/deposit.go b/deposit/deposit.go index 9bdc29d9d..b84456a7a 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -47,7 +46,7 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketDepositPool, opts, "deposit") + txReceipt, err := rocketDepositPool.Transact(opts, "deposit") if err != nil { return nil, fmt.Errorf("Could not deposit: %w", err) } @@ -61,7 +60,7 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types. if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketDepositPool, opts, "assignDeposits") + txReceipt, err := rocketDepositPool.Transact(opts, "assignDeposits") if err != nil { return nil, fmt.Errorf("Could not assign deposits: %w", err) } diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 4d8929c04..9c4f6295c 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -13,7 +13,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -342,7 +341,7 @@ func (mp *Minipool) GetStakingEndBalance(opts *bind.CallOpts) (*big.Int, error) // Refund node ETH from the minipool func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "refund") + txReceipt, err := mp.Contract.Transact(opts, "refund") if err != nil { return nil, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) } @@ -352,7 +351,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { // Progress the prelaunch minipool to staking func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) + txReceipt, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { return nil, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) } @@ -362,7 +361,7 @@ func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSign // Withdraw node balances & rewards from the withdrawable minipool and close it func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "withdraw") + txReceipt, err := mp.Contract.Transact(opts, "withdraw") if err != nil { return nil, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) } @@ -372,7 +371,7 @@ func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "dissolve") + txReceipt, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return nil, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) } @@ -382,7 +381,7 @@ func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { // Withdraw node balances from the dissolved minipool and close it func (mp *Minipool) Close(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(mp.RocketPool.Client, mp.Contract, opts, "close") + txReceipt, err := mp.Contract.Transact(opts, "close") if err != nil { return nil, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) } diff --git a/minipool/minipool.go b/minipool/minipool.go index 156df4ed3..6f14096fe 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -12,7 +12,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -552,7 +551,7 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketMinipoolStatus, opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) + txReceipt, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) if err != nil { return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } diff --git a/network/balances.go b/network/balances.go index ab8c1402a..f3b0d3a85 100644 --- a/network/balances.go +++ b/network/balances.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -90,7 +89,7 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkBalances, opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + txReceipt, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) if err != nil { return nil, fmt.Errorf("Could not submit network balances: %w", err) } diff --git a/network/withdrawal.go b/network/withdrawal.go index 2432f734b..6f6822a11 100644 --- a/network/withdrawal.go +++ b/network/withdrawal.go @@ -11,8 +11,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/contract" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -50,7 +48,7 @@ func SetWithdrawalCredentials(rp *rocketpool.RocketPool, withdrawalCredentials c if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "setWithdrawalCredentials", withdrawalCredentials.Bytes()) + txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "setWithdrawalCredentials", withdrawalCredentials.Bytes()) if err != nil { return nil, fmt.Errorf("Could not set network withdrawal credentials: %w", err) } @@ -64,7 +62,7 @@ func TransferWithdrawal(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*ty if err != nil { return nil, err } - txReceipt, err := eth.SendTransaction(rp.Client, *(rocketNetworkWithdrawal.Address), opts) + txReceipt, err := rocketNetworkWithdrawal.Transfer(opts) if err != nil { return nil, fmt.Errorf("Could not transfer validator balance: %w", err) } @@ -78,7 +76,7 @@ func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.Valida if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNetworkWithdrawal, opts, "processWithdrawal", validatorPubkey[:]) + txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "processWithdrawal", validatorPubkey[:]) if err != nil { return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", validatorPubkey.Hex(), err) } diff --git a/node/deposit.go b/node/deposit.go index 7bdb1a6d1..3bb385e20 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -19,7 +18,7 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.Trans if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNodeDeposit, opts, "deposit", eth.EthToWei(minimumNodeFee)) + txReceipt, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee)) if err != nil { return nil, fmt.Errorf("Could not make node deposit: %w", err) } diff --git a/node/node.go b/node/node.go index 44bba4cb6..4aeb85768 100644 --- a/node/node.go +++ b/node/node.go @@ -11,7 +11,6 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -339,7 +338,7 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "registerNode", timezoneLocation) + txReceipt, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) if err != nil { return nil, fmt.Errorf("Could not register node: %w", err) } @@ -353,7 +352,7 @@ func SetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address, trust if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "setNodeTrusted", nodeAddress, trusted) + txReceipt, err := rocketNodeManager.Transact(opts, "setNodeTrusted", nodeAddress, trusted) if err != nil { return nil, fmt.Errorf("Could not set node trusted status: %w", err) } @@ -367,7 +366,7 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNodeManager, opts, "setTimezoneLocation", timezoneLocation) + txReceipt, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { return nil, fmt.Errorf("Could not set node timezone location: %w", err) } diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 4d9ba8095..55d812727 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -1,9 +1,17 @@ package rocketpool import ( + "bytes" + "context" + "errors" + "fmt" + "reflect" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) @@ -12,6 +20,7 @@ type Contract struct { Contract *bind.BoundContract Address *common.Address ABI *abi.ABI + Client *ethclient.Client } @@ -20,3 +29,101 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, return c.Contract.Call(opts, result, method, params...) } + +// Transact on a contract method and wait for a receipt +func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { + + // Send transaction + tx, err := c.Contract.Transact(opts, method, params...) + if err != nil { + return nil, err + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) + if err != nil { + return nil, err + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil + +} + + +// Transfer ETH to a contract +func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { + + // Send transaction + tx, err := c.Contract.Transfer(opts) + if err != nil { + return nil, err + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) + if err != nil { + return nil, err + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil + +} + + +// Get contract events from a transaction +// eventPrototype must be an event struct type +// Returns a slice of untyped values; assert returned events to event struct type +func (c *Contract) GetTransactionEvents(txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { + + // Get event type + eventType := reflect.TypeOf(eventPrototype) + if eventType.Kind() != reflect.Struct { + return nil, errors.New("Invalid event type") + } + + // Get ABI event + abiEvent, ok := c.ABI.Events[eventName] + if !ok { + return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) + } + + // Process transaction receipt logs + events := make([]interface{}, 0) + for _, log := range txReceipt.Logs { + + // Check log address matches contract address + if !bytes.Equal(log.Address.Bytes(), c.Address.Bytes()) { + continue + } + + // Check log first topic matches event ID + if len(log.Topics) == 0 || !bytes.Equal(log.Topics[0].Bytes(), abiEvent.ID.Bytes()) { + continue + } + + // Unpack event + event := reflect.New(eventType) + if err := c.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { + return nil, fmt.Errorf("Could not unpack event data: %w", err) + } + events = append(events, reflect.Indirect(event).Interface()) + + } + + // Return events + return events, nil + +} + diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index cbf5b6d9d..16054c121 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -227,6 +227,7 @@ func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), Address: address, ABI: abi, + Client: rp.Client, } // Cache contract @@ -280,6 +281,7 @@ func (rp *RocketPool) MakeContract(contractName string, address common.Address) Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), Address: &address, ABI: abi, + Client: rp.Client, }, nil } diff --git a/settings/deposit.go b/settings/deposit.go index 102bbf06c..be1a52866 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -30,7 +29,7 @@ func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, assignDepositsEnabled b if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketDepositSettings, opts, "setAssignDepositsEnabled", assignDepositsEnabled) + txReceipt, err := rocketDepositSettings.Transact(opts, "setAssignDepositsEnabled", assignDepositsEnabled) if err != nil { return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) } diff --git a/settings/minipool.go b/settings/minipool.go index d73b311ba..5593d711a 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -94,7 +93,7 @@ func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, withdrawalDelay uint6 if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketMinipoolSettings, opts, "setWithdrawalDelay", big.NewInt(int64(withdrawalDelay))) + txReceipt, err := rocketMinipoolSettings.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(withdrawalDelay))) if err != nil { return nil, fmt.Errorf("Could not set minipool withdrawal delay: %w", err) } diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 949a56225..d7007cd1e 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -216,7 +216,6 @@ func TestTransferWithdrawal(t *testing.T) { // Transfer validator balance opts := userAccount.GetTransactor() opts.Value = eth.EthToWei(50) - opts.GasLimit = 100000 if _, err := network.TransferWithdrawal(rp, opts); err != nil { t.Fatal(err) } diff --git a/tests/utils/minipool/minipool.go b/tests/utils/minipool/minipool.go index 695ec0280..85e2edc19 100644 --- a/tests/utils/minipool/minipool.go +++ b/tests/utils/minipool/minipool.go @@ -11,7 +11,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/validator" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -37,7 +36,7 @@ func CreateMinipool(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, de if err != nil { return nil, err } // Get created minipool address - minipoolCreatedEvents, err := contract.GetTransactionEvents(rp.Client, rocketMinipoolManager, txReceipt, "MinipoolCreated", minipoolCreated{}) + minipoolCreatedEvents, err := rocketMinipoolManager.GetTransactionEvents(txReceipt, "MinipoolCreated", minipoolCreated{}) if err != nil || len(minipoolCreatedEvents) == 0 { return nil, errors.New("Could not get minipool created event") } diff --git a/tokens/neth.go b/tokens/neth.go index 6d5e5381b..ba92a3a3c 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -50,7 +49,7 @@ func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketNodeETHToken, opts, "burn", amount) + txReceipt, err := rocketNodeETHToken.Transact(opts, "burn", amount) if err != nil { return nil, fmt.Errorf("Could not burn nETH: %w", err) } diff --git a/tokens/reth.go b/tokens/reth.go index b78d2afff..3913d5ea4 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -121,7 +120,7 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt if err != nil { return nil, err } - txReceipt, err := contract.Transact(rp.Client, rocketETHToken, opts, "burn", amount) + txReceipt, err := rocketETHToken.Transact(opts, "burn", amount) if err != nil { return nil, fmt.Errorf("Could not burn rETH: %w", err) } diff --git a/tokens/tokens.go b/tokens/tokens.go index 0954adf97..7adc43bef 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -12,7 +12,6 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/contract" ) @@ -91,7 +90,7 @@ func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address com // Transfer tokens to an address func transfer(client *ethclient.Client, tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := contract.Transact(client, tokenContract, opts, "transfer", to, amount) + txReceipt, err := tokenContract.Transact(opts, "transfer", to, amount) if err != nil { return nil, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) } diff --git a/utils/contract/events.go b/utils/contract/events.go deleted file mode 100644 index 9d1cca2ae..000000000 --- a/utils/contract/events.go +++ /dev/null @@ -1,60 +0,0 @@ -package contract - -import ( - "bytes" - "errors" - "fmt" - "reflect" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/rocketpool" -) - - -// Get contract events from a transaction -// eventPrototype must be an event struct type -// Returns a slice of untyped values; assert returned events to event struct type -func GetTransactionEvents(client *ethclient.Client, contract *rocketpool.Contract, txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { - - // Get event type - eventType := reflect.TypeOf(eventPrototype) - if eventType.Kind() != reflect.Struct { - return nil, errors.New("Invalid event type") - } - - // Get ABI event - abiEvent, ok := contract.ABI.Events[eventName] - if !ok { - return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) - } - - // Process transaction receipt logs - events := make([]interface{}, 0) - for _, log := range txReceipt.Logs { - - // Check log address matches contract address - if !bytes.Equal(log.Address.Bytes(), contract.Address.Bytes()) { - continue - } - - // Check log first topic matches event ID - if len(log.Topics) == 0 || !bytes.Equal(log.Topics[0].Bytes(), abiEvent.ID.Bytes()) { - continue - } - - // Unpack event - event := reflect.New(eventType) - if err := contract.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { - return nil, fmt.Errorf("Could not unpack event data: %w", err) - } - events = append(events, reflect.Indirect(event).Interface()) - - } - - // Return events - return events, nil - -} - diff --git a/utils/contract/transactions.go b/utils/contract/transactions.go deleted file mode 100644 index 443e68ba7..000000000 --- a/utils/contract/transactions.go +++ /dev/null @@ -1,39 +0,0 @@ -package contract - -import ( - "context" - "errors" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/rocketpool" -) - - -// Transact on a contract method and wait for a receipt -func Transact(client *ethclient.Client, contract *rocketpool.Contract, opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { - - // Send transaction - tx, err := contract.Contract.Transact(opts, method, params...) - if err != nil { - return nil, err - } - - // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), client, tx) - if err != nil { - return nil, err - } - - // Check transaction status - if txReceipt.Status == 0 { - return txReceipt, errors.New("Transaction failed with status 0") - } - - // Return - return txReceipt, nil - -} - From 88e2b5fe1feedc4938e33e4780896a329b1f14f0 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 11:39:00 +1000 Subject: [PATCH 124/878] implementing RP bound contract wrapper type --- rocketpool/contract.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 55d812727..dbb298bc8 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -39,24 +39,13 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in return nil, err } - // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) - if err != nil { - return nil, err - } - - // Check transaction status - if txReceipt.Status == 0 { - return txReceipt, errors.New("Transaction failed with status 0") - } - - // Return - return txReceipt, nil + // Get & return transaction receipt + return c.getTransactionReceipt(tx) } -// Transfer ETH to a contract +// Transfer ETH to a contract and wait for a receipt func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { // Send transaction @@ -65,6 +54,15 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { return nil, err } + // Get & return transaction receipt + return c.getTransactionReceipt(tx) + +} + + +// Wait for a transaction to be mined and get a tx receipt +func (c *Contract) getTransactionReceipt(tx *types.Transaction) (*types.Receipt, error) { + // Wait for transaction to be mined txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) if err != nil { From 6b32ad8cf4955f31816385501aa1c3f90d4de6f6 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 12:07:55 +1000 Subject: [PATCH 125/878] minor eth transaction helper fixes --- utils/eth/transactions.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 8c70ca1c5..189e43abb 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -18,32 +18,42 @@ const DefaultGasLimit = 21000 // Send a transaction to an address func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + var err error // Get from address nonce + var nonce uint64 if opts.Nonce == nil { - nonce, err := client.PendingNonceAt(context.Background(), opts.From) + nonce, err = client.PendingNonceAt(context.Background(), opts.From) if err != nil { return nil, err } - opts.Nonce = big.NewInt(int64(nonce)) + } else { + nonce = opts.Nonce.Uint64() + } + + // Set default value + value := opts.Value + if value == nil { + value = big.NewInt(0) } // Set default gas limit - if opts.GasLimit == 0 { - opts.GasLimit = DefaultGasLimit + gasLimit := opts.GasLimit + if gasLimit == 0 { + gasLimit = DefaultGasLimit } // Get suggested gas price - if opts.GasPrice == nil { - gasPrice, err := client.SuggestGasPrice(context.Background()) + gasPrice := opts.GasPrice + if gasPrice == nil { + gasPrice, err = client.SuggestGasPrice(context.Background()) if err != nil { return nil, err } - opts.GasPrice = gasPrice } // Initialize transaction - tx := types.NewTransaction(opts.Nonce.Uint64(), toAddress, opts.Value, opts.GasLimit, opts.GasPrice, []byte{}) + tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, []byte{}) // Sign transaction signedTx, err := opts.Signer(types.HomesteadSigner{}, opts.From, tx) From ca5495c70244d61612c3f99cd3ff0df76d083cc2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 12:18:16 +1000 Subject: [PATCH 126/878] minor eth transaction helper fixes --- utils/eth/transactions.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 189e43abb..6b21edb47 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -5,6 +5,7 @@ import ( "errors" "math/big" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -12,10 +13,6 @@ import ( ) -// Transaction settings -const DefaultGasLimit = 21000 - - // Send a transaction to an address func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { var err error @@ -37,12 +34,6 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b value = big.NewInt(0) } - // Set default gas limit - gasLimit := opts.GasLimit - if gasLimit == 0 { - gasLimit = DefaultGasLimit - } - // Get suggested gas price gasPrice := opts.GasPrice if gasPrice == nil { @@ -52,6 +43,20 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b } } + // Estimate gas limit + gasLimit := opts.GasLimit + if gasLimit == 0 { + gasLimit, err = client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: toAddress, + GasPrice: gasPrice, + Value: value, + }) + if err != nil { + return nil, err + } + } + // Initialize transaction tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, []byte{}) From e3ecb38ed568f55eda6740f330b000846f79d844 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 12:23:29 +1000 Subject: [PATCH 127/878] minor eth transaction helper fixes --- utils/eth/transactions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 6b21edb47..33dedde72 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -48,7 +48,7 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b if gasLimit == 0 { gasLimit, err = client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, - To: toAddress, + To: &toAddress, GasPrice: gasPrice, Value: value, }) From 0a2c5e47b7302d40d4382c788791779d5097e88d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 12:42:09 +1000 Subject: [PATCH 128/878] estimate & pad gas limits for contract transactions --- rocketpool/contract.go | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index dbb298bc8..81adc1d65 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -7,6 +7,7 @@ import ( "fmt" "reflect" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -15,6 +16,13 @@ import ( ) +// Transaction settings +const ( + GasLimitPadding = 100000 + MaxGasLimit = 12000000 +) + + // Contract type wraps go-ethereum bound contract type Contract struct { Contract *bind.BoundContract @@ -33,6 +41,19 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, // Transact on a contract method and wait for a receipt func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { + // Estimate gas limit + if opts.GasLimit == 0 { + input, err := c.ABI.Pack(method, params...) + if err != nil { + return nil, fmt.Errorf("Could not encode input data: %w", err) + } + gasLimit, err := c.estimateGasLimit(opts, input) + if err != nil { + return nil, err + } + opts.GasLimit = gasLimit + } + // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { @@ -48,6 +69,15 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Transfer ETH to a contract and wait for a receipt func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { + // Estimate gas limit + if opts.GasLimit == 0 { + gasLimit, err := c.estimateGasLimit(opts, []byte{}) + if err != nil { + return nil, err + } + opts.GasLimit = gasLimit + } + // Send transaction tx, err := c.Contract.Transfer(opts) if err != nil { @@ -60,6 +90,29 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { } +// Estimate the gas limit for a contract transaction +func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, error) { + + // Estimate gas limit + gasLimit, err := c.Client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: c.Address, + GasPrice: opts.GasPrice, + Value: opts.Value, + Data: input, + }) + if err != nil { + return 0, fmt.Errorf("Could not estimate gas needed: %w", err) + } + + // Pad and return gas limit + gasLimit += GasLimitPadding + if gasLimit > MaxGasLimit { gasLimit = MaxGasLimit } + return gasLimit, nil + +} + + // Wait for a transaction to be mined and get a tx receipt func (c *Contract) getTransactionReceipt(tx *types.Transaction) (*types.Receipt, error) { From 25a84502ff3a4730e9ce0e28836713b55f79ff03 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 14:06:14 +1000 Subject: [PATCH 129/878] refactoring unit test helpers --- tests/tokens/tokens_test.go | 11 +++++++---- tests/utils/node/node.go | 16 ++++++++++++++++ tests/utils/tokens/neth.go | 14 ++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 tests/utils/node/node.go diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index 805544b7b..774bbf7be 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -23,7 +24,7 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - nodeAccount *accounts.Account + trustedNodeAccount *accounts.Account userAccount *accounts.Account ) @@ -42,7 +43,7 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } userAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } @@ -61,7 +62,8 @@ func TestNETHBalances(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) - if err := tokenutils.MintNETH(rp, ownerAccount, nodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Get & check nETH total supply if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { @@ -88,7 +90,8 @@ func TestTransferNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) - if err := tokenutils.MintNETH(rp, ownerAccount, nodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Transfer nETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") diff --git a/tests/utils/node/node.go b/tests/utils/node/node.go new file mode 100644 index 000000000..80de82b41 --- /dev/null +++ b/tests/utils/node/node.go @@ -0,0 +1,16 @@ +package node + +import ( + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +// Register a trusted node +func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := node.SetNodeTrusted(rp, trustedNodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } + return nil +} + diff --git a/tests/utils/tokens/neth.go b/tests/utils/tokens/neth.go index ec2ea51d3..20c302c55 100644 --- a/tests/utils/tokens/neth.go +++ b/tests/utils/tokens/neth.go @@ -14,12 +14,14 @@ import ( // Mint an amount of nETH to an account -func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { +func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return err } - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { return err } - if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } + // Register node if not registered + if nodeExists, err := node.GetNodeExists(rp, toAccount.Address, nil); err != nil { + return err + } else if !nodeExists { + if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return err } + } // Create & stake minipool mp, err := minipoolutils.CreateMinipool(rp, toAccount, eth.EthToWei(32)) @@ -32,7 +34,7 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, nodeAcc if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } // Mark minipool as withdrawable and withdraw - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, nodeAccount.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return err } if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } // Re-enable minipool withdrawal delay From bd6474aed88256b9d769e55361d1cedb3a346ab0 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 14:14:33 +1000 Subject: [PATCH 130/878] refactoring unit test helpers --- tests/network/network_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/network/network_test.go b/tests/network/network_test.go index d7007cd1e..1feedb61d 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -18,6 +18,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -27,7 +28,7 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - nodeAccount *accounts.Account + trustedNodeAccount *accounts.Account userAccount *accounts.Account ) @@ -46,7 +47,7 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } userAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } @@ -64,15 +65,14 @@ func TestSubmitBalances(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Register trusted node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := node.SetNodeTrusted(rp, nodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Submit balances var balancesBlock uint64 = 100 totalEth := eth.EthToWei(100) stakingEth := eth.EthToWei(80) rethSupply := eth.EthToWei(70) - if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, nodeAccount.GetTransactor()); err != nil { + if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } From 77ab9d17392eff79e2e82b9f442ac6b6e2cf2d2f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 14:50:01 +1000 Subject: [PATCH 131/878] updating tokens module --- tokens/neth.go | 10 ++++++++++ tokens/reth.go | 10 ++++++++++ tokens/tokens.go | 8 ++++++++ 3 files changed, 28 insertions(+) diff --git a/tokens/neth.go b/tokens/neth.go index ba92a3a3c..9a50bef54 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -13,6 +13,16 @@ import ( ) +// Get the nETH contract ETH balance +func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeETHToken, err := getRocketNodeETHToken(rp) + if err != nil { + return nil, err + } + return contractETHBalance(rp, rocketNodeETHToken, opts) +} + + // Get nETH total supply func GetNETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNodeETHToken, err := getRocketNodeETHToken(rp) diff --git a/tokens/reth.go b/tokens/reth.go index 3913d5ea4..a05bdec44 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -14,6 +14,16 @@ import ( ) +// Get the rETH contract ETH balance +func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketETHToken, err := getRocketETHToken(rp) + if err != nil { + return nil, err + } + return contractETHBalance(rp, rocketETHToken, opts) +} + + // Get rETH total supply func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketETHToken, err := getRocketETHToken(rp) diff --git a/tokens/tokens.go b/tokens/tokens.go index 7adc43bef..2e14e0354 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -68,6 +68,14 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } +// Get a token contract's ETH balance +func contractETHBalance(rp *rocketpool.RocketPool, tokenContract *rocketpool.Contract, opts *bind.CallOpts) (*big.Int, error) { + var blockNumber *big.Int + if opts != nil { blockNumber = opts.BlockNumber } + return rp.Client.BalanceAt(context.Background(), *(tokenContract.Address), blockNumber) +} + + // Get a token's total supply func totalSupply(tokenContract *rocketpool.Contract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { totalSupply := new(*big.Int) From 4e2d854ac6420d6833b3c1719bb55514fe15594c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 14:50:18 +1000 Subject: [PATCH 132/878] implementing network module unit tests --- tests/network/network_test.go | 62 ++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 1feedb61d..977d11e8c 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -18,7 +19,10 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -29,6 +33,7 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account userAccount *accounts.Account ) @@ -49,6 +54,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } userAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } @@ -231,6 +238,59 @@ func TestTransferWithdrawal(t *testing.T) { func TestProcessWithdrawal(t *testing.T) { - // TODO: implement + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Make user deposit + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Mark minipool as withdrawable + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Transfer validator balance + transferWithdrawalOpts := userAccount.GetTransactor() + transferWithdrawalOpts.Value = eth.EthToWei(32) + if _, err := network.TransferWithdrawal(rp, transferWithdrawalOpts); err != nil { t.Fatal(err) } + + // Get initial token contract ETH balances + nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) + if err != nil { t.Fatal(err) } + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { t.Fatal(err) } + + // Process withdrawal + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { t.Fatal(err) } + if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated token contract ETH balances + if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { + t.Error(err) + } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { + t.Error("nETH contract ETH balance did not increase after processing withdrawal") + } + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Error(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + } From 7c671b56bbc062c723e0640edbec1b94c9314b82 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 15:18:21 +1000 Subject: [PATCH 133/878] implementing tokens module unit tests --- tests/network/network_test.go | 12 ++++++--- tests/tokens/tokens_test.go | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/tests/network/network_test.go b/tests/network/network_test.go index 977d11e8c..c20e30f35 100644 --- a/tests/network/network_test.go +++ b/tests/network/network_test.go @@ -269,9 +269,13 @@ func TestProcessWithdrawal(t *testing.T) { // Get initial token contract ETH balances nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) - if err != nil { t.Fatal(err) } + if err != nil { + t.Fatal(err) + } rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) - if err != nil { t.Fatal(err) } + if err != nil { + t.Fatal(err) + } // Process withdrawal validatorPubkey, err := validator.GetValidatorPubkey() @@ -282,12 +286,12 @@ func TestProcessWithdrawal(t *testing.T) { // Get & check updated token contract ETH balances if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { - t.Error(err) + t.Fatal(err) } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { t.Error("nETH contract ETH balance did not increase after processing withdrawal") } if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { - t.Error(err) + t.Fatal(err) } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { t.Error("rETH contract ETH balance did not increase after processing withdrawal") } diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index 774bbf7be..43362c978 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -8,12 +8,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -110,6 +112,55 @@ func TestTransferNETH(t *testing.T) { } +func TestBurnNETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint nETH + nethAmount := eth.EthToWei(100) + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + + // Transfer validator balance + opts := userAccount.GetTransactor() + opts.Value = nethAmount + if _, err := network.TransferWithdrawal(rp, opts); err != nil { t.Fatal(err) } + + // Process validator withdrawal + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { t.Fatal(err) } + if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get initial balances + balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Burn nETH + burnAmount := eth.EthToWei(50) + if _, err := tokens.BurnNETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated balances + balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else { + if balances2.NETH.Cmp(balances1.NETH) != -1 { + t.Error("nETH balance did not decrease after burning nETH") + } + if balances2.ETH.Cmp(balances1.ETH) != 1 { + t.Error("ETH balance did not increase after burning nETH") + } + } + +} + + func TestRETHBalances(t *testing.T) { // State snapshotting From 23ef1af5d5828ae58e9f94f75667e2a4edb62e5f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 15:42:02 +1000 Subject: [PATCH 134/878] updating settings module --- settings/deposit.go | 102 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 8 deletions(-) diff --git a/settings/deposit.go b/settings/deposit.go index be1a52866..43f2f4718 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -12,24 +12,49 @@ import ( ) +// Deposits currently enabled +func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDepositSettings.Call(opts, value, "getDepositEnabled"); err != nil { + return false, fmt.Errorf("Could not get deposits enabled status: %w", err) + } + return *value, nil +} +func SetDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDepositSettings.Transact(opts, "setDepositEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set deposits enabled status: %w", err) + } + return txReceipt, nil +} + + // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return false, err } - assignDepositsEnabled := new(bool) - if err := rocketDepositSettings.Call(opts, assignDepositsEnabled, "getAssignDepositsEnabled"); err != nil { + value := new(bool) + if err := rocketDepositSettings.Call(opts, value, "getAssignDepositsEnabled"); err != nil { return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) } - return *assignDepositsEnabled, nil + return *value, nil } -func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, assignDepositsEnabled bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setAssignDepositsEnabled", assignDepositsEnabled) + txReceipt, err := rocketDepositSettings.Transact(opts, "setAssignDepositsEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) } @@ -37,17 +62,78 @@ func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, assignDepositsEnabled b } +// Minimum deposit amount +func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDepositSettings.Call(opts, value, "getMinimumDeposit"); err != nil { + return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) + } + return *value, nil +} +func SetMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDepositSettings.Transact(opts, "setMinimumDeposit", value) + if err != nil { + return nil, fmt.Errorf("Could not set minimum deposit amount: %w", err) + } + return txReceipt, nil +} + + +// Maximum deposit pool size +func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDepositSettings.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { + return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) + } + return *value, nil +} +func SetMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositPoolSize", value) + if err != nil { + return nil, fmt.Errorf("Could not set maximum deposit pool size: %w", err) + } + return txReceipt, nil +} + + // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDepositSettings, err := getRocketDepositSettings(rp) if err != nil { return 0, err } - maximumDepositAssignments := new(*big.Int) - if err := rocketDepositSettings.Call(opts, maximumDepositAssignments, "getMaximumDepositAssignments"); err != nil { + value := new(*big.Int) + if err := rocketDepositSettings.Call(opts, value, "getMaximumDepositAssignments"); err != nil { return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) } - return (*maximumDepositAssignments).Uint64(), nil + return (*value).Uint64(), nil +} +func SetMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDepositSettings, err := getRocketDepositSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositAssignments", big.NewInt(value)) + if err != nil { + return nil, fmt.Errorf("Could not set maximum deposit assignments: %w", err) + } + return txReceipt, nil } From ff7482a48e5796bb4f5e227f59316729d65c08c7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 29 Jan 2021 15:47:04 +1000 Subject: [PATCH 135/878] updating settings module --- settings/node.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/settings/node.go b/settings/node.go index e84dcbd7d..7f19ee242 100644 --- a/settings/node.go +++ b/settings/node.go @@ -5,6 +5,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -16,11 +17,22 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err != nil { return false, err } - registrationEnabled := new(bool) - if err := rocketNodeSettings.Call(opts, registrationEnabled, "getRegistrationEnabled"); err != nil { + value := new(bool) + if err := rocketNodeSettings.Call(opts, value, "getRegistrationEnabled"); err != nil { return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) } - return *registrationEnabled, nil + return *value, nil +} +func SetNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeSettings, err := getRocketNodeSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeSettings.Transact(opts, "setRegistrationEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set node registrations enabled status: %w", err) + } + return txReceipt, nil } @@ -30,11 +42,22 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool if err != nil { return false, err } - depositEnabled := new(bool) - if err := rocketNodeSettings.Call(opts, depositEnabled, "getDepositEnabled"); err != nil { + value := new(bool) + if err := rocketNodeSettings.Call(opts, value, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) } - return *depositEnabled, nil + return *value, nil +} +func SetNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeSettings, err := getRocketNodeSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeSettings.Transact(opts, "setDepositEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set node deposits enabled status: %w", err) + } + return txReceipt, nil } From 7ec08b5798e73a582ecd4e9130262f031f3c32f1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:02:06 +1000 Subject: [PATCH 136/878] todo update --- tests/tokens/tokens_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index 43362c978..53e604c64 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -252,3 +252,7 @@ func TestBurnRETH(t *testing.T) { } + +// TODO: +// implement additional rETH unit tests + From d5c06abe46dbe5c272eb11144b7b5a5a59129824 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:10:41 +1000 Subject: [PATCH 137/878] updating settings module --- settings/minipool.go | 112 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 92 insertions(+), 20 deletions(-) diff --git a/settings/minipool.go b/settings/minipool.go index 5593d711a..809c44547 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -12,39 +12,89 @@ import ( ) +// Get the minipool launch balance +func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getLaunchBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) + } + return *value, nil +} + + // Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } - fullDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, fullDepositNodeAmount, "getFullDepositNodeAmount"); err != nil { + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getFullDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) } - return *fullDepositNodeAmount, nil + return *value, nil } func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } - halfDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, halfDepositNodeAmount, "getHalfDepositNodeAmount"); err != nil { + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) } - return *halfDepositNodeAmount, nil + return *value, nil } func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } - emptyDepositNodeAmount := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, emptyDepositNodeAmount, "getEmptyDepositNodeAmount"); err != nil { + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) } - return *emptyDepositNodeAmount, nil + return *value, nil +} + + +// Required user deposit amounts +func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getFullDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) + } + return *value, nil +} +func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getHalfDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) + } + return *value, nil +} +func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) + } + return *value, nil } @@ -54,11 +104,22 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. if err != nil { return false, err } - submitWithdrawableEnabled := new(bool) - if err := rocketMinipoolSettings.Call(opts, submitWithdrawableEnabled, "getSubmitWithdrawableEnabled"); err != nil { + value := new(bool) + if err := rocketMinipoolSettings.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) } - return *submitWithdrawableEnabled, nil + return *value, nil +} +func SetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketMinipoolSettings.Transact(opts, "setSubmitWithdrawableEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set minipool withdrawable submissions enabled status: %w", err) + } + return txReceipt, nil } @@ -68,11 +129,22 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u if err != nil { return 0, err } - launchTimeout := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, launchTimeout, "getLaunchTimeout"); err != nil { + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } - return (*launchTimeout).Uint64(), nil + return (*value).Uint64(), nil +} +func SetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketMinipoolSettings.Transact(opts, "setLaunchTimeout", big.NewInt(int64(value))) + if err != nil { + return nil, fmt.Errorf("Could not set minipool launch timeout: %w", err) + } + return txReceipt, nil } @@ -82,18 +154,18 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err != nil { return 0, err } - withdrawalDelay := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, withdrawalDelay, "getWithdrawalDelay"); err != nil { + value := new(*big.Int) + if err := rocketMinipoolSettings.Call(opts, value, "getWithdrawalDelay"); err != nil { return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) } - return (*withdrawalDelay).Uint64(), nil + return (*value).Uint64(), nil } -func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, withdrawalDelay uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) if err != nil { return nil, err } - txReceipt, err := rocketMinipoolSettings.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(withdrawalDelay))) + txReceipt, err := rocketMinipoolSettings.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set minipool withdrawal delay: %w", err) } From 718059f1c7c9efd3eb7a8d19d876cec4fe121361 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:19:27 +1000 Subject: [PATCH 138/878] updating settings module --- settings/network.go | 70 +++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/settings/network.go b/settings/network.go index 357b8b4ed..79f257ca3 100644 --- a/settings/network.go +++ b/settings/network.go @@ -12,17 +12,31 @@ import ( ) +// The threshold of trusted nodes that must reach consensus on oracle data to commit it +func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getNodeConsensusThreshold"); err != nil { + return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) + } + return eth.WeiToEth(*value), nil +} + + // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return false, err } - submitBalancesEnabled := new(bool) - if err := rocketNetworkSettings.Call(opts, submitBalancesEnabled, "getSubmitBalancesEnabled"); err != nil { + value := new(bool) + if err := rocketNetworkSettings.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) } - return *submitBalancesEnabled, nil + return *value, nil } @@ -32,11 +46,11 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err != nil { return 0, err } - submitBalancesFrequency := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, submitBalancesFrequency, "getSubmitBalancesFrequency"); err != nil { + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) } - return (*submitBalancesFrequency).Uint64(), nil + return (*value).Uint64(), nil } @@ -46,11 +60,11 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts if err != nil { return false, err } - processWithdrawalsEnabled := new(bool) - if err := rocketNetworkSettings.Call(opts, processWithdrawalsEnabled, "getProcessWithdrawalsEnabled"); err != nil { + value := new(bool) + if err := rocketNetworkSettings.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) } - return *processWithdrawalsEnabled, nil + return *value, nil } @@ -60,44 +74,58 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, if err != nil { return 0, err } - minimumNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, minimumNodeFee, "getMinimumNodeFee"); err != nil { + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getMinimumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minimum node fee: %w", err) } - return eth.WeiToEth(*minimumNodeFee), nil + return eth.WeiToEth(*value), nil } func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } - targetNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, targetNodeFee, "getTargetNodeFee"); err != nil { + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getTargetNodeFee"); err != nil { return 0, fmt.Errorf("Could not get target node fee: %w", err) } - return eth.WeiToEth(*targetNodeFee), nil + return eth.WeiToEth(*value), nil } func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return 0, err } - maximumNodeFee := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, maximumNodeFee, "getMaximumNodeFee"); err != nil { + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getMaximumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get maximum node fee: %w", err) } - return eth.WeiToEth(*maximumNodeFee), nil + return eth.WeiToEth(*value), nil } func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { return nil, err } - nodeFeeDemandRange := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, nodeFeeDemandRange, "getNodeFeeDemandRange"); err != nil { + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getNodeFeeDemandRange"); err != nil { return nil, fmt.Errorf("Could not get node fee demand range: %w", err) } - return *nodeFeeDemandRange, nil + return *value, nil +} + + +// The target collateralization rate for the rETH contract as a fraction +func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketNetworkSettings.Call(opts, value, "getTargetRethCollateralRate"); err != nil { + return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) + } + return eth.WeiToEth(*value), nil } From 065a42e63f80dd6202d5193637a8c3c89ebfdfa8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:33:06 +1000 Subject: [PATCH 139/878] updating settings module --- settings/network.go | 111 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/settings/network.go b/settings/network.go index 79f257ca3..846214bf3 100644 --- a/settings/network.go +++ b/settings/network.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -24,6 +25,17 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } +func SetNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setNodeConsensusThreshold", eth.EthToWei(value)) + if err != nil { + return nil, fmt.Errorf("Could not set trusted node consensus threshold: %w", err) + } + return txReceipt, nil +} // Network balance submissions currently enabled @@ -38,6 +50,17 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } +func SetSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set network balance submissions enabled status: %w", err) + } + return txReceipt, nil +} // The frequency in blocks at which network balances should be submitted by trusted nodes @@ -52,6 +75,17 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } +func SetSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(value)) + if err != nil { + return nil, fmt.Errorf("Could not set network balance submission frequency: %w", err) + } + return txReceipt, nil +} // Processing validator withdrawals currently enabled @@ -66,9 +100,20 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts } return *value, nil } +func SetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setProcessWithdrawalsEnabled", value) + if err != nil { + return nil, fmt.Errorf("Could not set processing withdrawals enabled status: %w", err) + } + return txReceipt, nil +} -// Node commission rate parameters +// Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { @@ -80,6 +125,20 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func SetMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setMinimumNodeFee", eth.EthToWei(value)) + if err != nil { + return nil, fmt.Errorf("Could not set minimum node fee: %w", err) + } + return txReceipt, nil +} + + +// Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { @@ -91,6 +150,20 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func SetTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setTargetNodeFee", eth.EthToWei(value)) + if err != nil { + return nil, fmt.Errorf("Could not set target node fee: %w", err) + } + return txReceipt, nil +} + + +// Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { @@ -102,6 +175,20 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func SetMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setMaximumNodeFee", eth.EthToWei(value)) + if err != nil { + return nil, fmt.Errorf("Could not set maximum node fee: %w", err) + } + return txReceipt, nil +} + + +// The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkSettings, err := getRocketNetworkSettings(rp) if err != nil { @@ -113,6 +200,17 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } +func SetNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setNodeFeeDemandRange", value) + if err != nil { + return nil, fmt.Errorf("Could not set node fee demand range: %w", err) + } + return txReceipt, nil +} // The target collateralization rate for the rETH contract as a fraction @@ -127,6 +225,17 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } +func SetTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkSettings, err := getRocketNetworkSettings(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkSettings.Transact(opts, "setTargetRethCollateralRate", eth.EthToWei(value)) + if err != nil { + return nil, fmt.Errorf("Could not set target rETH contract collateralization rate: %w", err) + } + return txReceipt, nil +} // Get contracts From 36036258308b63d12d45a806f07443edc94be9b3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:50:55 +1000 Subject: [PATCH 140/878] minor settings module bugfixes --- settings/deposit.go | 2 +- settings/network.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/deposit.go b/settings/deposit.go index 43f2f4718..1666a480f 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -129,7 +129,7 @@ func SetMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositAssignments", big.NewInt(value)) + txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositAssignments", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set maximum deposit assignments: %w", err) } diff --git a/settings/network.go b/settings/network.go index 846214bf3..819821a71 100644 --- a/settings/network.go +++ b/settings/network.go @@ -80,7 +80,7 @@ func SetSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *b if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(value)) + txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set network balance submission frequency: %w", err) } From 4e6e6c5e40fac1ebc5417be54702cff530a4eac9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 15:53:32 +1000 Subject: [PATCH 141/878] implementing settings module unit tests --- tests/settings/settings_test.go | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/settings/settings_test.go diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go new file mode 100644 index 000000000..7ab914296 --- /dev/null +++ b/tests/settings/settings_test.go @@ -0,0 +1,65 @@ +package rocketpool + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + + +func TestDepositSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get deposits enabled + depositEnabled := false + if _, err := settings.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != depositEnabled { + t.Error("Incorrect deposit enabled value") + } + +} + From db6bde9acf4b902002cbb963e2f22c18c5914ae9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 16:03:15 +1000 Subject: [PATCH 142/878] implementing settings module unit tests --- tests/settings/settings_test.go | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go index 7ab914296..caf10df3d 100644 --- a/tests/settings/settings_test.go +++ b/tests/settings/settings_test.go @@ -13,6 +13,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -61,5 +62,45 @@ func TestDepositSettings(t *testing.T) { t.Error("Incorrect deposit enabled value") } + // Set & get deposit assignments enabled + assignDepositsEnabled := false + if _, err := settings.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetAssignDepositsEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != assignDepositsEnabled { + t.Error("Incorrect assign deposits enabled value") + } + + // Set & get minimum deposit amount + minimumDeposit := eth.EthToWei(1000) + if _, err := settings.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinimumDeposit(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(minimumDeposit) != 0 { + t.Error("Incorrect minimum deposit value") + } + + // Set & get maximum deposit pool size + maximumDepositPoolSize := eth.EthToWei(1) + if _, err := settings.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumDepositPoolSize(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(maximumDepositPoolSize) != 0 { + t.Error("Incorrect maximum deposit pool size value") + } + + // Set & get maximum deposit assignments per tx + var maximumDepositAssignments uint64 = 50 + if _, err := settings.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumDepositAssignments(rp, nil); err != nil { + t.Error(err) + } else if value != maximumDepositAssignments { + t.Error("Incorrect maximum deposit assignments value") + } + } From b442cf1135cc87b3b4b1f8c66ca287e3ece80fe1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 16:08:39 +1000 Subject: [PATCH 143/878] implementing settings module unit tests --- tests/settings/settings_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go index caf10df3d..a5c307391 100644 --- a/tests/settings/settings_test.go +++ b/tests/settings/settings_test.go @@ -104,3 +104,32 @@ func TestDepositSettings(t *testing.T) { } + +func TestNodeSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get node registrations enabled + nodeRegistrationsEnabled := false + if _, err := settings.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeRegistrationEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeRegistrationsEnabled { + t.Error("Incorrect node registrations enabled enabled value") + } + + // Set & get node deposits enabled + nodeDepositsEnabled := false + if _, err := settings.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeDepositsEnabled { + t.Error("Incorrect node deposits enabled enabled value") + } + +} + From a23b187388a1f947c718b361254c78ebef071303 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 16:17:16 +1000 Subject: [PATCH 144/878] implementing settings module unit tests --- tests/settings/settings_test.go | 43 +++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go index a5c307391..fe72caa0f 100644 --- a/tests/settings/settings_test.go +++ b/tests/settings/settings_test.go @@ -105,6 +105,45 @@ func TestDepositSettings(t *testing.T) { } +func TestMinipoolSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get submit withdrawable enabled + submitWithdrawableEnabled := false + if _, err := settings.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitWithdrawableEnabled { + t.Error("Incorrect minipool withdrawable submissions enabled value") + } + + // Set & get minipool launch timeout + var minipoolLaunchTimeout uint64 = 5 + if _, err := settings.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolLaunchTimeout(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolLaunchTimeout { + t.Error("Incorrect minipool launch timeout value") + } + + // Set & get minipool launch timeout + var minipoolWithdrawalDelay uint64 = 5 + if _, err := settings.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolWithdrawalDelay(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolWithdrawalDelay { + t.Error("Incorrect minipool withdrawal delay value") + } + +} + + func TestNodeSettings(t *testing.T) { // State snapshotting @@ -118,7 +157,7 @@ func TestNodeSettings(t *testing.T) { } else if value, err := settings.GetNodeRegistrationEnabled(rp, nil); err != nil { t.Error(err) } else if value != nodeRegistrationsEnabled { - t.Error("Incorrect node registrations enabled enabled value") + t.Error("Incorrect node registrations enabled value") } // Set & get node deposits enabled @@ -128,7 +167,7 @@ func TestNodeSettings(t *testing.T) { } else if value, err := settings.GetNodeDepositEnabled(rp, nil); err != nil { t.Error(err) } else if value != nodeDepositsEnabled { - t.Error("Incorrect node deposits enabled enabled value") + t.Error("Incorrect node deposits enabled value") } } From ed0280a026a0f33458c8af3842058b57d6220d9d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 16:24:54 +1000 Subject: [PATCH 145/878] implementing settings module unit tests --- tests/settings/settings_test.go | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go index fe72caa0f..4222d9d05 100644 --- a/tests/settings/settings_test.go +++ b/tests/settings/settings_test.go @@ -111,6 +111,46 @@ func TestMinipoolSettings(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Get & check launch balance and deposit amounts + fullMinipoolBalance := eth.EthToWei(32) + halfMinipoolBalance := eth.EthToWei(16) + emptyMinipoolBalance := eth.EthToWei(0) + if value, err := settings.GetMinipoolLaunchBalance(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool launch balance") + } + if value, err := settings.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit node amount") + } + if value, err := settings.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit node amount") + } + if value, err := settings.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(emptyMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit node amount") + } + if value, err := settings.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit user amount") + } + if value, err := settings.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit user amount") + } + if value, err := settings.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit user amount") + } + // Set & get submit withdrawable enabled submitWithdrawableEnabled := false if _, err := settings.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { From eaa07ca0041882e4d5a7d16d97dfebac2e1aad56 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 16:43:13 +1000 Subject: [PATCH 146/878] implementing settings module unit tests --- tests/settings/settings_test.go | 103 +++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go index 4222d9d05..3501515f0 100644 --- a/tests/settings/settings_test.go +++ b/tests/settings/settings_test.go @@ -92,7 +92,7 @@ func TestDepositSettings(t *testing.T) { t.Error("Incorrect maximum deposit pool size value") } - // Set & get maximum deposit assignments per tx + // Set & get maximum deposit assignments var maximumDepositAssignments uint64 = 50 if _, err := settings.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { t.Error(err) @@ -171,7 +171,7 @@ func TestMinipoolSettings(t *testing.T) { t.Error("Incorrect minipool launch timeout value") } - // Set & get minipool launch timeout + // Set & get minipool withdrawal delay var minipoolWithdrawalDelay uint64 = 5 if _, err := settings.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Error(err) @@ -184,6 +184,105 @@ func TestMinipoolSettings(t *testing.T) { } +func TestNetworkSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get node consensus threshold + nodeConsensusThreshold := 0.1 + if _, err := settings.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeConsensusThreshold(rp, nil); err != nil { + t.Error(err) + } else if value != nodeConsensusThreshold { + t.Error("Incorrect node consensus threshold value") + } + + // Set & get network balance submissions enabled + submitBalancesEnabled := false + if _, err := settings.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetSubmitBalancesEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesEnabled { + t.Error("Incorrect network balance submissions enabled value") + } + + // Set & get network balance submission frequency + var submitBalancesFrequency uint64 = 10 + if _, err := settings.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetSubmitBalancesFrequency(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesFrequency { + t.Error("Incorrect network balance submission frequency value") + } + + // Set & get process withdrawals enabled + processWithdrawalsEnabled := false + if _, err := settings.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetProcessWithdrawalsEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != processWithdrawalsEnabled { + t.Error("Incorrect process withdrawals enabled value") + } + + // Set & get minimum node fee + minimumNodeFee := 0.80 + if _, err := settings.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinimumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != minimumNodeFee { + t.Error("Incorrect minimum node fee value") + } + + // Set & get target node fee + targetNodeFee := 0.85 + if _, err := settings.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetTargetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != targetNodeFee { + t.Error("Incorrect target node fee value") + } + + // Set & get maximum node fee + maximumNodeFee := 0.90 + if _, err := settings.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != maximumNodeFee { + t.Error("Incorrect maximum node fee value") + } + + // Set & get node fee demand range + nodeFeeDemandRange := eth.EthToWei(10) + if _, err := settings.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeFeeDemandRange(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(nodeFeeDemandRange) != 0 { + t.Error("Incorrect node fee demand range value") + } + + // Set & get target rETH collateral rate + targetRethCollateralRate := 0.95 + if _, err := settings.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetTargetRethCollateralRate(rp, nil); err != nil { + t.Error(err) + } else if value != targetRethCollateralRate { + t.Error("Incorrect target rETH collateral rate value") + } + +} + + func TestNodeSettings(t *testing.T) { // State snapshotting From 836756dbbb138b40762353ff0764a8c20706bf58 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 1 Feb 2021 17:07:07 +1000 Subject: [PATCH 147/878] refactoring unit tests --- tests/network/balances_test.go | 67 ++++ tests/network/fees_test.go | 83 +++++ tests/network/main_test.go | 53 +++ tests/network/network_test.go | 300 ----------------- tests/network/withdrawal_test.go | 127 +++++++ tests/node/deposit_test.go | 46 +++ tests/node/main_test.go | 44 +++ tests/node/node_test.go | 74 ----- tests/settings/deposit_test.go | 69 ++++ tests/settings/main_test.go | 44 +++ tests/settings/minipool_test.go | 89 +++++ tests/settings/network_test.go | 109 ++++++ tests/settings/node_test.go | 38 +++ tests/settings/settings_test.go | 313 ------------------ tests/tokens/main_test.go | 50 +++ tests/tokens/{tokens_test.go => neth_test.go} | 137 -------- tests/tokens/reth_test.go | 109 ++++++ 17 files changed, 928 insertions(+), 824 deletions(-) create mode 100644 tests/network/balances_test.go create mode 100644 tests/network/fees_test.go create mode 100644 tests/network/main_test.go delete mode 100644 tests/network/network_test.go create mode 100644 tests/network/withdrawal_test.go create mode 100644 tests/node/deposit_test.go create mode 100644 tests/node/main_test.go create mode 100644 tests/settings/deposit_test.go create mode 100644 tests/settings/main_test.go create mode 100644 tests/settings/minipool_test.go create mode 100644 tests/settings/network_test.go create mode 100644 tests/settings/node_test.go delete mode 100644 tests/settings/settings_test.go create mode 100644 tests/tokens/main_test.go rename tests/tokens/{tokens_test.go => neth_test.go} (51%) create mode 100644 tests/tokens/reth_test.go diff --git a/tests/network/balances_test.go b/tests/network/balances_test.go new file mode 100644 index 000000000..30c0bc442 --- /dev/null +++ b/tests/network/balances_test.go @@ -0,0 +1,67 @@ +package network + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestSubmitBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Submit balances + var balancesBlock uint64 = 100 + totalEth := eth.EthToWei(100) + stakingEth := eth.EthToWei(80) + rethSupply := eth.EthToWei(70) + if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check network balances block + if networkBalancesBlock, err := network.GetBalancesBlock(rp, nil); err != nil { + t.Error(err) + } else if networkBalancesBlock != balancesBlock { + t.Errorf("Incorrect network balances block %d", networkBalancesBlock) + } + + // Get & check network total ETH + if networkTotalEth, err := network.GetTotalETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkTotalEth.Cmp(totalEth) != 0 { + t.Errorf("Incorrect network total ETH balance %s", networkTotalEth.String()) + } + + // Get & check network staking ETH + if networkStakingEth, err := network.GetStakingETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkStakingEth.Cmp(stakingEth) != 0 { + t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) + } + + // Get & check network rETH supply + if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { + t.Error(err) + } else if networkRethSupply.Cmp(rethSupply) != 0 { + t.Errorf("Incorrect network total rETH supply %s", networkRethSupply.String()) + } + + // Get & check ETH utilization rate + if ethUtilizationRate, err := network.GetETHUtilizationRate(rp, nil); err != nil { + t.Error(err) + } else if ethUtilizationRate != eth.WeiToEth(stakingEth) / eth.WeiToEth(totalEth) { + t.Errorf("Incorrect network ETH utilization rate %f", ethUtilizationRate) + } + +} + diff --git a/tests/network/fees_test.go b/tests/network/fees_test.go new file mode 100644 index 000000000..66698eb4f --- /dev/null +++ b/tests/network/fees_test.go @@ -0,0 +1,83 @@ +package network + +import ( + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" +) + + +func TestNodeFee(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Get settings + targetNodeFee, err := settings.GetTargetNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + minNodeFee, err := settings.GetMinimumNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + maxNodeFee, err := settings.GetMaximumNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + demandRange, err := settings.GetNodeFeeDemandRange(rp, nil) + if err != nil { t.Fatal(err) } + + // Get & check initial node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node demand value %s", nodeDemand.String()) + } + + // Get & check initial node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect initial node fee %f", nodeFee) + } + + // Make user deposit + opts := userAccount.GetTransactor() + opts.Value = demandRange + if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } + + // Get & check updated node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(opts.Value) != 0 { + t.Errorf("Incorrect updated node demand value %s", nodeDemand.String()) + } + + // Get & check updated node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect updated node fee %f", nodeFee) + } + + // Get & check node fees by demand values + negDemandRange := new(big.Int) + negDemandRange.Neg(demandRange) + if nodeFee, err := network.GetNodeFeeByDemand(rp, big.NewInt(0), nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect node fee for zero demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, negDemandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != minNodeFee { + t.Errorf("Incorrect node fee for negative demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, demandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect node fee for positive demand %f", nodeFee) + } + +} + diff --git a/tests/network/main_test.go b/tests/network/main_test.go new file mode 100644 index 000000000..d52f553b4 --- /dev/null +++ b/tests/network/main_test.go @@ -0,0 +1,53 @@ +package network + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/network/network_test.go b/tests/network/network_test.go deleted file mode 100644 index c20e30f35..000000000 --- a/tests/network/network_test.go +++ /dev/null @@ -1,300 +0,0 @@ -package network - -import ( - "bytes" - "log" - "math/big" - "os" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" -) - - -var ( - client *ethclient.Client - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - nodeAccount *accounts.Account - userAccount *accounts.Account -) - - -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - -func TestSubmitBalances(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Submit balances - var balancesBlock uint64 = 100 - totalEth := eth.EthToWei(100) - stakingEth := eth.EthToWei(80) - rethSupply := eth.EthToWei(70) - if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check network balances block - if networkBalancesBlock, err := network.GetBalancesBlock(rp, nil); err != nil { - t.Error(err) - } else if networkBalancesBlock != balancesBlock { - t.Errorf("Incorrect network balances block %d", networkBalancesBlock) - } - - // Get & check network total ETH - if networkTotalEth, err := network.GetTotalETHBalance(rp, nil); err != nil { - t.Error(err) - } else if networkTotalEth.Cmp(totalEth) != 0 { - t.Errorf("Incorrect network total ETH balance %s", networkTotalEth.String()) - } - - // Get & check network staking ETH - if networkStakingEth, err := network.GetStakingETHBalance(rp, nil); err != nil { - t.Error(err) - } else if networkStakingEth.Cmp(stakingEth) != 0 { - t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) - } - - // Get & check network rETH supply - if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { - t.Error(err) - } else if networkRethSupply.Cmp(rethSupply) != 0 { - t.Errorf("Incorrect network total rETH supply %s", networkRethSupply.String()) - } - - // Get & check ETH utilization rate - if ethUtilizationRate, err := network.GetETHUtilizationRate(rp, nil); err != nil { - t.Error(err) - } else if ethUtilizationRate != eth.WeiToEth(stakingEth) / eth.WeiToEth(totalEth) { - t.Errorf("Incorrect network ETH utilization rate %f", ethUtilizationRate) - } - -} - - -func TestNodeFee(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Get settings - targetNodeFee, err := settings.GetTargetNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - minNodeFee, err := settings.GetMinimumNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - maxNodeFee, err := settings.GetMaximumNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - demandRange, err := settings.GetNodeFeeDemandRange(rp, nil) - if err != nil { t.Fatal(err) } - - // Get & check initial node demand - if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { - t.Error(err) - } else if nodeDemand.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node demand value %s", nodeDemand.String()) - } - - // Get & check initial node fee - if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if nodeFee != targetNodeFee { - t.Errorf("Incorrect initial node fee %f", nodeFee) - } - - // Make user deposit - opts := userAccount.GetTransactor() - opts.Value = demandRange - if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } - - // Get & check updated node demand - if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { - t.Error(err) - } else if nodeDemand.Cmp(opts.Value) != 0 { - t.Errorf("Incorrect updated node demand value %s", nodeDemand.String()) - } - - // Get & check updated node fee - if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if nodeFee != maxNodeFee { - t.Errorf("Incorrect updated node fee %f", nodeFee) - } - - // Get & check node fees by demand values - negDemandRange := new(big.Int) - negDemandRange.Neg(demandRange) - if nodeFee, err := network.GetNodeFeeByDemand(rp, big.NewInt(0), nil); err != nil { - t.Error(err) - } else if nodeFee != targetNodeFee { - t.Errorf("Incorrect node fee for zero demand %f", nodeFee) - } - if nodeFee, err := network.GetNodeFeeByDemand(rp, negDemandRange, nil); err != nil { - t.Error(err) - } else if nodeFee != minNodeFee { - t.Errorf("Incorrect node fee for negative demand %f", nodeFee) - } - if nodeFee, err := network.GetNodeFeeByDemand(rp, demandRange, nil); err != nil { - t.Error(err) - } else if nodeFee != maxNodeFee { - t.Errorf("Incorrect node fee for positive demand %f", nodeFee) - } - -} - - -func TestSetWithdrawalCredentials(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set withdrawal credentials - withdrawalCredentials := common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") - if _, err := network.SetWithdrawalCredentials(rp, withdrawalCredentials, ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check withdrawal credentials - if networkWithdrawalCredentials, err := network.GetWithdrawalCredentials(rp, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(networkWithdrawalCredentials.Bytes(), withdrawalCredentials.Bytes()) { - t.Errorf("Incorrect network withdrawal credentials %s", networkWithdrawalCredentials.Hex()) - } - -} - - -func TestTransferWithdrawal(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Transfer validator balance - opts := userAccount.GetTransactor() - opts.Value = eth.EthToWei(50) - if _, err := network.TransferWithdrawal(rp, opts); err != nil { - t.Fatal(err) - } - - // Get & check withdrawal contract balance - if withdrawalBalance, err := network.GetWithdrawalBalance(rp, nil); err != nil { - t.Error(err) - } else if withdrawalBalance.Cmp(opts.Value) != 0 { - t.Errorf("Incorrect withdrawal contract balance %s", withdrawalBalance.String()) - } - -} - - -func TestProcessWithdrawal(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) - if err != nil { t.Fatal(err) } - - // Make user deposit - userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Mark minipool as withdrawable - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Transfer validator balance - transferWithdrawalOpts := userAccount.GetTransactor() - transferWithdrawalOpts.Value = eth.EthToWei(32) - if _, err := network.TransferWithdrawal(rp, transferWithdrawalOpts); err != nil { t.Fatal(err) } - - // Get initial token contract ETH balances - nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - - // Process withdrawal - validatorPubkey, err := validator.GetValidatorPubkey() - if err != nil { t.Fatal(err) } - if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated token contract ETH balances - if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { - t.Error("nETH contract ETH balance did not increase after processing withdrawal") - } - if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { - t.Error("rETH contract ETH balance did not increase after processing withdrawal") - } - -} - diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go new file mode 100644 index 000000000..97ac96810 --- /dev/null +++ b/tests/network/withdrawal_test.go @@ -0,0 +1,127 @@ +package network + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestSetWithdrawalCredentials(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set withdrawal credentials + withdrawalCredentials := common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") + if _, err := network.SetWithdrawalCredentials(rp, withdrawalCredentials, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check withdrawal credentials + if networkWithdrawalCredentials, err := network.GetWithdrawalCredentials(rp, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(networkWithdrawalCredentials.Bytes(), withdrawalCredentials.Bytes()) { + t.Errorf("Incorrect network withdrawal credentials %s", networkWithdrawalCredentials.Hex()) + } + +} + + +func TestTransferWithdrawal(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Transfer validator balance + opts := userAccount.GetTransactor() + opts.Value = eth.EthToWei(50) + if _, err := network.TransferWithdrawal(rp, opts); err != nil { + t.Fatal(err) + } + + // Get & check withdrawal contract balance + if withdrawalBalance, err := network.GetWithdrawalBalance(rp, nil); err != nil { + t.Error(err) + } else if withdrawalBalance.Cmp(opts.Value) != 0 { + t.Errorf("Incorrect withdrawal contract balance %s", withdrawalBalance.String()) + } + +} + + +func TestProcessWithdrawal(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Make user deposit + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Mark minipool as withdrawable + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Transfer validator balance + transferWithdrawalOpts := userAccount.GetTransactor() + transferWithdrawalOpts.Value = eth.EthToWei(32) + if _, err := network.TransferWithdrawal(rp, transferWithdrawalOpts); err != nil { t.Fatal(err) } + + // Get initial token contract ETH balances + nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Process withdrawal + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { t.Fatal(err) } + if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated token contract ETH balances + if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { + t.Error("nETH contract ETH balance did not increase after processing withdrawal") + } + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + +} + diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go new file mode 100644 index 000000000..418c98402 --- /dev/null +++ b/tests/node/deposit_test.go @@ -0,0 +1,46 @@ +package node + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestDeposit(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get initial node minipool count + minipoolCount1, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Deposit + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := node.Deposit(rp, 0, opts); err != nil { + t.Fatal(err) + } + + // Get & check updated node minipool count + minipoolCount2, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else if minipoolCount2 != minipoolCount1 + 1 { + t.Error("Incorrect node minipool count") + } + +} + diff --git a/tests/node/main_test.go b/tests/node/main_test.go new file mode 100644 index 000000000..b1605ea98 --- /dev/null +++ b/tests/node/main_test.go @@ -0,0 +1,44 @@ +package node + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/node/node_test.go b/tests/node/node_test.go index 0e851956c..a1949f2b9 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -2,52 +2,13 @@ package node import ( "bytes" - "log" - "os" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - "github.com/rocket-pool/rocketpool-go/utils/eth" -) - - -var ( - client *ethclient.Client - rp *rocketpool.RocketPool - - nodeAccount *accounts.Account ) -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - nodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - func TestRegisterNode(t *testing.T) { // State snapshotting @@ -121,38 +82,3 @@ func TestSetTimezoneLocation(t *testing.T) { } - -func TestDeposit(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get initial node minipool count - minipoolCount1, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Deposit - opts := nodeAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - if _, err := node.Deposit(rp, 0, opts); err != nil { - t.Fatal(err) - } - - // Get & check updated node minipool count - minipoolCount2, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } else if minipoolCount2 != minipoolCount1 + 1 { - t.Error("Incorrect node minipool count") - } - -} - diff --git a/tests/settings/deposit_test.go b/tests/settings/deposit_test.go new file mode 100644 index 000000000..ee6553bce --- /dev/null +++ b/tests/settings/deposit_test.go @@ -0,0 +1,69 @@ +package settings + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestDepositSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get deposits enabled + depositEnabled := false + if _, err := settings.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != depositEnabled { + t.Error("Incorrect deposit enabled value") + } + + // Set & get deposit assignments enabled + assignDepositsEnabled := false + if _, err := settings.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetAssignDepositsEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != assignDepositsEnabled { + t.Error("Incorrect assign deposits enabled value") + } + + // Set & get minimum deposit amount + minimumDeposit := eth.EthToWei(1000) + if _, err := settings.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinimumDeposit(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(minimumDeposit) != 0 { + t.Error("Incorrect minimum deposit value") + } + + // Set & get maximum deposit pool size + maximumDepositPoolSize := eth.EthToWei(1) + if _, err := settings.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumDepositPoolSize(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(maximumDepositPoolSize) != 0 { + t.Error("Incorrect maximum deposit pool size value") + } + + // Set & get maximum deposit assignments + var maximumDepositAssignments uint64 = 50 + if _, err := settings.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumDepositAssignments(rp, nil); err != nil { + t.Error(err) + } else if value != maximumDepositAssignments { + t.Error("Incorrect maximum deposit assignments value") + } + +} + diff --git a/tests/settings/main_test.go b/tests/settings/main_test.go new file mode 100644 index 000000000..e68dcc218 --- /dev/null +++ b/tests/settings/main_test.go @@ -0,0 +1,44 @@ +package settings + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/settings/minipool_test.go b/tests/settings/minipool_test.go new file mode 100644 index 000000000..bfcb02630 --- /dev/null +++ b/tests/settings/minipool_test.go @@ -0,0 +1,89 @@ +package settings + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestMinipoolSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Get & check launch balance and deposit amounts + fullMinipoolBalance := eth.EthToWei(32) + halfMinipoolBalance := eth.EthToWei(16) + emptyMinipoolBalance := eth.EthToWei(0) + if value, err := settings.GetMinipoolLaunchBalance(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool launch balance") + } + if value, err := settings.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit node amount") + } + if value, err := settings.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit node amount") + } + if value, err := settings.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(emptyMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit node amount") + } + if value, err := settings.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit user amount") + } + if value, err := settings.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit user amount") + } + if value, err := settings.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit user amount") + } + + // Set & get submit withdrawable enabled + submitWithdrawableEnabled := false + if _, err := settings.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitWithdrawableEnabled { + t.Error("Incorrect minipool withdrawable submissions enabled value") + } + + // Set & get minipool launch timeout + var minipoolLaunchTimeout uint64 = 5 + if _, err := settings.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolLaunchTimeout(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolLaunchTimeout { + t.Error("Incorrect minipool launch timeout value") + } + + // Set & get minipool withdrawal delay + var minipoolWithdrawalDelay uint64 = 5 + if _, err := settings.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinipoolWithdrawalDelay(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolWithdrawalDelay { + t.Error("Incorrect minipool withdrawal delay value") + } + +} + diff --git a/tests/settings/network_test.go b/tests/settings/network_test.go new file mode 100644 index 000000000..1769eb33d --- /dev/null +++ b/tests/settings/network_test.go @@ -0,0 +1,109 @@ +package settings + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestNetworkSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get node consensus threshold + nodeConsensusThreshold := 0.1 + if _, err := settings.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeConsensusThreshold(rp, nil); err != nil { + t.Error(err) + } else if value != nodeConsensusThreshold { + t.Error("Incorrect node consensus threshold value") + } + + // Set & get network balance submissions enabled + submitBalancesEnabled := false + if _, err := settings.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetSubmitBalancesEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesEnabled { + t.Error("Incorrect network balance submissions enabled value") + } + + // Set & get network balance submission frequency + var submitBalancesFrequency uint64 = 10 + if _, err := settings.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetSubmitBalancesFrequency(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesFrequency { + t.Error("Incorrect network balance submission frequency value") + } + + // Set & get process withdrawals enabled + processWithdrawalsEnabled := false + if _, err := settings.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetProcessWithdrawalsEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != processWithdrawalsEnabled { + t.Error("Incorrect process withdrawals enabled value") + } + + // Set & get minimum node fee + minimumNodeFee := 0.80 + if _, err := settings.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMinimumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != minimumNodeFee { + t.Error("Incorrect minimum node fee value") + } + + // Set & get target node fee + targetNodeFee := 0.85 + if _, err := settings.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetTargetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != targetNodeFee { + t.Error("Incorrect target node fee value") + } + + // Set & get maximum node fee + maximumNodeFee := 0.90 + if _, err := settings.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetMaximumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != maximumNodeFee { + t.Error("Incorrect maximum node fee value") + } + + // Set & get node fee demand range + nodeFeeDemandRange := eth.EthToWei(10) + if _, err := settings.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeFeeDemandRange(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(nodeFeeDemandRange) != 0 { + t.Error("Incorrect node fee demand range value") + } + + // Set & get target rETH collateral rate + targetRethCollateralRate := 0.95 + if _, err := settings.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetTargetRethCollateralRate(rp, nil); err != nil { + t.Error(err) + } else if value != targetRethCollateralRate { + t.Error("Incorrect target rETH collateral rate value") + } + +} + diff --git a/tests/settings/node_test.go b/tests/settings/node_test.go new file mode 100644 index 000000000..4338c86b3 --- /dev/null +++ b/tests/settings/node_test.go @@ -0,0 +1,38 @@ +package settings + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" +) + + +func TestNodeSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get node registrations enabled + nodeRegistrationsEnabled := false + if _, err := settings.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeRegistrationEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeRegistrationsEnabled { + t.Error("Incorrect node registrations enabled value") + } + + // Set & get node deposits enabled + nodeDepositsEnabled := false + if _, err := settings.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := settings.GetNodeDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeDepositsEnabled { + t.Error("Incorrect node deposits enabled value") + } + +} + diff --git a/tests/settings/settings_test.go b/tests/settings/settings_test.go deleted file mode 100644 index 3501515f0..000000000 --- a/tests/settings/settings_test.go +++ /dev/null @@ -1,313 +0,0 @@ -package rocketpool - -import ( - "log" - "os" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - "github.com/rocket-pool/rocketpool-go/utils/eth" -) - - -var ( - client *ethclient.Client - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account -) - - -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - -func TestDepositSettings(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get deposits enabled - depositEnabled := false - if _, err := settings.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetDepositEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != depositEnabled { - t.Error("Incorrect deposit enabled value") - } - - // Set & get deposit assignments enabled - assignDepositsEnabled := false - if _, err := settings.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetAssignDepositsEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != assignDepositsEnabled { - t.Error("Incorrect assign deposits enabled value") - } - - // Set & get minimum deposit amount - minimumDeposit := eth.EthToWei(1000) - if _, err := settings.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMinimumDeposit(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(minimumDeposit) != 0 { - t.Error("Incorrect minimum deposit value") - } - - // Set & get maximum deposit pool size - maximumDepositPoolSize := eth.EthToWei(1) - if _, err := settings.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMaximumDepositPoolSize(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(maximumDepositPoolSize) != 0 { - t.Error("Incorrect maximum deposit pool size value") - } - - // Set & get maximum deposit assignments - var maximumDepositAssignments uint64 = 50 - if _, err := settings.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMaximumDepositAssignments(rp, nil); err != nil { - t.Error(err) - } else if value != maximumDepositAssignments { - t.Error("Incorrect maximum deposit assignments value") - } - -} - - -func TestMinipoolSettings(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Get & check launch balance and deposit amounts - fullMinipoolBalance := eth.EthToWei(32) - halfMinipoolBalance := eth.EthToWei(16) - emptyMinipoolBalance := eth.EthToWei(0) - if value, err := settings.GetMinipoolLaunchBalance(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool launch balance") - } - if value, err := settings.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool full deposit node amount") - } - if value, err := settings.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool half deposit node amount") - } - if value, err := settings.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(emptyMinipoolBalance) != 0 { - t.Error("Incorrect minipool empty deposit node amount") - } - if value, err := settings.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool full deposit user amount") - } - if value, err := settings.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool half deposit user amount") - } - if value, err := settings.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool empty deposit user amount") - } - - // Set & get submit withdrawable enabled - submitWithdrawableEnabled := false - if _, err := settings.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != submitWithdrawableEnabled { - t.Error("Incorrect minipool withdrawable submissions enabled value") - } - - // Set & get minipool launch timeout - var minipoolLaunchTimeout uint64 = 5 - if _, err := settings.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMinipoolLaunchTimeout(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolLaunchTimeout { - t.Error("Incorrect minipool launch timeout value") - } - - // Set & get minipool withdrawal delay - var minipoolWithdrawalDelay uint64 = 5 - if _, err := settings.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMinipoolWithdrawalDelay(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolWithdrawalDelay { - t.Error("Incorrect minipool withdrawal delay value") - } - -} - - -func TestNetworkSettings(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get node consensus threshold - nodeConsensusThreshold := 0.1 - if _, err := settings.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetNodeConsensusThreshold(rp, nil); err != nil { - t.Error(err) - } else if value != nodeConsensusThreshold { - t.Error("Incorrect node consensus threshold value") - } - - // Set & get network balance submissions enabled - submitBalancesEnabled := false - if _, err := settings.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetSubmitBalancesEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != submitBalancesEnabled { - t.Error("Incorrect network balance submissions enabled value") - } - - // Set & get network balance submission frequency - var submitBalancesFrequency uint64 = 10 - if _, err := settings.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetSubmitBalancesFrequency(rp, nil); err != nil { - t.Error(err) - } else if value != submitBalancesFrequency { - t.Error("Incorrect network balance submission frequency value") - } - - // Set & get process withdrawals enabled - processWithdrawalsEnabled := false - if _, err := settings.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetProcessWithdrawalsEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != processWithdrawalsEnabled { - t.Error("Incorrect process withdrawals enabled value") - } - - // Set & get minimum node fee - minimumNodeFee := 0.80 - if _, err := settings.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMinimumNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != minimumNodeFee { - t.Error("Incorrect minimum node fee value") - } - - // Set & get target node fee - targetNodeFee := 0.85 - if _, err := settings.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetTargetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != targetNodeFee { - t.Error("Incorrect target node fee value") - } - - // Set & get maximum node fee - maximumNodeFee := 0.90 - if _, err := settings.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetMaximumNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != maximumNodeFee { - t.Error("Incorrect maximum node fee value") - } - - // Set & get node fee demand range - nodeFeeDemandRange := eth.EthToWei(10) - if _, err := settings.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetNodeFeeDemandRange(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(nodeFeeDemandRange) != 0 { - t.Error("Incorrect node fee demand range value") - } - - // Set & get target rETH collateral rate - targetRethCollateralRate := 0.95 - if _, err := settings.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetTargetRethCollateralRate(rp, nil); err != nil { - t.Error(err) - } else if value != targetRethCollateralRate { - t.Error("Incorrect target rETH collateral rate value") - } - -} - - -func TestNodeSettings(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get node registrations enabled - nodeRegistrationsEnabled := false - if _, err := settings.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetNodeRegistrationEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != nodeRegistrationsEnabled { - t.Error("Incorrect node registrations enabled value") - } - - // Set & get node deposits enabled - nodeDepositsEnabled := false - if _, err := settings.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := settings.GetNodeDepositEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != nodeDepositsEnabled { - t.Error("Incorrect node deposits enabled value") - } - -} - diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go new file mode 100644 index 000000000..95761e2f4 --- /dev/null +++ b/tests/tokens/main_test.go @@ -0,0 +1,50 @@ +package tokens + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/tokens/tokens_test.go b/tests/tokens/neth_test.go similarity index 51% rename from tests/tokens/tokens_test.go rename to tests/tokens/neth_test.go index 53e604c64..d85d6ed13 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/neth_test.go @@ -1,17 +1,11 @@ package tokens import ( - "log" - "os" "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" @@ -21,41 +15,6 @@ import ( ) -var ( - client *ethclient.Client - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - userAccount *accounts.Account -) - - -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - func TestNETHBalances(t *testing.T) { // State snapshotting @@ -160,99 +119,3 @@ func TestBurnNETH(t *testing.T) { } - -func TestRETHBalances(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } - - // Get & check rETH total supply - if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { - t.Error(err) - } else if rethTotalSupply.Cmp(rethAmount) != 0 { - t.Errorf("Incorrect rETH total supply %s", rethTotalSupply.String()) - } - - // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, userAccount.Address, nil); err != nil { - t.Error(err) - } else if rethBalance.Cmp(rethAmount) != 0 { - t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) - } - -} - - -func TestTransferRETH(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } - - // Transfer rETH - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if rethBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) - } - -} - - -func TestBurnRETH(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } - - // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Burn rETH - burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnRETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) - if err != nil { - t.Fatal(err) - } else { - if balances2.RETH.Cmp(balances1.RETH) != -1 { - t.Error("rETH balance did not decrease after burning rETH") - } - if balances2.ETH.Cmp(balances1.ETH) != 1 { - t.Error("ETH balance did not increase after burning rETH") - } - } - -} - - -// TODO: -// implement additional rETH unit tests - diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go new file mode 100644 index 000000000..ef88f2ee4 --- /dev/null +++ b/tests/tokens/reth_test.go @@ -0,0 +1,109 @@ +package tokens + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestRETHBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Get & check rETH total supply + if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if rethTotalSupply.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH total supply %s", rethTotalSupply.String()) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, userAccount.Address, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } + +} + + +func TestTransferRETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Transfer rETH + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } + +} + + +func TestBurnRETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + + // Get initial balances + balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Burn rETH + burnAmount := eth.EthToWei(50) + if _, err := tokens.BurnRETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated balances + balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else { + if balances2.RETH.Cmp(balances1.RETH) != -1 { + t.Error("rETH balance did not decrease after burning rETH") + } + if balances2.ETH.Cmp(balances1.ETH) != 1 { + t.Error("ETH balance did not increase after burning rETH") + } + } + +} + + +// TODO: +// implement additional rETH unit tests + From d18e1f1a612ab2dbe3d5f302da0768241942f749 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 10:05:24 +1000 Subject: [PATCH 148/878] refactoring unit tests --- tests/deposit/deposit_test.go | 43 ------------------------- tests/deposit/main_test.go | 50 +++++++++++++++++++++++++++++ tests/rocketpool/main_test.go | 37 +++++++++++++++++++++ tests/rocketpool/rocketpool_test.go | 29 ----------------- 4 files changed, 87 insertions(+), 72 deletions(-) create mode 100644 tests/deposit/main_test.go create mode 100644 tests/rocketpool/main_test.go diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 0bc3f12da..1c1241de0 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -1,59 +1,16 @@ package deposit import ( - "log" - "os" "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) -var ( - client *ethclient.Client - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - nodeAccount *accounts.Account - userAccount *accounts.Account -) - - -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - func TestDeposit(t *testing.T) { // State snapshotting diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go new file mode 100644 index 000000000..0b25cde24 --- /dev/null +++ b/tests/deposit/main_test.go @@ -0,0 +1,50 @@ +package deposit + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go new file mode 100644 index 000000000..0fcded08f --- /dev/null +++ b/tests/rocketpool/main_test.go @@ -0,0 +1,37 @@ +package rocketpool + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/rocketpool/rocketpool_test.go b/tests/rocketpool/rocketpool_test.go index 09fc9ff8d..f685aad33 100644 --- a/tests/rocketpool/rocketpool_test.go +++ b/tests/rocketpool/rocketpool_test.go @@ -3,41 +3,12 @@ package rocketpool import ( "bytes" "encoding/json" - "log" - "os" "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" -) - - -var ( - client *ethclient.Client - rp *rocketpool.RocketPool ) -func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) - -} - - func TestGetAddress(t *testing.T) { // Get contract address From 3ed3499fe921b1384369607c2a3e024b710afa35 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 10:17:32 +1000 Subject: [PATCH 149/878] refactoring minipool module --- minipool/minipool.go | 84 -------------------------------------------- minipool/queue.go | 63 +++++++++++++++++++++++++++++++++ minipool/status.go | 52 +++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 84 deletions(-) create mode 100644 minipool/queue.go create mode 100644 minipool/status.go diff --git a/minipool/minipool.go b/minipool/minipool.go index 6f14096fe..ef7c6865d 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -7,12 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -489,76 +487,6 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } -// Get the total length of the minipool queue -func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return 0, err - } - length := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { - return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) - } - return (*length).Uint64(), nil -} - - -// Get the total capacity of the minipool queue -func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) - } - return *capacity, nil -} - - -// Get the capacity of the next minipool in the queue -func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) - } - return *capacity, nil -} - - -// Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances -func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return nil, err - } - nodeAmount := new(*big.Int) - if err := rocketMinipoolStatus.Call(opts, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { - return nil, fmt.Errorf("Could not get minipool node reward amount: %w", err) - } - return *nodeAmount, nil -} - - -// Submit a minipool withdrawable event -func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) - if err != nil { - return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) - } - return txReceipt, nil -} - - // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { @@ -566,16 +494,4 @@ func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, defer rocketMinipoolManagerLock.Unlock() return rp.GetContract("rocketMinipoolManager") } -var rocketMinipoolQueueLock sync.Mutex -func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolQueueLock.Lock() - defer rocketMinipoolQueueLock.Unlock() - return rp.GetContract("rocketMinipoolQueue") -} -var rocketMinipoolStatusLock sync.Mutex -func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolStatusLock.Lock() - defer rocketMinipoolStatusLock.Unlock() - return rp.GetContract("rocketMinipoolStatus") -} diff --git a/minipool/queue.go b/minipool/queue.go new file mode 100644 index 000000000..e9183f986 --- /dev/null +++ b/minipool/queue.go @@ -0,0 +1,63 @@ +package minipool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get the total length of the minipool queue +func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { + return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) + } + return (*length).Uint64(), nil +} + + +// Get the total capacity of the minipool queue +func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + } + return *capacity, nil +} + + +// Get the capacity of the next minipool in the queue +func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) + } + return *capacity, nil +} + + +// Get contracts +var rocketMinipoolQueueLock sync.Mutex +func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolQueueLock.Lock() + defer rocketMinipoolQueueLock.Unlock() + return rp.GetContract("rocketMinipoolQueue") +} + diff --git a/minipool/status.go b/minipool/status.go new file mode 100644 index 000000000..80722137b --- /dev/null +++ b/minipool/status.go @@ -0,0 +1,52 @@ +package minipool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances +func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return nil, err + } + nodeAmount := new(*big.Int) + if err := rocketMinipoolStatus.Call(opts, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { + return nil, fmt.Errorf("Could not get minipool node reward amount: %w", err) + } + return *nodeAmount, nil +} + + +// Submit a minipool withdrawable event +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) + if err != nil { + return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketMinipoolStatusLock sync.Mutex +func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolStatusLock.Lock() + defer rocketMinipoolStatusLock.Unlock() + return rp.GetContract("rocketMinipoolStatus") +} + From e161846e2217c8860cda7d27a71347a610af823d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 11:01:15 +1000 Subject: [PATCH 150/878] updating minipool module --- minipool/queue.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/minipool/queue.go b/minipool/queue.go index e9183f986..278af7b87 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" ) @@ -25,6 +26,20 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } +// Get the length of a single minipool queue +func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDeposit, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { + return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) + } + return (*length).Uint64(), nil +} + + // Get the total capacity of the minipool queue func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) @@ -39,6 +54,20 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } +// Get the total effective capacity of the minipool queue (used in node demand calculation) +func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) + } + return *capacity, nil +} + + // Get the capacity of the next minipool in the queue func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) From 9e52beb302d95be6dd15e4a2bd560fa0ae284ea4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 13:21:17 +1000 Subject: [PATCH 151/878] implementing minipool module unit tests --- tests/minipool/main_test.go | 50 +++++++++++++++ tests/minipool/minipool_test.go | 105 ++++++++++++++++++++++++++++++++ tests/node/node_test.go | 4 +- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 tests/minipool/main_test.go create mode 100644 tests/minipool/minipool_test.go diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go new file mode 100644 index 000000000..f786d0a5e --- /dev/null +++ b/tests/minipool/main_test.go @@ -0,0 +1,50 @@ +package minipool + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go new file mode 100644 index 000000000..d5e31ba8b --- /dev/null +++ b/tests/minipool/minipool_test.go @@ -0,0 +1,105 @@ +package minipool + +import ( + "bytes" + "testing" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestMinipoolDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get & check initial minipool details + if minipools, err := minipool.GetMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(minipools) != 0 { + t.Error("Incorrect initial minipool count") + } + if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipools) != 0 { + t.Error("Incorrect initial node minipool count") + } + if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipoolPubkeys) != 0 { + t.Error("Incorrect initial node minipool pubkeys count") + } + + // Minipool deposit/withdrawal amounts + minipoolDepositAmount := eth.EthToWei(32) + minipoolWithdrawalAmount := eth.EthToWei(34) + + // Create & stake minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, minipoolDepositAmount) + if err != nil { t.Fatal(err) } + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Mark minipool as withdrawable + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, minipoolDepositAmount, minipoolWithdrawalAmount, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get minipool validator pubkey + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { t.Fatal(err) } + + // Get & check updated minipool details + if minipools, err := minipool.GetMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(minipools) != 1 { + t.Error("Incorrect updated minipool count") + } else { + mpDetails := minipools[0] + if !bytes.Equal(mpDetails.Address.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect minipool address %s", mpDetails.Address.Hex()) + } + if !mpDetails.Exists { + t.Error("Incorrect minipool exists status") + } + if !bytes.Equal(mpDetails.Pubkey.Bytes(), validatorPubkey.Bytes()) { + t.Errorf("Incorrect minipool validator pubkey %s", mpDetails.Pubkey.Hex()) + } + if mpDetails.WithdrawalTotalBalance.Cmp(minipoolWithdrawalAmount) != 0 { + t.Errorf("Incorrect minipool withdrawal total balance %s", mpDetails.WithdrawalTotalBalance.String()) + } + if mpDetails.WithdrawalNodeBalance.Cmp(minipoolWithdrawalAmount) != 0 { + t.Errorf("Incorrect minipool withdrawal node balance %s", mpDetails.WithdrawalNodeBalance.String()) + } + if !mpDetails.Withdrawable { + t.Error("Incorrect minipool withdrawable status") + } + if mpDetails.WithdrawalProcessed { + t.Error("Incorrect minipool withdrawal processed status") + } + } + if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipools) != 1 { + t.Error("Incorrect updated node minipool count") + } else if !bytes.Equal(nodeMinipools[0].Address.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect node minipool address %s", nodeMinipools[0].Address.Hex()) + } + if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipoolPubkeys) != 1 { + t.Error("Incorrect updated node minipool pubkeys count") + } else if !bytes.Equal(nodeMinipoolPubkeys[0].Bytes(), validatorPubkey.Bytes()) { + t.Errorf("Incorrect node minipool pubkey %s", nodeMinipoolPubkeys[0].Hex()) + } + +} + diff --git a/tests/node/node_test.go b/tests/node/node_test.go index a1949f2b9..bf16fddb0 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -25,7 +25,7 @@ func TestRegisterNode(t *testing.T) { // Get & check initial node details if details, err := node.GetNodes(rp, nil); err != nil { t.Error(err) - } else if len(details) > 0 { + } else if len(details) != 0 { t.Error("Incorrect initial node count") } @@ -38,7 +38,7 @@ func TestRegisterNode(t *testing.T) { // Get & check updated node details if details, err := node.GetNodes(rp, nil); err != nil { t.Error(err) - } else if len(details) == 0 { + } else if len(details) != 1 { t.Error("Incorrect updated node count") } else { nodeDetails := details[0] From ffc4fecff12dedb9f867db352ef810cd12ab5079 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 13:59:30 +1000 Subject: [PATCH 152/878] implementing minipool module unit tests --- tests/minipool/minipool_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index d5e31ba8b..caf1e452b 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -101,5 +101,12 @@ func TestMinipoolDetails(t *testing.T) { t.Errorf("Incorrect node minipool pubkey %s", nodeMinipoolPubkeys[0].Hex()) } + // Get & check minipool address by pubkey + if minipoolAddress, err := minipool.GetMinipoolByPubkey(rp, validatorPubkey, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(minipoolAddress.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect minipool address %s for pubkey %s", minipoolAddress.Hex(), validatorPubkey.Hex()) + } + } From 72b1f83f8602b8dc6e0cc22166d7d170dc680aad Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 14:25:25 +1000 Subject: [PATCH 153/878] implementing minipool module unit tests --- minipool/queue.go | 58 +++++++++++++++++++ tests/minipool/queue_test.go | 107 +++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 tests/minipool/queue_test.go diff --git a/minipool/queue.go b/minipool/queue.go index 278af7b87..884401186 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -6,12 +6,70 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" ) +// Minipool queue lengths +type QueueLengths struct { + Total uint64 + FullDeposit uint64 + HalfDeposit uint64 + EmptyDeposit uint64 +} + + +// Get minipool queue lengths +func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengths, error) { + + // Data + var wg errgroup.Group + var total uint64 + var fullDeposit uint64 + var halfDeposit uint64 + var emptyDeposit uint64 + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalLength(rp, opts) + return err + }) + wg.Go(func() error { + var err error + fullDeposit, err = GetQueueLength(rp, rptypes.Full, opts) + return err + }) + wg.Go(func() error { + var err error + halfDeposit, err = GetQueueLength(rp, rptypes.Half, opts) + return err + }) + wg.Go(func() error { + var err error + emptyDeposit, err = GetQueueLength(rp, rptypes.Empty, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueLengths{}, err + } + + // Return + return QueueLengths{ + Total: total, + FullDeposit: fullDeposit, + HalfDeposit: halfDeposit, + EmptyDeposit: emptyDeposit, + }, nil + +} + + // Get the total length of the minipool queue func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go new file mode 100644 index 000000000..15282746c --- /dev/null +++ b/tests/minipool/queue_test.go @@ -0,0 +1,107 @@ +package minipool + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestQueueLengths(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 0 { + t.Errorf("Incorrect total queue length 1 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 0 { + t.Errorf("Incorrect full deposit queue length 1 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 0 { + t.Errorf("Incorrect half deposit queue length 1 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 1 %d", queueLengths.EmptyDeposit) + } + } + + // Create minipool + if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 1 { + t.Errorf("Incorrect total queue length 2 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 2 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 0 { + t.Errorf("Incorrect half deposit queue length 2 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 2 %d", queueLengths.EmptyDeposit) + } + } + + // Create minipool + if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 2 { + t.Errorf("Incorrect total queue length 3 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 3 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 1 { + t.Errorf("Incorrect half deposit queue length 3 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 3 %d", queueLengths.EmptyDeposit) + } + } + + // Create minipool + if _, err := minipoolutils.CreateMinipool(rp, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 3 { + t.Errorf("Incorrect total queue length 4 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 4 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 1 { + t.Errorf("Incorrect half deposit queue length 4 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 1 { + t.Errorf("Incorrect empty deposit queue length 4 %d", queueLengths.EmptyDeposit) + } + } + +} + From 774430031a3692ab7daf9a6dcbb6fc1a0fdb8524 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 15:27:51 +1000 Subject: [PATCH 154/878] implementing minipool module unit tests --- minipool/queue.go | 49 ++++++++++++++++++++ tests/minipool/queue_test.go | 88 ++++++++++++++++++++++++++++++++++-- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/minipool/queue.go b/minipool/queue.go index 884401186..a761c7b19 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -22,6 +22,14 @@ type QueueLengths struct { } +// Minipool queue capacity +type QueueCapacity struct { + Total *big.Int + Effective *big.Int + NextMinipool *big.Int +} + + // Get minipool queue lengths func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengths, error) { @@ -70,6 +78,47 @@ func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengt } +// Get minipool queue capacity +func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapacity, error) { + + // Data + var wg errgroup.Group + var total *big.Int + var effective *big.Int + var nextMinipool *big.Int + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalCapacity(rp, opts) + return err + }) + wg.Go(func() error { + var err error + effective, err = GetQueueEffectiveCapacity(rp, opts) + return err + }) + wg.Go(func() error { + var err error + nextMinipool, err = GetQueueNextCapacity(rp, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueCapacity{}, err + } + + // Return + return QueueCapacity{ + Total: total, + Effective: effective, + NextMinipool: nextMinipool, + }, nil + +} + + // Get the total length of the minipool queue func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index 15282746c..83a357331 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -40,7 +40,7 @@ func TestQueueLengths(t *testing.T) { } } - // Create minipool + // Create full deposit minipool if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } // Get & check queue lengths @@ -61,7 +61,7 @@ func TestQueueLengths(t *testing.T) { } } - // Create minipool + // Create half deposit minipool if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Get & check queue lengths @@ -82,7 +82,7 @@ func TestQueueLengths(t *testing.T) { } } - // Create minipool + // Create empty deposit minipool if _, err := minipoolutils.CreateMinipool(rp, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } // Get & check queue lengths @@ -105,3 +105,85 @@ func TestQueueLengths(t *testing.T) { } + +func TestQueueCapacity(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue total capacity 1 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue effective capacity 1 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 1 %s", queueCapacity.NextMinipool.String()) + } + } + + // Create empty deposit minipool + if _, err := minipoolutils.CreateMinipool(rp, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue total capacity 2 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue effective capacity 2 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 2 %s", queueCapacity.NextMinipool.String()) + } + } + + // Create half deposit minipool + if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(48)) != 0 { + t.Errorf("Incorrect queue total capacity 3 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue effective capacity 3 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 3 %s", queueCapacity.NextMinipool.String()) + } + } + + // Create full deposit minipool + if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(64)) != 0 { + t.Errorf("Incorrect queue total capacity 4 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue effective capacity 4 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 4 %s", queueCapacity.NextMinipool.String()) + } + } + +} + From d6e1f51ed61e4b43d9a426f39ebd1cdc2779a710 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Feb 2021 15:50:40 +1000 Subject: [PATCH 155/878] implementing minipool module unit tests --- tests/minipool/status_test.go | 50 +++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/minipool/status_test.go diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go new file mode 100644 index 000000000..fbde31206 --- /dev/null +++ b/tests/minipool/status_test.go @@ -0,0 +1,50 @@ +package minipool + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestSubmitMinipoolWithdrawable(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create & stake minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + if err != nil { t.Fatal(err) } + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Get & check initial minipool withdrawable status + if withdrawable, err := minipool.GetMinipoolWithdrawable(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if withdrawable { + t.Error("Incorrect initial minipool withdrawable status") + } + + // Submit minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool withdrawable status + if withdrawable, err := minipool.GetMinipoolWithdrawable(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !withdrawable { + t.Error("Incorrect updated minipool withdrawable status") + } + +} + From 36b2053c9cf61c2d047953f0b4745ceb56d06ecc Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 10:09:17 +1000 Subject: [PATCH 156/878] implementing minipool module unit tests --- tests/minipool/status_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index fbde31206..a179e3dcc 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -12,6 +12,22 @@ import ( ) +func TestMinipoolNodeRewardAmount(t *testing.T) { + + // Get & check node reward amount + // Node reward amount = (node only share) + (combined share * node balance / start balance) + (combined share * user balance / start balance * node fee) + // = (40 - 16) + (48 - 40) * 24 / 40 + (48 - 40) * 16 / 40 * 0.5 + // = 24 + 4.8 + 1.6 + // = 30.4 + if rewardAmount, err := minipool.GetMinipoolNodeRewardAmount(rp, 0.5, eth.EthToWei(16), eth.EthToWei(40), eth.EthToWei(48), nil); err != nil { + t.Error(err) + } else if rewardAmount.Cmp(eth.EthToWei(30.4)) != 0 { + t.Errorf("Incorrect minipool node reward amount %s", rewardAmount.String()) + } + +} + + func TestSubmitMinipoolWithdrawable(t *testing.T) { // State snapshotting From 72ff9413811f9278174e230166554488962b6ff8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 10:12:44 +1000 Subject: [PATCH 157/878] minor documentation fix --- tests/minipool/status_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index a179e3dcc..ac83ef4dd 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -16,8 +16,7 @@ func TestMinipoolNodeRewardAmount(t *testing.T) { // Get & check node reward amount // Node reward amount = (node only share) + (combined share * node balance / start balance) + (combined share * user balance / start balance * node fee) - // = (40 - 16) + (48 - 40) * 24 / 40 + (48 - 40) * 16 / 40 * 0.5 - // = 24 + 4.8 + 1.6 + // = (40 - 16) + (48 - 40) * (40 - 16) / 40 + (48 - 40) * 16 / 40 * 0.5 // = 30.4 if rewardAmount, err := minipool.GetMinipoolNodeRewardAmount(rp, 0.5, eth.EthToWei(16), eth.EthToWei(40), eth.EthToWei(48), nil); err != nil { t.Error(err) From 56cf21af1e7a6e2152fe6849bab046d48a4d4315 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 10:14:35 +1000 Subject: [PATCH 158/878] minor documentation fix --- tests/minipool/status_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index ac83ef4dd..ed55ee51d 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -15,8 +15,8 @@ import ( func TestMinipoolNodeRewardAmount(t *testing.T) { // Get & check node reward amount - // Node reward amount = (node only share) + (combined share * node balance / start balance) + (combined share * user balance / start balance * node fee) - // = (40 - 16) + (48 - 40) * (40 - 16) / 40 + (48 - 40) * 16 / 40 * 0.5 + // Node reward amount = (node balance) + (rewards * node balance / start balance) + (rewards * user balance / start balance * node fee) + // = (40 - 16) + (48 - 40) * (40 - 16) / 40 + (48 - 40) * 16 / 40 * 0.5 // = 30.4 if rewardAmount, err := minipool.GetMinipoolNodeRewardAmount(rp, 0.5, eth.EthToWei(16), eth.EthToWei(40), eth.EthToWei(48), nil); err != nil { t.Error(err) From 0598d7a75142c059148ae368254eed9430ce5d6a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 11:47:56 +1000 Subject: [PATCH 159/878] implementing minipool module unit tests --- tests/minipool/contract_test.go | 100 ++++++++++++++++++++++++++++++++ tests/minipool/main_test.go | 3 + 2 files changed, 103 insertions(+) create mode 100644 tests/minipool/contract_test.go diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go new file mode 100644 index 000000000..cc4fa37da --- /dev/null +++ b/tests/minipool/contract_test.go @@ -0,0 +1,100 @@ +package minipool + +import ( + "bytes" + "testing" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get current network node fee + networkNodeFee, err := network.GetNodeFee(rp, nil) + if err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + if err != nil { t.Fatal(err) } + + // Make user deposit + depositOpts := userAccount.GetTransactor(); + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(34), eth.EthToWei(36), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check minipool details + if status, err := mp.GetStatusDetails(nil); err != nil { + t.Error(err) + } else if status.Status != rptypes.Withdrawable { + t.Errorf("Incorrect minipool status %s", status.Status.String()) + } + if depositType, err := mp.GetDepositType(nil); err != nil { + t.Error(err) + } else if depositType != rptypes.Full { + t.Errorf("Incorrect minipool deposit type %s", depositType.String()) + } + if node, err := mp.GetNodeDetails(nil); err != nil { + t.Error(err) + } else { + if !bytes.Equal(node.Address.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect minipool node address %s", node.Address.Hex()) + } + if node.Fee != networkNodeFee { + t.Errorf("Incorrect minipool node fee %f", node.Fee) + } + if node.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool node deposit balance %s", node.DepositBalance.String()) + } + if node.RefundBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool node refund balance %s", node.RefundBalance.String()) + } + if !node.DepositAssigned { + t.Error("Incorrect minipool node deposit assigned status") + } + } + if user, err := mp.GetUserDetails(nil); err != nil { + t.Error(err) + } else { + if user.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool user deposit balance %s", user.DepositBalance.String()) + } + if !user.DepositAssigned { + t.Error("Incorrect minipool user deposit assigned status") + } + } + if staking, err := mp.GetStakingDetails(nil); err != nil { + t.Error(err) + } else { + if staking.StartBalance.Cmp(eth.EthToWei(34)) != 0 { + t.Errorf("Incorrect minipool staking start balance %s", staking.StartBalance.String()) + } + if staking.EndBalance.Cmp(eth.EthToWei(36)) != 0 { + t.Errorf("Incorrect minipool staking end balance %s", staking.EndBalance.String()) + } + } + +} + diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index f786d0a5e..83d8587a5 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -21,6 +21,7 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account nodeAccount *accounts.Account + userAccount *accounts.Account ) @@ -42,6 +43,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(2) if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } // Run tests os.Exit(m.Run()) From b880984ab6664df9ec1f6f84af15b050c34f860a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 11:59:01 +1000 Subject: [PATCH 160/878] implementing minipool module unit tests --- tests/minipool/contract_test.go | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index cc4fa37da..aa6be60b6 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -98,3 +98,43 @@ func TestDetails(t *testing.T) { } + +func TestRefund(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + if err != nil { t.Fatal(err) } + + // Make user deposit + depositOpts := userAccount.GetTransactor(); + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } + + // Get initial node refund balance + nodeRefundBalance1, err := mp.GetNodeRefundBalance(nil) + if err != nil { + t.Fatal(err) + } + + // Refund + if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node refund balance + nodeRefundBalance2, err := mp.GetNodeRefundBalance(nil) + if err != nil { + t.Fatal(err) + } else if nodeRefundBalance2.Cmp(nodeRefundBalance1) != -1 { + t.Error("Node refund balance did not decrease after refunding from minipool") + } + +} + From 7287e2d0fbed9270d7da9f882541ae762b5df5b5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 12:04:39 +1000 Subject: [PATCH 161/878] implementing minipool module unit tests --- tests/minipool/contract_test.go | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index aa6be60b6..b79d4c425 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/utils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/utils/validator" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -138,3 +139,46 @@ func TestRefund(t *testing.T) { } + +func TestStake(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + if err != nil { t.Fatal(err) } + + // Get validator & deposit data + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { t.Fatal(err) } + validatorSignature, err := validator.GetValidatorSignature() + if err != nil { t.Fatal(err) } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + if err != nil { t.Fatal(err) } + + // Get & check initial minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Prelaunch { + t.Errorf("Incorrect initial minipool status %s", status.String()) + } + + // Stake minipool + if _, err = mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Staking { + t.Errorf("Incorrect updated minipool status %s", status.String()) + } + +} + From b02ff258e141068c6b4b3a48c24cbbfd6d9a37c9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 12:15:47 +1000 Subject: [PATCH 162/878] implementing minipool module unit tests --- tests/minipool/contract_test.go | 53 ++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index b79d4c425..2b4c61e53 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -8,6 +8,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" @@ -169,7 +170,7 @@ func TestStake(t *testing.T) { } // Stake minipool - if _, err = mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { + if _, err := mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -182,3 +183,53 @@ func TestStake(t *testing.T) { } + +func TestWithdraw(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + if err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check initial minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial minipool exists status") + } + + // Disable minipool withdrawal delay + withdrawalDelay, err := settings.GetMinipoolWithdrawalDelay(rp, nil) + if err != nil { t.Fatal(err) } + if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Withdraw minipool + if _, err := mp.Withdraw(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Re-enable minipool withdrawal delay + if _, err := settings.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated minipool exists status") + } + +} + From 8b018787edceed449fd02837b815c452e015f8ed Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 12:37:04 +1000 Subject: [PATCH 163/878] implementing minipool module unit tests --- tests/minipool/contract_test.go | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 2b4c61e53..3e57a29b2 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -233,3 +233,76 @@ func TestWithdraw(t *testing.T) { } + +func TestDissolve(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Get & check initial minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Initialized { + t.Errorf("Incorrect initial minipool status %s", status.String()) + } + + // Dissolve minipool + if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Dissolved { + t.Errorf("Incorrect updated minipool status %s", status.String()) + } + +} + + +func TestClose(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Dissolve minipool + if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check initial minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial minipool exists status") + } + + // Close minipool + if _, err := mp.Close(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated minipool exists status") + } + +} + From 3f6c901992283ba91676dc09c86b6f5c46d732bb Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 13:16:51 +1000 Subject: [PATCH 164/878] implementing tokens module unit tests --- tests/tokens/reth_test.go | 40 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index ef88f2ee4..4b32750b2 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -5,7 +5,9 @@ import ( "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -104,6 +106,40 @@ func TestBurnRETH(t *testing.T) { } -// TODO: -// implement additional rETH unit tests +func TestRETHExchangeRate(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Submit network balances + if _, err := network.SubmitBalances(rp, 1, eth.EthToWei(100), eth.EthToWei(100), eth.EthToWei(50), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check ETH value of rETH amount + rethAmount := eth.EthToWei(1) + if ethValue, err := tokens.GetETHValueOfRETH(rp, rethAmount, nil); err != nil { + t.Error(err) + } else if ethValue.Cmp(eth.EthToWei(2)) != 0 { + t.Errorf("Incorrect ETH value %s of rETH amount %s", ethValue.String(), rethAmount.String()) + } + + // Get & check rETH value of ETH amount + ethAmount := eth.EthToWei(2) + if rethValue, err := tokens.GetRETHValueOfETH(rp, ethAmount, nil); err != nil { + t.Error(err) + } else if rethValue.Cmp(eth.EthToWei(1)) != 0 { + t.Errorf("Incorrect rETH value %s of ETH amount %s", rethValue.String(), ethAmount.String()) + } + + // Get & check ETH : rETH exchange rate + if exchangeRate, err := tokens.GetRETHExchangeRate(rp, nil); err != nil { + t.Error(err) + } else if exchangeRate != 2 { + t.Errorf("Incorrect ETH : rETH exchange rate %f : 1", exchangeRate) + } + +} From e91148ca99dbfe9e6c891d6e5160ac5f8e359973 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 13:34:54 +1000 Subject: [PATCH 165/878] implementing tokens module unit tests --- tests/network/withdrawal_test.go | 15 ++++++++++++++- tests/tokens/neth_test.go | 3 +++ tests/tokens/reth_test.go | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go index 97ac96810..8f204e532 100644 --- a/tests/network/withdrawal_test.go +++ b/tests/network/withdrawal_test.go @@ -79,8 +79,9 @@ func TestProcessWithdrawal(t *testing.T) { if err != nil { t.Fatal(err) } // Make user deposit + userDepositAmount := eth.EthToWei(16) userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = eth.EthToWei(16) + userDepositOpts.Value = userDepositAmount if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } // Stake minipool @@ -123,5 +124,17 @@ func TestProcessWithdrawal(t *testing.T) { t.Error("rETH contract ETH balance did not increase after processing withdrawal") } + // Get & check rETH collateral amount & rate + if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { + t.Fatal(err) + } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { + t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) + } + if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { + t.Fatal(err) + } else if rethCollateralRate != 1 { + t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } + } diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index d85d6ed13..100aa2aec 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -15,6 +15,9 @@ import ( ) +// GetNETHContractETHBalance test under network.TestProcessWithdrawal + + func TestNETHBalances(t *testing.T) { // State snapshotting diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 4b32750b2..04d00102b 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -14,6 +14,9 @@ import ( ) +// GetRETHContractETHBalance test under network.TestProcessWithdrawal + + func TestRETHBalances(t *testing.T) { // State snapshotting @@ -143,3 +146,8 @@ func TestRETHExchangeRate(t *testing.T) { } + +// GetRETHTotalCollateral test under network.TestProcessWithdrawal + +// GetRETHCollateralRate test under network.TestProcessWithdrawal + From 833af86568cb5a08cf371a930b408cd74eb0cc1f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 13:44:24 +1000 Subject: [PATCH 166/878] minor documentation update --- tests/config.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/config.go b/tests/config.go index a56286f52..f702cf6e1 100644 --- a/tests/config.go +++ b/tests/config.go @@ -1,6 +1,10 @@ package tests +// Contract addresses and account private keys are based on the following ganache-cli startup command: +// ganache-cli -l 12450000 -e 1000000 -m "jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet" -i 1337 + + const ( Eth1ProviderAddress = "http://127.0.0.1:8545" RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" From 1e79e37233d5e317ad3acc098bec1df6e7085907 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 13:47:54 +1000 Subject: [PATCH 167/878] moved test utils --- tests/deposit/deposit_test.go | 2 +- tests/deposit/main_test.go | 2 +- tests/minipool/contract_test.go | 8 ++++---- tests/minipool/main_test.go | 2 +- tests/minipool/minipool_test.go | 8 ++++---- tests/minipool/queue_test.go | 6 +++--- tests/minipool/status_test.go | 6 +++--- tests/network/balances_test.go | 4 ++-- tests/network/fees_test.go | 2 +- tests/network/main_test.go | 2 +- tests/network/withdrawal_test.go | 8 ++++---- tests/node/deposit_test.go | 2 +- tests/node/main_test.go | 2 +- tests/node/node_test.go | 2 +- tests/settings/deposit_test.go | 2 +- tests/settings/main_test.go | 2 +- tests/settings/minipool_test.go | 2 +- tests/settings/network_test.go | 2 +- tests/settings/node_test.go | 2 +- tests/{utils => testutils}/accounts/accounts.go | 0 tests/{utils => testutils}/evm/snapshots.go | 0 tests/{utils => testutils}/minipool/minipool.go | 4 ++-- tests/{utils => testutils}/node/node.go | 2 +- tests/{utils => testutils}/tokens/neth.go | 4 ++-- tests/{utils => testutils}/tokens/reth.go | 2 +- tests/{utils => testutils}/validator/deposit-data.go | 0 tests/tokens/main_test.go | 2 +- tests/tokens/neth_test.go | 8 ++++---- tests/tokens/reth_test.go | 6 +++--- 29 files changed, 47 insertions(+), 47 deletions(-) rename tests/{utils => testutils}/accounts/accounts.go (100%) rename tests/{utils => testutils}/evm/snapshots.go (100%) rename tests/{utils => testutils}/minipool/minipool.go (93%) rename tests/{utils => testutils}/node/node.go (89%) rename tests/{utils => testutils}/tokens/neth.go (92%) rename tests/{utils => testutils}/tokens/reth.go (90%) rename tests/{utils => testutils}/validator/deposit-data.go (100%) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 1c1241de0..ce9e85592 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -6,7 +6,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 0b25cde24..14631d95c 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 3e57a29b2..822191d67 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -9,10 +9,10 @@ import ( "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 83d8587a5..b2dcf35a5 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index caf1e452b..56741b40f 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -6,10 +6,10 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index 83a357331..c9bff4114 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -5,9 +5,9 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index ed55ee51d..fa09d4929 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -5,9 +5,9 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/network/balances_test.go b/tests/network/balances_test.go index 30c0bc442..7b3fea555 100644 --- a/tests/network/balances_test.go +++ b/tests/network/balances_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/network/fees_test.go b/tests/network/fees_test.go index 66698eb4f..e9a8dfc35 100644 --- a/tests/network/fees_test.go +++ b/tests/network/fees_test.go @@ -7,7 +7,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/network/main_test.go b/tests/network/main_test.go index d52f553b4..9dc04dd6b 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go index 8f204e532..f0f3cac0e 100644 --- a/tests/network/withdrawal_test.go +++ b/tests/network/withdrawal_test.go @@ -10,10 +10,10 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index 418c98402..204bdf1c4 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -5,7 +5,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index b1605ea98..0b8aa0fd5 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index bf16fddb0..1b7add355 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/settings/deposit_test.go b/tests/settings/deposit_test.go index ee6553bce..4d7cd5fb3 100644 --- a/tests/settings/deposit_test.go +++ b/tests/settings/deposit_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/settings/main_test.go b/tests/settings/main_test.go index e68dcc218..03429caef 100644 --- a/tests/settings/main_test.go +++ b/tests/settings/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/settings/minipool_test.go b/tests/settings/minipool_test.go index bfcb02630..90fe12174 100644 --- a/tests/settings/minipool_test.go +++ b/tests/settings/minipool_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/settings/network_test.go b/tests/settings/network_test.go index 1769eb33d..21cd4116c 100644 --- a/tests/settings/network_test.go +++ b/tests/settings/network_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/settings/node_test.go b/tests/settings/node_test.go index 4338c86b3..f58ec501d 100644 --- a/tests/settings/node_test.go +++ b/tests/settings/node_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/utils/accounts/accounts.go b/tests/testutils/accounts/accounts.go similarity index 100% rename from tests/utils/accounts/accounts.go rename to tests/testutils/accounts/accounts.go diff --git a/tests/utils/evm/snapshots.go b/tests/testutils/evm/snapshots.go similarity index 100% rename from tests/utils/evm/snapshots.go rename to tests/testutils/evm/snapshots.go diff --git a/tests/utils/minipool/minipool.go b/tests/testutils/minipool/minipool.go similarity index 93% rename from tests/utils/minipool/minipool.go rename to tests/testutils/minipool/minipool.go index 85e2edc19..39f2a3281 100644 --- a/tests/utils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -9,8 +9,8 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) diff --git a/tests/utils/node/node.go b/tests/testutils/node/node.go similarity index 89% rename from tests/utils/node/node.go rename to tests/testutils/node/node.go index 80de82b41..d37cad9d8 100644 --- a/tests/utils/node/node.go +++ b/tests/testutils/node/node.go @@ -3,7 +3,7 @@ package node import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/utils/tokens/neth.go b/tests/testutils/tokens/neth.go similarity index 92% rename from tests/utils/tokens/neth.go rename to tests/testutils/tokens/neth.go index 20c302c55..4cdb3b493 100644 --- a/tests/utils/tokens/neth.go +++ b/tests/testutils/tokens/neth.go @@ -7,8 +7,8 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/utils/minipool" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/utils/tokens/reth.go b/tests/testutils/tokens/reth.go similarity index 90% rename from tests/utils/tokens/reth.go rename to tests/testutils/tokens/reth.go index aaf819d79..71060232c 100644 --- a/tests/utils/tokens/reth.go +++ b/tests/testutils/tokens/reth.go @@ -5,7 +5,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tokens" ) diff --git a/tests/utils/validator/deposit-data.go b/tests/testutils/validator/deposit-data.go similarity index 100% rename from tests/utils/validator/deposit-data.go rename to tests/testutils/validator/deposit-data.go diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 95761e2f4..143a14ae3 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -10,7 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/utils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index 100aa2aec..aa84c452c 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -6,10 +6,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" - "github.com/rocket-pool/rocketpool-go/tests/utils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 04d00102b..a260ea0e8 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/tests/utils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/utils/node" - tokenutils "github.com/rocket-pool/rocketpool-go/tests/utils/tokens" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" ) From 4f59d3e77e014b433f3f6eef3e40a65e7bebbd14 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 13:54:26 +1000 Subject: [PATCH 168/878] moved test utils --- tests/deposit/deposit_test.go | 3 ++- tests/deposit/main_test.go | 1 + tests/minipool/contract_test.go | 5 +++-- tests/minipool/main_test.go | 1 + tests/minipool/minipool_test.go | 3 ++- tests/minipool/queue_test.go | 3 ++- tests/minipool/status_test.go | 3 ++- tests/network/balances_test.go | 3 ++- tests/network/fees_test.go | 1 + tests/network/main_test.go | 1 + tests/network/withdrawal_test.go | 5 +++-- tests/node/deposit_test.go | 3 ++- tests/node/main_test.go | 1 + tests/node/node_test.go | 1 + tests/rocketpool/main_test.go | 1 + tests/settings/deposit_test.go | 3 ++- tests/settings/main_test.go | 1 + tests/settings/minipool_test.go | 3 ++- tests/settings/network_test.go | 3 ++- tests/settings/node_test.go | 1 + tests/testutils/minipool/minipool.go | 1 + tests/testutils/node/node.go | 1 + tests/testutils/tokens/neth.go | 3 ++- tests/testutils/tokens/reth.go | 3 ++- tests/testutils/validator/deposit-data.go | 3 ++- tests/tokens/main_test.go | 1 + tests/tokens/neth_test.go | 5 +++-- tests/tokens/reth_test.go | 5 +++-- 28 files changed, 48 insertions(+), 20 deletions(-) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index ce9e85592..e907082f0 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -6,8 +6,9 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 14631d95c..366e36115 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 822191d67..049c4cb40 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -9,12 +9,13 @@ import ( "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index b2dcf35a5..2a0b6797e 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index 56741b40f..dc4a241f5 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -6,11 +6,12 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index c9bff4114..507aee351 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -5,10 +5,11 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index fa09d4929..62221afd8 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -5,10 +5,11 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/network/balances_test.go b/tests/network/balances_test.go index 7b3fea555..a997195ce 100644 --- a/tests/network/balances_test.go +++ b/tests/network/balances_test.go @@ -4,9 +4,10 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/network/fees_test.go b/tests/network/fees_test.go index e9a8dfc35..6e2409bb4 100644 --- a/tests/network/fees_test.go +++ b/tests/network/fees_test.go @@ -7,6 +7,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 9dc04dd6b..2661864dd 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go index f0f3cac0e..aae9ac789 100644 --- a/tests/network/withdrawal_test.go +++ b/tests/network/withdrawal_test.go @@ -10,12 +10,13 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index 204bdf1c4..47d32689d 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -5,8 +5,9 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 0b8aa0fd5..58dbcfe0f 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index 1b7add355..fac8a6e7e 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index 0fcded08f..ad4bfa018 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" ) diff --git a/tests/settings/deposit_test.go b/tests/settings/deposit_test.go index 4d7cd5fb3..505e7f0ad 100644 --- a/tests/settings/deposit_test.go +++ b/tests/settings/deposit_test.go @@ -4,8 +4,9 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/settings/main_test.go b/tests/settings/main_test.go index 03429caef..5a9c05de0 100644 --- a/tests/settings/main_test.go +++ b/tests/settings/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/settings/minipool_test.go b/tests/settings/minipool_test.go index 90fe12174..e379a6770 100644 --- a/tests/settings/minipool_test.go +++ b/tests/settings/minipool_test.go @@ -4,8 +4,9 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/settings/network_test.go b/tests/settings/network_test.go index 21cd4116c..5b77a8487 100644 --- a/tests/settings/network_test.go +++ b/tests/settings/network_test.go @@ -4,8 +4,9 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/settings/node_test.go b/tests/settings/node_test.go index f58ec501d..e02e9187d 100644 --- a/tests/settings/node_test.go +++ b/tests/settings/node_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 39f2a3281..0a48d03c6 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -9,6 +9,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index d37cad9d8..779ac45f0 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -3,6 +3,7 @@ package node import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/testutils/tokens/neth.go b/tests/testutils/tokens/neth.go index 4cdb3b493..23aed97e7 100644 --- a/tests/testutils/tokens/neth.go +++ b/tests/testutils/tokens/neth.go @@ -7,9 +7,10 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/testutils/tokens/reth.go b/tests/testutils/tokens/reth.go index 71060232c..d08b115ec 100644 --- a/tests/testutils/tokens/reth.go +++ b/tests/testutils/tokens/reth.go @@ -5,8 +5,9 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tokens" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/testutils/validator/deposit-data.go b/tests/testutils/validator/deposit-data.go index 9abad1f66..b7b8eced3 100644 --- a/tests/testutils/validator/deposit-data.go +++ b/tests/testutils/validator/deposit-data.go @@ -4,8 +4,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/go-ssz" - "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/types" + + "github.com/rocket-pool/rocketpool-go/tests" ) diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 143a14ae3..197164ade 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index aa84c452c..49de259a4 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -6,12 +6,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index a260ea0e8..d1c0688f1 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -6,11 +6,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) From 9632fc963823dc17dc2dfdd53bdf7d1a76578db1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 15:46:26 +1000 Subject: [PATCH 169/878] implementing util unit tests --- tests/utils/eth/units_test.go | 40 +++++++++++++++++++++++++++++++++++ utils/eth/units.go | 9 ++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/utils/eth/units_test.go diff --git a/tests/utils/eth/units_test.go b/tests/utils/eth/units_test.go new file mode 100644 index 000000000..cb3fae72f --- /dev/null +++ b/tests/utils/eth/units_test.go @@ -0,0 +1,40 @@ +package eth + +import ( + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +func TestConversion(t *testing.T) { + + // Equivalent unit amounts + weiAmount := new(big.Int) + weiAmount.SetString("999999999999999000000", 0) + var gweiAmount float64 = 999999999999.999000000 + var ethAmount float64 = 999.999999999999000000 + + // Convert wei to eth + if toEthAmount := eth.WeiToEth(weiAmount); toEthAmount != ethAmount { + t.Errorf("Incorrect eth amount %f", toEthAmount) + } + + // Convert eth to wei + if toWeiAmount := eth.EthToWei(ethAmount); toWeiAmount.Cmp(weiAmount) != 0 { + t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) + } + + // Convert wei to gigawei + if toGweiAmount := eth.WeiToGwei(weiAmount); toGweiAmount != gweiAmount { + t.Errorf("Incorrect gwei amount %f", toGweiAmount) + } + + // Convert eth to gwei + if toWeiAmount := eth.GweiToWei(gweiAmount); toWeiAmount.Cmp(weiAmount) != 0 { + t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) + } + +} + diff --git a/utils/eth/units.go b/utils/eth/units.go index 1c831a67f..83291492d 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -2,6 +2,7 @@ package eth import ( "math/big" + "strconv" ) @@ -25,9 +26,11 @@ func WeiToEth(wei *big.Int) float64 { // Convert eth to wei func EthToWei(eth float64) *big.Int { + var ethFloat big.Float var weiFloat big.Float var wei big.Int - weiFloat.Mul(big.NewFloat(eth), big.NewFloat(WeiPerEth)) + ethFloat.SetString(strconv.FormatFloat(eth, 'f', -1, 64)) + weiFloat.Mul(ðFloat, big.NewFloat(WeiPerEth)) weiFloat.Int(&wei) return &wei } @@ -46,9 +49,11 @@ func WeiToGwei(wei *big.Int) float64 { // Convert gigawei to wei func GweiToWei(gwei float64) *big.Int { + var gweiFloat big.Float var weiFloat big.Float var wei big.Int - weiFloat.Mul(big.NewFloat(gwei), big.NewFloat(WeiPerGwei)) + gweiFloat.SetString(strconv.FormatFloat(gwei, 'f', -1, 64)) + weiFloat.Mul(&gweiFloat, big.NewFloat(WeiPerGwei)) weiFloat.Int(&wei) return &wei } From 0944f0c5fc5aff63a499386626351e60383db74c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 3 Feb 2021 15:56:22 +1000 Subject: [PATCH 170/878] implementing util unit tests --- tests/utils/eth/transactions_test.go | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/utils/eth/transactions_test.go diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go new file mode 100644 index 000000000..9aa1d395f --- /dev/null +++ b/tests/utils/eth/transactions_test.go @@ -0,0 +1,51 @@ +package eth + +import ( + "context" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestSendTransaction(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Initialize eth client + client, err := ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { t.Fatal(err) } + + // Initialize accounts + userAccount, err := accounts.GetAccount(9) + if err != nil { t.Fatal(err) } + + // Transaction parameters + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + + // Send transaction + opts := userAccount.GetTransactor() + opts.Value = sendAmount + if _, err := eth.SendTransaction(client, toAddress, opts); err != nil { + t.Fatal(err) + } + + // Get & check to address balance + if balance, err := client.BalanceAt(context.Background(), toAddress, nil); err != nil { + t.Error(err) + } else if balance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect to address balance %s", balance.String()) + } + +} + From dee4548f8b3a81b50bf2c1b9d20951fffb148944 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 10:07:37 +1000 Subject: [PATCH 171/878] added unprocessed minipool index --- minipool/minipool.go | 87 ++++++++++++++++++++++++++------- tests/minipool/minipool_test.go | 12 +++++ 2 files changed, 81 insertions(+), 18 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index ef7c6865d..61c04985b 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -35,12 +35,36 @@ type MinipoolDetails struct { // Get all minipool details func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { - - // Get minipool addresses minipoolAddresses, err := GetMinipoolAddresses(rp, opts) if err != nil { return []MinipoolDetails{}, err } + return loadMinipoolDetails(rp, minipoolAddresses, opts); +} + + +// Get unprocessed minipool details +func GetUnprocessedMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetUnprocessedMinipoolAddresses(rp, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts); +} + + +// Get a node's minipool details +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts); +} + + +// Load minipool details +func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) @@ -114,43 +138,42 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com } -// Get a node's minipool details -func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { +// Get unprocessed minipool addresses +func GetUnprocessedMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - // Get minipool addresses - minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) + // Get minipool count + minipoolCount, err := GetUnprocessedMinipoolCount(rp, opts) if err != nil { - return []MinipoolDetails{}, err + return []common.Address{}, err } - // Load minipool details in batches - details := make([]MinipoolDetails, len(minipoolAddresses)) - for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { + // Load minipool addresses in batches + addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { // Get batch start & end index msi := bsi - mei := bsi + MinipoolDetailsBatchSize - if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { mei = minipoolCount } - // Load details + // Load addresses var wg errgroup.Group for mi := msi; mi < mei; mi++ { mi := mi wg.Go(func() error { - minipoolAddress := minipoolAddresses[mi] - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) - if err == nil { details[mi] = minipoolDetails } + address, err := GetUnprocessedMinipoolAt(rp, mi, opts) + if err == nil { addresses[mi] = address } return err }) } if err := wg.Wait(); err != nil { - return []MinipoolDetails{}, err + return []common.Address{}, err } } // Return - return details, nil + return addresses, nil } @@ -333,6 +356,34 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) } +// Get the unprocessed minipool count +func GetUnprocessedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getUnprocessedMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + + +// Get an unprocessed minipool address by index +func GetUnprocessedMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getUnprocessedMinipoolAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + } + return *minipoolAddress, nil +} + + // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index dc4a241f5..005957c83 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -31,6 +31,11 @@ func TestMinipoolDetails(t *testing.T) { } else if len(minipools) != 0 { t.Error("Incorrect initial minipool count") } + if unprocessedMinipools, err := minipool.GetUnprocessedMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(unprocessedMinipools) != 0 { + t.Error("Incorrect initial unprocessed minipool count") + } if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if len(nodeMinipools) != 0 { @@ -87,6 +92,13 @@ func TestMinipoolDetails(t *testing.T) { t.Error("Incorrect minipool withdrawal processed status") } } + if unprocessedMinipools, err := minipool.GetUnprocessedMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(unprocessedMinipools) != 1 { + t.Error("Incorrect updated unprocessed minipool count") + } else if !bytes.Equal(unprocessedMinipools[0].Address.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect unprocessed minipool address %s", unprocessedMinipools[0].Address.Hex()) + } if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if len(nodeMinipools) != 1 { From b0e24b1f2b0e8473000bee65f479e5b8710f8f0e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 10:42:32 +1000 Subject: [PATCH 172/878] token contracts renamed --- tokens/neth.go | 30 +++++++++++++++--------------- tokens/reth.go | 50 +++++++++++++++++++++++++------------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/tokens/neth.go b/tokens/neth.go index 9a50bef54..5326c74fd 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -15,51 +15,51 @@ import ( // Get the nETH contract ETH balance func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeETHToken, err := getRocketNodeETHToken(rp) + rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - return contractETHBalance(rp, rocketNodeETHToken, opts) + return contractETHBalance(rp, rocketTokenNETH, opts) } // Get nETH total supply func GetNETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeETHToken, err := getRocketNodeETHToken(rp) + rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - return totalSupply(rocketNodeETHToken, "nETH", opts) + return totalSupply(rocketTokenNETH, "nETH", opts) } // Get nETH balance func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeETHToken, err := getRocketNodeETHToken(rp) + rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - return balanceOf(rocketNodeETHToken, "nETH", address, opts) + return balanceOf(rocketTokenNETH, "nETH", address, opts) } // Transfer nETH func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeETHToken, err := getRocketNodeETHToken(rp) + rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - return transfer(rp.Client, rocketNodeETHToken, "nETH", to, amount, opts) + return transfer(rp.Client, rocketTokenNETH, "nETH", to, amount, opts) } // Burn nETH for ETH func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeETHToken, err := getRocketNodeETHToken(rp) + rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - txReceipt, err := rocketNodeETHToken.Transact(opts, "burn", amount) + txReceipt, err := rocketTokenNETH.Transact(opts, "burn", amount) if err != nil { return nil, fmt.Errorf("Could not burn nETH: %w", err) } @@ -68,10 +68,10 @@ func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt // Get contracts -var rocketNodeETHTokenLock sync.Mutex -func getRocketNodeETHToken(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNodeETHTokenLock.Lock() - defer rocketNodeETHTokenLock.Unlock() - return rp.GetContract("rocketNodeETHToken") +var rocketTokenNETHLock sync.Mutex +func getRocketTokenNETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketTokenNETHLock.Lock() + defer rocketTokenNETHLock.Unlock() + return rp.GetContract("rocketTokenNETH") } diff --git a/tokens/reth.go b/tokens/reth.go index a05bdec44..446b28f24 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -16,42 +16,42 @@ import ( // Get the rETH contract ETH balance func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } - return contractETHBalance(rp, rocketETHToken, opts) + return contractETHBalance(rp, rocketTokenRETH, opts) } // Get rETH total supply func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } - return totalSupply(rocketETHToken, "rETH", opts) + return totalSupply(rocketTokenRETH, "rETH", opts) } // Get rETH balance func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } - return balanceOf(rocketETHToken, "rETH", address, opts) + return balanceOf(rocketTokenRETH, "rETH", address, opts) } // Get the ETH value of an amount of rETH func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } ethValue := new(*big.Int) - if err := rocketETHToken.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { + if err := rocketTokenRETH.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { return nil, fmt.Errorf("Could not get ETH value of rETH amount: %w", err) } return *ethValue, nil @@ -60,12 +60,12 @@ func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bin // Get the rETH value of an amount of ETH func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } rethValue := new(*big.Int) - if err := rocketETHToken.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { + if err := rocketTokenRETH.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { return nil, fmt.Errorf("Could not get rETH value of ETH amount: %w", err) } return *rethValue, nil @@ -74,12 +74,12 @@ func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind // Get the current ETH : rETH exchange rate func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return 0, err } exchangeRate := new(*big.Int) - if err := rocketETHToken.Call(opts, exchangeRate, "getExchangeRate"); err != nil { + if err := rocketTokenRETH.Call(opts, exchangeRate, "getExchangeRate"); err != nil { return 0, fmt.Errorf("Could not get rETH exchange rate: %w", err) } return eth.WeiToEth(*exchangeRate), nil @@ -88,12 +88,12 @@ func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float6 // Get the total amount of ETH collateral available for rETH trades func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } totalCollateral := new(*big.Int) - if err := rocketETHToken.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { + if err := rocketTokenRETH.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { return nil, fmt.Errorf("Could not get rETH total collateral: %w", err) } return *totalCollateral, nil @@ -102,12 +102,12 @@ func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi // Get the rETH collateralization rate func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return 0, err } collateralRate := new(*big.Int) - if err := rocketETHToken.Call(opts, collateralRate, "getCollateralRate"); err != nil { + if err := rocketTokenRETH.Call(opts, collateralRate, "getCollateralRate"); err != nil { return 0, fmt.Errorf("Could not get rETH collateral rate: %w", err) } return eth.WeiToEth(*collateralRate), nil @@ -116,21 +116,21 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } - return transfer(rp.Client, rocketETHToken, "rETH", to, amount, opts) + return transfer(rp.Client, rocketTokenRETH, "rETH", to, amount, opts) } // Burn rETH for ETH func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketETHToken, err := getRocketETHToken(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { return nil, err } - txReceipt, err := rocketETHToken.Transact(opts, "burn", amount) + txReceipt, err := rocketTokenRETH.Transact(opts, "burn", amount) if err != nil { return nil, fmt.Errorf("Could not burn rETH: %w", err) } @@ -139,10 +139,10 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt // Get contracts -var rocketETHTokenLock sync.Mutex -func getRocketETHToken(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketETHTokenLock.Lock() - defer rocketETHTokenLock.Unlock() - return rp.GetContract("rocketETHToken") +var rocketTokenRETHLock sync.Mutex +func getRocketTokenRETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketTokenRETHLock.Lock() + defer rocketTokenRETHLock.Unlock() + return rp.GetContract("rocketTokenRETH") } From 27931927883d18db18a0a3293a60e12778676d37 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 14:07:42 +1000 Subject: [PATCH 173/878] updating network module --- network/prices.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 network/prices.go diff --git a/network/prices.go b/network/prices.go new file mode 100644 index 000000000..5465f7024 --- /dev/null +++ b/network/prices.go @@ -0,0 +1,64 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get the block number which network prices are current for +func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return 0, err + } + pricesBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network prices block: %w", err) + } + return (*pricesBlock).Uint64(), nil +} + + +// Get the current network RPL price in ETH +func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + rplPrice := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { + return nil, fmt.Errorf("Could not get network RPL price: %w", err) + } + return *rplPrice, nil +} + + +// Submit network prices for an epoch +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + if err != nil { + return nil, fmt.Errorf("Could not submit network prices: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNetworkPricesLock sync.Mutex +func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + return rp.GetContract("rocketNetworkPrices") +} + From 1dd2f59dabb2d4205ea6e7da9175c40489973a42 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 14:10:46 +1000 Subject: [PATCH 174/878] updating node module --- node/node.go | 145 --------------------------------------------------- 1 file changed, 145 deletions(-) diff --git a/node/node.go b/node/node.go index 4aeb85768..d49aa19dc 100644 --- a/node/node.go +++ b/node/node.go @@ -25,7 +25,6 @@ const ( type NodeDetails struct { Address common.Address `json:"address"` Exists bool `json:"exists"` - Trusted bool `json:"trusted"` TimezoneLocation string `json:"timezoneLocation"` } @@ -111,94 +110,12 @@ func GetNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common. } -// Get all trusted node details -func GetTrustedNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { - - // Get trusted node addresses - trustedNodeAddresses, err := GetTrustedNodeAddresses(rp, opts) - if err != nil { - return []NodeDetails{}, err - } - - // Load node details in batches - details := make([]NodeDetails, len(trustedNodeAddresses)) - for bsi := 0; bsi < len(trustedNodeAddresses); bsi += NodeDetailsBatchSize { - - // Get batch start & end index - nsi := bsi - nei := bsi + NodeDetailsBatchSize - if nei > len(trustedNodeAddresses) { nei = len(trustedNodeAddresses) } - - // Load details - var wg errgroup.Group - for ni := nsi; ni < nei; ni++ { - ni := ni - wg.Go(func() error { - nodeAddress := trustedNodeAddresses[ni] - nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) - if err == nil { details[ni] = nodeDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []NodeDetails{}, err - } - - } - - // Return - return details, nil - -} - - -// Get all trusted node addresses -func GetTrustedNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - - // Get trusted node count - trustedNodeCount, err := GetTrustedNodeCount(rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Load node addresses in batches - addresses := make([]common.Address, trustedNodeCount) - for bsi := uint64(0); bsi < trustedNodeCount; bsi += NodeAddressBatchSize { - - // Get batch start & end index - nsi := bsi - nei := bsi + NodeAddressBatchSize - if nei > trustedNodeCount { nei = trustedNodeCount } - - // Load addresses - var wg errgroup.Group - for ni := nsi; ni < nei; ni++ { - ni := ni - wg.Go(func() error { - address, err := GetTrustedNodeAt(rp, ni, opts) - if err == nil { addresses[ni] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil - -} - - // Get a node's details func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group var exists bool - var trusted bool var timezoneLocation string // Load data @@ -207,11 +124,6 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts exists, err = GetNodeExists(rp, nodeAddress, opts) return err }) - wg.Go(func() error { - var err error - trusted, err = GetNodeTrusted(rp, nodeAddress, opts) - return err - }) wg.Go(func() error { var err error timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) @@ -227,7 +139,6 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts return NodeDetails{ Address: nodeAddress, Exists: exists, - Trusted: trusted, TimezoneLocation: timezoneLocation, }, nil @@ -262,34 +173,6 @@ func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (co } -// Get the number of trusted nodes in the network -func GetTrustedNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return 0, err - } - trustedNodeCount := new(*big.Int) - if err := rocketNodeManager.Call(opts, trustedNodeCount, "getTrustedNodeCount"); err != nil { - return 0, fmt.Errorf("Could not get trusted node count: %w", err) - } - return (*trustedNodeCount).Uint64(), nil -} - - -// Get a trusted node address by index -func GetTrustedNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Address{}, err - } - trustedNodeAddress := new(common.Address) - if err := rocketNodeManager.Call(opts, trustedNodeAddress, "getTrustedNodeAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get trusted node %d address: %w", index, err) - } - return *trustedNodeAddress, nil -} - - // Check whether a node exists func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -304,20 +187,6 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * } -// Get a node's trusted status -func GetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return false, err - } - trusted := new(bool) - if err := rocketNodeManager.Call(opts, trusted, "getNodeTrusted", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %s trusted status: %w", nodeAddress.Hex(), err) - } - return *trusted, nil -} - - // Get a node's timezone location func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -346,20 +215,6 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } -// Set a node's trusted status -func SetNodeTrusted(rp *rocketpool.RocketPool, nodeAddress common.Address, trusted bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketNodeManager.Transact(opts, "setNodeTrusted", nodeAddress, trusted) - if err != nil { - return nil, fmt.Errorf("Could not set node trusted status: %w", err) - } - return txReceipt, nil -} - - // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNodeManager, err := getRocketNodeManager(rp) From ff891b04aea2b5916c965a88d41fa3862b35d18a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 15:27:55 +1000 Subject: [PATCH 175/878] updating node module --- node/staking.go | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 node/staking.go diff --git a/node/staking.go b/node/staking.go new file mode 100644 index 000000000..40b4abd6c --- /dev/null +++ b/node/staking.go @@ -0,0 +1,135 @@ +package node + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get the total RPL staked in the network +func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) + } + return *totalRplStake, nil +} + + +// Get the effective RPL staked in the network +func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil +} + + +// Get a node's RPL stake +func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) + } + return *nodeRplStake, nil +} + + +// Get a node's effective RPL stake +func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStake, "getNodeEffectiveRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) + } + return *nodeEffectiveRplStake, nil +} + + +// Get the block a node last staked RPL at +func GetNodeRPLStakedBlock(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return 0, err + } + nodeRplStakedBlock := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStakedBlock, "getNodeRPLStakedBlock", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node RPL staked block: %w", err) + } + return (*nodeRplStakedBlock).Uint64(), nil +} + + +// Get a node's minipool limit based on RPL stake +func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return 0, err + } + minipoolLimit := new(*big.Int) + if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node minipool limit: %w", err) + } + return (*minipoolLimit).Uint64(), nil +} + + +// Stake RPL +func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) + if err != nil { + return nil, fmt.Errorf("Could not stake RPL: %w", err) + } + return txReceipt, nil +} + + +// Withdraw staked RPL +func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + if err != nil { + return nil, fmt.Errorf("Could not withdraw staked RPL: %w", err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketNodeStakingLock sync.Mutex +func getRocketNodeStaking(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNodeStakingLock.Lock() + defer rocketNodeStakingLock.Unlock() + return rp.GetContract("rocketNodeStaking") +} + From 2e97c71a6c91281cbceb30ddbbab32aabab01035 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 4 Feb 2021 16:01:44 +1000 Subject: [PATCH 176/878] updating tokens module --- tokens/neth.go | 32 ++++++++++++++++++- tokens/reth.go | 32 ++++++++++++++++++- tokens/rpl.go | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ tokens/tokens.go | 41 ++++++++++++++++++++++-- 4 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 tokens/rpl.go diff --git a/tokens/neth.go b/tokens/neth.go index 5326c74fd..d84de8beb 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -43,13 +43,43 @@ func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bin } +// Get nETH allowance +func GetNETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenNETH, err := getRocketTokenNETH(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenNETH, "nETH", owner, spender, opts) +} + + // Transfer nETH func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { return nil, err } - return transfer(rp.Client, rocketTokenNETH, "nETH", to, amount, opts) + return transfer(rocketTokenNETH, "nETH", to, amount, opts) +} + + +// Approve a nETH spender +func ApproveNETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenNETH, err := getRocketTokenNETH(rp) + if err != nil { + return nil, err + } + return approve(rocketTokenNETH, "nETH", spender, amount, opts) +} + + +// Transfer nETH from a sender +func TransferFromNETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenNETH, err := getRocketTokenNETH(rp) + if err != nil { + return nil, err + } + return transferFrom(rocketTokenNETH, "nETH", from, to, amount, opts) } diff --git a/tokens/reth.go b/tokens/reth.go index 446b28f24..0a9ff8f6d 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -44,6 +44,16 @@ func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bin } +// Get rETH allowance +func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenRETH, "rETH", owner, spender, opts) +} + + // Get the ETH value of an amount of rETH func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -120,7 +130,27 @@ func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, if err != nil { return nil, err } - return transfer(rp.Client, rocketTokenRETH, "rETH", to, amount, opts) + return transfer(rocketTokenRETH, "rETH", to, amount, opts) +} + + +// Approve a rETH spender +func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return approve(rocketTokenRETH, "rETH", spender, amount, opts) +} + + +// Transfer rETH from a sender +func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) } diff --git a/tokens/rpl.go b/tokens/rpl.go new file mode 100644 index 000000000..cacdcf552 --- /dev/null +++ b/tokens/rpl.go @@ -0,0 +1,82 @@ +package tokens + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get RPL total supply +func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketTokenRPL, "RPL", opts) +} + + +// Get RPL balance +func GetRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketTokenRPL, "RPL", address, opts) +} + + +// Get RPL allowance +func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenRPL, "RPL", owner, spender, opts) +} + + +// Transfer RPL +func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return transfer(rocketTokenRPL, "RPL", to, amount, opts) +} + + +// Approve an RPL spender +func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return approve(rocketTokenRPL, "RPL", spender, amount, opts) +} + + +// Transfer RPL from a sender +func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return transferFrom(rocketTokenRPL, "RPL", from, to, amount, opts) +} + + +// Get contracts +var rocketTokenRPLLock sync.Mutex +func getRocketTokenRPL(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketTokenRPLLock.Lock() + defer rocketTokenRPLLock.Unlock() + return rp.GetContract("rocketTokenRPL") +} + diff --git a/tokens/tokens.go b/tokens/tokens.go index 2e14e0354..937127491 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -20,6 +19,7 @@ type Balances struct { ETH *big.Int `json:"eth"` NETH *big.Int `json:"neth"` RETH *big.Int `json:"reth"` + RPL *big.Int `json:"rpl"` } @@ -35,6 +35,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C var ethBalance *big.Int var nethBalance *big.Int var rethBalance *big.Int + var rplBalance *big.Int // Load data wg.Go(func() error { @@ -52,6 +53,11 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C rethBalance, err = GetRETHBalance(rp, address, opts) return err }) + wg.Go(func() error { + var err error + rplBalance, err = GetRPLBalance(rp, address, opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -63,6 +69,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C ETH: ethBalance, NETH: nethBalance, RETH: rethBalance, + RPL: rplBalance, }, nil } @@ -96,8 +103,18 @@ func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address com } +// Get a spender's allowance for an address +func allowance(tokenContract *rocketpool.Contract, tokenName string, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { + allowance := new(*big.Int) + if err := tokenContract.Call(opts, allowance, "allowance", owner, spender); err != nil { + return nil, fmt.Errorf("Could not get %s allowance of %s for %s: %w", tokenName, spender.Hex(), owner.Hex(), err) + } + return *allowance, nil +} + + // Transfer tokens to an address -func transfer(client *ethclient.Client, tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := tokenContract.Transact(opts, "transfer", to, amount) if err != nil { return nil, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) @@ -105,3 +122,23 @@ func transfer(client *ethclient.Client, tokenContract *rocketpool.Contract, toke return txReceipt, nil } + +// Approve a token allowance for a spender +func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := tokenContract.Transact(opts, "approve", spender, amount) + if err != nil { + return nil, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) + } + return txReceipt, nil +} + + +// Transfer tokens from a sender to an address +func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) + if err != nil { + return nil, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) + } + return txReceipt, nil +} + From 975eca22551fc6afdf08e3eda4094c08783f5b29 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 10:41:52 +1000 Subject: [PATCH 177/878] updating tokens module --- tokens/rpl-fixed.go | 82 +++++++++++++++++++++++++++++++++++++++++++++ tokens/tokens.go | 16 ++++++--- 2 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 tokens/rpl-fixed.go diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go new file mode 100644 index 000000000..808149765 --- /dev/null +++ b/tokens/rpl-fixed.go @@ -0,0 +1,82 @@ +package tokens + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get fixed-supply RPL total supply +func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketTokenFixedSupplyRPL, "fixed-supply RPL", opts) +} + + +// Get fixed-supply RPL balance +func GetFixedSupplyRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketTokenFixedSupplyRPL, "fixed-supply RPL", address, opts) +} + + +// Get fixed-supply RPL allowance +func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenFixedSupplyRPL, "fixed-supply RPL", owner, spender, opts) +} + + +// Transfer fixed-supply RPL +func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return transfer(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) +} + + +// Approve an fixed-supply RPL spender +func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return approve(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) +} + + +// Transfer fixed-supply RPL from a sender +func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return transferFrom(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) +} + + +// Get contracts +var rocketTokenFixedSupplyRPLLock sync.Mutex +func getRocketTokenRPLFixedSupply(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketTokenFixedSupplyRPLLock.Lock() + defer rocketTokenFixedSupplyRPLLock.Unlock() + return rp.GetContract("rocketTokenRPLFixedSupply") +} + diff --git a/tokens/tokens.go b/tokens/tokens.go index 937127491..b84c74838 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -16,10 +16,11 @@ import ( // Token balances type Balances struct { - ETH *big.Int `json:"eth"` - NETH *big.Int `json:"neth"` - RETH *big.Int `json:"reth"` - RPL *big.Int `json:"rpl"` + ETH *big.Int `json:"eth"` + NETH *big.Int `json:"neth"` + RETH *big.Int `json:"reth"` + RPL *big.Int `json:"rpl"` + FixedSupplyRPL *big.Int `json:"fixedSupplyRpl"` } @@ -36,6 +37,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C var nethBalance *big.Int var rethBalance *big.Int var rplBalance *big.Int + var fixedSupplyRplBalance *big.Int // Load data wg.Go(func() error { @@ -58,6 +60,11 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C rplBalance, err = GetRPLBalance(rp, address, opts) return err }) + wg.Go(func() error { + var err error + fixedSupplyRplBalance, err = GetFixedSupplyRPLBalance(rp, address, opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -70,6 +77,7 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C NETH: nethBalance, RETH: rethBalance, RPL: rplBalance, + FixedSupplyRPL: fixedSupplyRplBalance, }, nil } From 483bf813fee5101afc39c76b4f103c381d2549ca Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 12:12:13 +1000 Subject: [PATCH 178/878] updating tokens module --- tokens/neth.go | 31 +++++++++++---- tokens/reth.go | 91 ++++++++++++++++++++++++++------------------- tokens/rpl-fixed.go | 10 +++++ tokens/rpl.go | 18 +++++++++ 4 files changed, 104 insertions(+), 46 deletions(-) diff --git a/tokens/neth.go b/tokens/neth.go index d84de8beb..1a8cf0759 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -13,14 +13,9 @@ import ( ) -// Get the nETH contract ETH balance -func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return contractETHBalance(rp, rocketTokenNETH, opts) -} +// +// Core ERC-20 functions +// // Get nETH total supply @@ -83,6 +78,21 @@ func TransferFromNETH(rp *rocketpool.RocketPool, from, to common.Address, amount } +// +// nETH functions +// + + +// Get the nETH contract ETH balance +func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenNETH, err := getRocketTokenNETH(rp) + if err != nil { + return nil, err + } + return contractETHBalance(rp, rocketTokenNETH, opts) +} + + // Burn nETH for ETH func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) @@ -97,6 +107,11 @@ func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt } +// +// Contracts +// + + // Get contracts var rocketTokenNETHLock sync.Mutex func getRocketTokenNETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tokens/reth.go b/tokens/reth.go index 0a9ff8f6d..ee431cd30 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -14,14 +14,9 @@ import ( ) -// Get the rETH contract ETH balance -func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return contractETHBalance(rp, rocketTokenRETH, opts) -} +// +// Core ERC-20 functions +// // Get rETH total supply @@ -54,6 +49,51 @@ func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, } +// Transfer rETH +func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return transfer(rocketTokenRETH, "rETH", to, amount, opts) +} + + +// Approve a rETH spender +func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return approve(rocketTokenRETH, "rETH", spender, amount, opts) +} + + +// Transfer rETH from a sender +func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) +} + + +// +// rETH functions +// + + +// Get the rETH contract ETH balance +func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return contractETHBalance(rp, rocketTokenRETH, opts) +} + + // Get the ETH value of an amount of rETH func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -124,36 +164,6 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } -// Transfer rETH -func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return transfer(rocketTokenRETH, "rETH", to, amount, opts) -} - - -// Approve a rETH spender -func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return approve(rocketTokenRETH, "rETH", spender, amount, opts) -} - - -// Transfer rETH from a sender -func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) -} - - // Burn rETH for ETH func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -168,6 +178,11 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt } +// +// Contracts +// + + // Get contracts var rocketTokenRETHLock sync.Mutex func getRocketTokenRETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go index 808149765..48c95dd20 100644 --- a/tokens/rpl-fixed.go +++ b/tokens/rpl-fixed.go @@ -12,6 +12,11 @@ import ( ) +// +// Core ERC-20 functions +// + + // Get fixed-supply RPL total supply func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) @@ -72,6 +77,11 @@ func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Addre } +// +// Contracts +// + + // Get contracts var rocketTokenFixedSupplyRPLLock sync.Mutex func getRocketTokenRPLFixedSupply(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tokens/rpl.go b/tokens/rpl.go index cacdcf552..325967563 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -12,6 +12,11 @@ import ( ) +// +// Core ERC-20 functions +// + + // Get RPL total supply func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -72,6 +77,19 @@ func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount } +// +// RPL functions +// + + + + + +// +// Contracts +// + + // Get contracts var rocketTokenRPLLock sync.Mutex func getRocketTokenRPL(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 704505578e1093f22430c3ce22afa58d68e7abe8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 12:26:52 +1000 Subject: [PATCH 179/878] updating tokens module --- tokens/rpl.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tokens/rpl.go b/tokens/rpl.go index 325967563..4aa8fd34f 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -82,7 +82,32 @@ func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount // +// Mint new RPL tokens from inflation +func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") + if err != nil { + return nil, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) + } + return txReceipt, nil +} + +// Swap fixed-supply RPL for new RPL tokens +func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) + if err != nil { + return nil, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) + } + return txReceipt, nil +} // From 9c20030cbd278209b358d9e7ea2a60ae414e4619 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 12:37:18 +1000 Subject: [PATCH 180/878] updating node module --- node/staking.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/node/staking.go b/node/staking.go index 40b4abd6c..e6e69d01a 100644 --- a/node/staking.go +++ b/node/staking.go @@ -69,6 +69,20 @@ func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addr } +// Get a node's minimum RPL stake to collateralize their minipools +func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeMinimumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) + } + return *nodeMinimumRplStake, nil +} + + // Get the block a node last staked RPL at func GetNodeRPLStakedBlock(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) From 45db87759cafc7db21fa06922937727f706791b4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 13:41:04 +1000 Subject: [PATCH 181/878] updating settings module --- settings/dao.go | 50 +++++++++++++++++++++++++++ settings/deposit.go | 50 +++++++++++++-------------- settings/minipool.go | 62 ++++++++++++++++----------------- settings/network.go | 82 ++++++++++++++++++++++---------------------- settings/node.go | 26 +++++++------- 5 files changed, 160 insertions(+), 110 deletions(-) create mode 100644 settings/dao.go diff --git a/settings/dao.go b/settings/dao.go new file mode 100644 index 000000000..8e8794f39 --- /dev/null +++ b/settings/dao.go @@ -0,0 +1,50 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Bootstrap a bool setting +func bootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap setting %s.%s: %w", contractName, settingPath, err) + } + return txReceipt, nil +} + + +// Bootstrap a uint256 setting +func bootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap setting %s.%s: %w", contractName, settingPath, err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketDAOProtocolLock sync.Mutex +func getRocketDAOProtocol(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProtocolLock.Lock() + defer rocketDAOProtocolLock.Unlock() + return rp.GetContract("rocketDAOProtocol") +} + diff --git a/settings/deposit.go b/settings/deposit.go index 1666a480f..5fcc83dc0 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -14,22 +14,22 @@ import ( // Deposits currently enabled func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDepositSettings.Call(opts, value, "getDepositEnabled"); err != nil { + if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get deposits enabled status: %w", err) } return *value, nil } func SetDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setDepositEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setDepositEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set deposits enabled status: %w", err) } @@ -39,22 +39,22 @@ func SetDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.Transac // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDepositSettings.Call(opts, value, "getAssignDepositsEnabled"); err != nil { + if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getAssignDepositsEnabled"); err != nil { return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) } return *value, nil } func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setAssignDepositsEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setAssignDepositsEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) } @@ -64,22 +64,22 @@ func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind. // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDepositSettings.Call(opts, value, "getMinimumDeposit"); err != nil { + if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMinimumDeposit"); err != nil { return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) } return *value, nil } func SetMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setMinimumDeposit", value) + txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMinimumDeposit", value) if err != nil { return nil, fmt.Errorf("Could not set minimum deposit amount: %w", err) } @@ -89,22 +89,22 @@ func SetMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.Tra // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDepositSettings.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { + if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) } return *value, nil } func SetMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositPoolSize", value) + txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMaximumDepositPoolSize", value) if err != nil { return nil, fmt.Errorf("Could not set maximum deposit pool size: %w", err) } @@ -114,22 +114,22 @@ func SetMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts * // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDepositSettings.Call(opts, value, "getMaximumDepositAssignments"); err != nil { + if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMaximumDepositAssignments"); err != nil { return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) } return (*value).Uint64(), nil } func SetMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDepositSettings, err := getRocketDepositSettings(rp) + rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) if err != nil { return nil, err } - txReceipt, err := rocketDepositSettings.Transact(opts, "setMaximumDepositAssignments", big.NewInt(int64(value))) + txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMaximumDepositAssignments", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set maximum deposit assignments: %w", err) } @@ -138,10 +138,10 @@ func SetMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts // Get contracts -var rocketDepositSettingsLock sync.Mutex -func getRocketDepositSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDepositSettingsLock.Lock() - defer rocketDepositSettingsLock.Unlock() - return rp.GetContract("rocketDepositSettings") +var rocketDAOProtocolSettingsDepositLock sync.Mutex +func getRocketDAOProtocolSettingsDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProtocolSettingsDepositLock.Lock() + defer rocketDAOProtocolSettingsDepositLock.Unlock() + return rp.GetContract("rocketDAOProtocolSettingsDeposit") } diff --git a/settings/minipool.go b/settings/minipool.go index 809c44547..b4e08e665 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -14,12 +14,12 @@ import ( // Get the minipool launch balance func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getLaunchBalance"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getLaunchBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) } return *value, nil @@ -28,34 +28,34 @@ func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (* // Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getFullDepositNodeAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getFullDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) } return *value, nil } func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) } return *value, nil } func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) } return *value, nil @@ -64,34 +64,34 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Required user deposit amounts func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getFullDepositUserAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getFullDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) } return *value, nil } func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getHalfDepositUserAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getHalfDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) } return *value, nil } func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) } return *value, nil @@ -100,22 +100,22 @@ func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return false, err } value := new(bool) - if err := rocketMinipoolSettings.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) } return *value, nil } func SetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } - txReceipt, err := rocketMinipoolSettings.Transact(opts, "setSubmitWithdrawableEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setSubmitWithdrawableEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set minipool withdrawable submissions enabled status: %w", err) } @@ -125,22 +125,22 @@ func SetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, // Timeout period in blocks for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getLaunchTimeout"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } return (*value).Uint64(), nil } func SetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } - txReceipt, err := rocketMinipoolSettings.Transact(opts, "setLaunchTimeout", big.NewInt(int64(value))) + txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setLaunchTimeout", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set minipool launch timeout: %w", err) } @@ -150,22 +150,22 @@ func SetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bin // Withdrawal delay in blocks before withdrawable minipools can be closed func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketMinipoolSettings.Call(opts, value, "getWithdrawalDelay"); err != nil { + if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getWithdrawalDelay"); err != nil { return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) } return (*value).Uint64(), nil } func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketMinipoolSettings, err := getRocketMinipoolSettings(rp) + rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) if err != nil { return nil, err } - txReceipt, err := rocketMinipoolSettings.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(value))) + txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set minipool withdrawal delay: %w", err) } @@ -174,10 +174,10 @@ func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *b // Get contracts -var rocketMinipoolSettingsLock sync.Mutex -func getRocketMinipoolSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolSettingsLock.Lock() - defer rocketMinipoolSettingsLock.Unlock() - return rp.GetContract("rocketMinipoolSettings") +var rocketDAOProtocolSettingsMinipoolLock sync.Mutex +func getRocketDAOProtocolSettingsMinipool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProtocolSettingsMinipoolLock.Lock() + defer rocketDAOProtocolSettingsMinipoolLock.Unlock() + return rp.GetContract("rocketDAOProtocolSettingsMinipool") } diff --git a/settings/network.go b/settings/network.go index 819821a71..8e401b938 100644 --- a/settings/network.go +++ b/settings/network.go @@ -15,22 +15,22 @@ import ( // The threshold of trusted nodes that must reach consensus on oracle data to commit it func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getNodeConsensusThreshold"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getNodeConsensusThreshold"); err != nil { return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) } return eth.WeiToEth(*value), nil } func SetNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setNodeConsensusThreshold", eth.EthToWei(value)) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setNodeConsensusThreshold", eth.EthToWei(value)) if err != nil { return nil, fmt.Errorf("Could not set trusted node consensus threshold: %w", err) } @@ -40,22 +40,22 @@ func SetNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *b // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return false, err } value := new(bool) - if err := rocketNetworkSettings.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) } return *value, nil } func SetSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setSubmitBalancesEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set network balance submissions enabled status: %w", err) } @@ -65,22 +65,22 @@ func SetSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind. // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) } return (*value).Uint64(), nil } func SetSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(int64(value))) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(int64(value))) if err != nil { return nil, fmt.Errorf("Could not set network balance submission frequency: %w", err) } @@ -90,22 +90,22 @@ func SetSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *b // Processing validator withdrawals currently enabled func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return false, err } value := new(bool) - if err := rocketNetworkSettings.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) } return *value, nil } func SetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setProcessWithdrawalsEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setProcessWithdrawalsEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set processing withdrawals enabled status: %w", err) } @@ -115,22 +115,22 @@ func SetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *b // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getMinimumNodeFee"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getMinimumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minimum node fee: %w", err) } return eth.WeiToEth(*value), nil } func SetMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setMinimumNodeFee", eth.EthToWei(value)) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setMinimumNodeFee", eth.EthToWei(value)) if err != nil { return nil, fmt.Errorf("Could not set minimum node fee: %w", err) } @@ -140,22 +140,22 @@ func SetMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.Tran // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getTargetNodeFee"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getTargetNodeFee"); err != nil { return 0, fmt.Errorf("Could not get target node fee: %w", err) } return eth.WeiToEth(*value), nil } func SetTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setTargetNodeFee", eth.EthToWei(value)) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setTargetNodeFee", eth.EthToWei(value)) if err != nil { return nil, fmt.Errorf("Could not set target node fee: %w", err) } @@ -165,22 +165,22 @@ func SetTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.Trans // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getMaximumNodeFee"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getMaximumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get maximum node fee: %w", err) } return eth.WeiToEth(*value), nil } func SetMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setMaximumNodeFee", eth.EthToWei(value)) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setMaximumNodeFee", eth.EthToWei(value)) if err != nil { return nil, fmt.Errorf("Could not set maximum node fee: %w", err) } @@ -190,22 +190,22 @@ func SetMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.Tran // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getNodeFeeDemandRange"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getNodeFeeDemandRange"); err != nil { return nil, fmt.Errorf("Could not get node fee demand range: %w", err) } return *value, nil } func SetNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setNodeFeeDemandRange", value) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setNodeFeeDemandRange", value) if err != nil { return nil, fmt.Errorf("Could not set node fee demand range: %w", err) } @@ -215,22 +215,22 @@ func SetNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketNetworkSettings.Call(opts, value, "getTargetRethCollateralRate"); err != nil { + if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getTargetRethCollateralRate"); err != nil { return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) } return eth.WeiToEth(*value), nil } func SetTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkSettings, err := getRocketNetworkSettings(rp) + rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkSettings.Transact(opts, "setTargetRethCollateralRate", eth.EthToWei(value)) + txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setTargetRethCollateralRate", eth.EthToWei(value)) if err != nil { return nil, fmt.Errorf("Could not set target rETH contract collateralization rate: %w", err) } @@ -239,10 +239,10 @@ func SetTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts // Get contracts -var rocketNetworkSettingsLock sync.Mutex -func getRocketNetworkSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkSettingsLock.Lock() - defer rocketNetworkSettingsLock.Unlock() - return rp.GetContract("rocketNetworkSettings") +var rocketDAOProtocolSettingsNetworkLock sync.Mutex +func getRocketDAOProtocolSettingsNetwork(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProtocolSettingsNetworkLock.Lock() + defer rocketDAOProtocolSettingsNetworkLock.Unlock() + return rp.GetContract("rocketDAOProtocolSettingsNetwork") } diff --git a/settings/node.go b/settings/node.go index 7f19ee242..4a3d721dd 100644 --- a/settings/node.go +++ b/settings/node.go @@ -13,22 +13,22 @@ import ( // Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNodeSettings, err := getRocketNodeSettings(rp) + rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) if err != nil { return false, err } value := new(bool) - if err := rocketNodeSettings.Call(opts, value, "getRegistrationEnabled"); err != nil { + if err := rocketDAOProtocolSettingsNode.Call(opts, value, "getRegistrationEnabled"); err != nil { return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) } return *value, nil } func SetNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeSettings, err := getRocketNodeSettings(rp) + rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) if err != nil { return nil, err } - txReceipt, err := rocketNodeSettings.Transact(opts, "setRegistrationEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsNode.Transact(opts, "setRegistrationEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set node registrations enabled status: %w", err) } @@ -38,22 +38,22 @@ func SetNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bin // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNodeSettings, err := getRocketNodeSettings(rp) + rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) if err != nil { return false, err } value := new(bool) - if err := rocketNodeSettings.Call(opts, value, "getDepositEnabled"); err != nil { + if err := rocketDAOProtocolSettingsNode.Call(opts, value, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) } return *value, nil } func SetNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNodeSettings, err := getRocketNodeSettings(rp) + rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) if err != nil { return nil, err } - txReceipt, err := rocketNodeSettings.Transact(opts, "setDepositEnabled", value) + txReceipt, err := rocketDAOProtocolSettingsNode.Transact(opts, "setDepositEnabled", value) if err != nil { return nil, fmt.Errorf("Could not set node deposits enabled status: %w", err) } @@ -62,10 +62,10 @@ func SetNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.Tra // Get contracts -var rocketNodeSettingsLock sync.Mutex -func getRocketNodeSettings(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNodeSettingsLock.Lock() - defer rocketNodeSettingsLock.Unlock() - return rp.GetContract("rocketNodeSettings") +var rocketDAOProtocolSettingsNodeLock sync.Mutex +func getRocketDAOProtocolSettingsNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProtocolSettingsNodeLock.Lock() + defer rocketDAOProtocolSettingsNodeLock.Unlock() + return rp.GetContract("rocketDAOProtocolSettingsNode") } From 30b184a2c1dad7559869aae4c4175ef920a0e3c4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 14:10:28 +1000 Subject: [PATCH 182/878] updating settings module --- settings/deposit.go | 94 ++++++++----------------- settings/minipool.go | 90 ++++++++++-------------- settings/network.go | 158 ++++++++++++------------------------------- settings/node.go | 46 +++++-------- 4 files changed, 126 insertions(+), 262 deletions(-) diff --git a/settings/deposit.go b/settings/deposit.go index 5fcc83dc0..7756a8965 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -12,136 +12,100 @@ import ( ) +// Config +const DepositSettingsContractName = "rocketDAOProtocolSettingsDeposit" + + // Deposits currently enabled func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) + depositSettingsContract, err := getDepositSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getDepositEnabled"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get deposits enabled status: %w", err) } return *value, nil } -func SetDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setDepositEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set deposits enabled status: %w", err) - } - return txReceipt, nil +func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) } // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) + depositSettingsContract, err := getDepositSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getAssignDepositsEnabled"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getAssignDepositsEnabled"); err != nil { return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) } return *value, nil } -func SetAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setAssignDepositsEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set deposit assignments enabled status: %w", err) - } - return txReceipt, nil +func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) } // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) + depositSettingsContract, err := getDepositSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMinimumDeposit"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getMinimumDeposit"); err != nil { return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) } return *value, nil } -func SetMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMinimumDeposit", value) - if err != nil { - return nil, fmt.Errorf("Could not set minimum deposit amount: %w", err) - } - return txReceipt, nil +func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) } // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) + depositSettingsContract, err := getDepositSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) } return *value, nil } -func SetMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMaximumDepositPoolSize", value) - if err != nil { - return nil, fmt.Errorf("Could not set maximum deposit pool size: %w", err) - } - return txReceipt, nil +func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) } // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) + depositSettingsContract, err := getDepositSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsDeposit.Call(opts, value, "getMaximumDepositAssignments"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getMaximumDepositAssignments"); err != nil { return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) } return (*value).Uint64(), nil } -func SetMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsDeposit, err := getRocketDAOProtocolSettingsDeposit(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsDeposit.Transact(opts, "setMaximumDepositAssignments", big.NewInt(int64(value))) - if err != nil { - return nil, fmt.Errorf("Could not set maximum deposit assignments: %w", err) - } - return txReceipt, nil +func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) } // Get contracts -var rocketDAOProtocolSettingsDepositLock sync.Mutex -func getRocketDAOProtocolSettingsDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProtocolSettingsDepositLock.Lock() - defer rocketDAOProtocolSettingsDepositLock.Unlock() - return rp.GetContract("rocketDAOProtocolSettingsDeposit") +var depositSettingsContractLock sync.Mutex +func getDepositSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + depositSettingsContractLock.Lock() + defer depositSettingsContractLock.Unlock() + return rp.GetContract(DepositSettingsContractName) } diff --git a/settings/minipool.go b/settings/minipool.go index b4e08e665..871b0b4e4 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -12,14 +12,18 @@ import ( ) +// Config +const MinipoolSettingsContractName = "rocketDAOProtocolSettingsMinipool" + + // Get the minipool launch balance func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getLaunchBalance"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getLaunchBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) } return *value, nil @@ -28,34 +32,34 @@ func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (* // Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getFullDepositNodeAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getFullDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) } return *value, nil } func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) } return *value, nil } func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) } return *value, nil @@ -64,34 +68,34 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Required user deposit amounts func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getFullDepositUserAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getFullDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) } return *value, nil } func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getHalfDepositUserAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) } return *value, nil } func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) } return *value, nil @@ -100,84 +104,60 @@ func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) } return *value, nil } -func SetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setSubmitWithdrawableEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set minipool withdrawable submissions enabled status: %w", err) - } - return txReceipt, nil +func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) } // Timeout period in blocks for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getLaunchTimeout"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } return (*value).Uint64(), nil } -func SetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setLaunchTimeout", big.NewInt(int64(value))) - if err != nil { - return nil, fmt.Errorf("Could not set minipool launch timeout: %w", err) - } - return txReceipt, nil +func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) } // Withdrawal delay in blocks before withdrawable minipools can be closed func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsMinipool.Call(opts, value, "getWithdrawalDelay"); err != nil { + if err := minipoolSettingsContract.Call(opts, value, "getWithdrawalDelay"); err != nil { return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) } return (*value).Uint64(), nil } -func SetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsMinipool, err := getRocketDAOProtocolSettingsMinipool(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsMinipool.Transact(opts, "setWithdrawalDelay", big.NewInt(int64(value))) - if err != nil { - return nil, fmt.Errorf("Could not set minipool withdrawal delay: %w", err) - } - return txReceipt, nil +func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) } // Get contracts -var rocketDAOProtocolSettingsMinipoolLock sync.Mutex -func getRocketDAOProtocolSettingsMinipool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProtocolSettingsMinipoolLock.Lock() - defer rocketDAOProtocolSettingsMinipoolLock.Unlock() - return rp.GetContract("rocketDAOProtocolSettingsMinipool") +var minipoolSettingsContractLock sync.Mutex +func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + minipoolSettingsContractLock.Lock() + defer minipoolSettingsContractLock.Unlock() + return rp.GetContract(MinipoolSettingsContractName) } diff --git a/settings/network.go b/settings/network.go index 8e401b938..f17f6c179 100644 --- a/settings/network.go +++ b/settings/network.go @@ -13,236 +13,168 @@ import ( ) +// Config +const NetworkSettingsContractName = "rocketDAOProtocolSettingsNetwork" + + // The threshold of trusted nodes that must reach consensus on oracle data to commit it func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getNodeConsensusThreshold"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getNodeConsensusThreshold"); err != nil { return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) } return eth.WeiToEth(*value), nil } -func SetNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setNodeConsensusThreshold", eth.EthToWei(value)) - if err != nil { - return nil, fmt.Errorf("Could not set trusted node consensus threshold: %w", err) - } - return txReceipt, nil +func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) } // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) } return *value, nil } -func SetSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setSubmitBalancesEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set network balance submissions enabled status: %w", err) - } - return txReceipt, nil +func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) } // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) } return (*value).Uint64(), nil } -func SetSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setSubmitBalancesFrequency", big.NewInt(int64(value))) - if err != nil { - return nil, fmt.Errorf("Could not set network balance submission frequency: %w", err) - } - return txReceipt, nil +func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) } // Processing validator withdrawals currently enabled func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) } return *value, nil } -func SetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setProcessWithdrawalsEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set processing withdrawals enabled status: %w", err) - } - return txReceipt, nil +func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) } // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getMinimumNodeFee"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getMinimumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minimum node fee: %w", err) } return eth.WeiToEth(*value), nil } -func SetMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setMinimumNodeFee", eth.EthToWei(value)) - if err != nil { - return nil, fmt.Errorf("Could not set minimum node fee: %w", err) - } - return txReceipt, nil +func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) } // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getTargetNodeFee"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getTargetNodeFee"); err != nil { return 0, fmt.Errorf("Could not get target node fee: %w", err) } return eth.WeiToEth(*value), nil } -func SetTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setTargetNodeFee", eth.EthToWei(value)) - if err != nil { - return nil, fmt.Errorf("Could not set target node fee: %w", err) - } - return txReceipt, nil +func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) } // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getMaximumNodeFee"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getMaximumNodeFee"); err != nil { return 0, fmt.Errorf("Could not get maximum node fee: %w", err) } return eth.WeiToEth(*value), nil } -func SetMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setMaximumNodeFee", eth.EthToWei(value)) - if err != nil { - return nil, fmt.Errorf("Could not set maximum node fee: %w", err) - } - return txReceipt, nil +func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) } // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getNodeFeeDemandRange"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getNodeFeeDemandRange"); err != nil { return nil, fmt.Errorf("Could not get node fee demand range: %w", err) } return *value, nil } -func SetNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setNodeFeeDemandRange", value) - if err != nil { - return nil, fmt.Errorf("Could not set node fee demand range: %w", err) - } - return txReceipt, nil +func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) } // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolSettingsNetwork.Call(opts, value, "getTargetRethCollateralRate"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getTargetRethCollateralRate"); err != nil { return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) } return eth.WeiToEth(*value), nil } -func SetTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNetwork, err := getRocketDAOProtocolSettingsNetwork(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNetwork.Transact(opts, "setTargetRethCollateralRate", eth.EthToWei(value)) - if err != nil { - return nil, fmt.Errorf("Could not set target rETH contract collateralization rate: %w", err) - } - return txReceipt, nil +func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) } // Get contracts -var rocketDAOProtocolSettingsNetworkLock sync.Mutex -func getRocketDAOProtocolSettingsNetwork(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProtocolSettingsNetworkLock.Lock() - defer rocketDAOProtocolSettingsNetworkLock.Unlock() - return rp.GetContract("rocketDAOProtocolSettingsNetwork") +var networkSettingsContractLock sync.Mutex +func getNetworkSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + networkSettingsContractLock.Lock() + defer networkSettingsContractLock.Unlock() + return rp.GetContract(NetworkSettingsContractName) } diff --git a/settings/node.go b/settings/node.go index 4a3d721dd..70992cee7 100644 --- a/settings/node.go +++ b/settings/node.go @@ -11,61 +11,49 @@ import ( ) +// Config +const NodeSettingsContractName = "rocketDAOProtocolSettingsNode" + + // Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsNode.Call(opts, value, "getRegistrationEnabled"); err != nil { + if err := nodeSettingsContract.Call(opts, value, "getRegistrationEnabled"); err != nil { return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) } return *value, nil } -func SetNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNode.Transact(opts, "setRegistrationEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set node registrations enabled status: %w", err) - } - return txReceipt, nil +func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) } // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp) if err != nil { return false, err } value := new(bool) - if err := rocketDAOProtocolSettingsNode.Call(opts, value, "getDepositEnabled"); err != nil { + if err := nodeSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) } return *value, nil } -func SetNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAOProtocolSettingsNode, err := getRocketDAOProtocolSettingsNode(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAOProtocolSettingsNode.Transact(opts, "setDepositEnabled", value) - if err != nil { - return nil, fmt.Errorf("Could not set node deposits enabled status: %w", err) - } - return txReceipt, nil +func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } // Get contracts -var rocketDAOProtocolSettingsNodeLock sync.Mutex -func getRocketDAOProtocolSettingsNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProtocolSettingsNodeLock.Lock() - defer rocketDAOProtocolSettingsNodeLock.Unlock() - return rp.GetContract("rocketDAOProtocolSettingsNode") +var nodeSettingsContractLock sync.Mutex +func getNodeSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + nodeSettingsContractLock.Lock() + defer nodeSettingsContractLock.Unlock() + return rp.GetContract(NodeSettingsContractName) } From 7f792b5f67ad723b3289bf3ec5cdc7709d921339 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 14:19:49 +1000 Subject: [PATCH 183/878] updating settings module --- settings/node.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/settings/node.go b/settings/node.go index 70992cee7..2f4595dfa 100644 --- a/settings/node.go +++ b/settings/node.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -49,6 +50,40 @@ func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bi } +// The minimum RPL stake per minipool as a fraction of assigned user ETH +func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) +} + + +// The maximum RPL stake per minipool as a fraction of assigned user ETH +func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) +} + + // Get contracts var nodeSettingsContractLock sync.Mutex func getNodeSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 319e8a3c91830840d9052ef34b6cc9044dbb46fa Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 14:22:35 +1000 Subject: [PATCH 184/878] updating settings module --- settings/network.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/settings/network.go b/settings/network.go index f17f6c179..367dd2bc9 100644 --- a/settings/network.go +++ b/settings/network.go @@ -68,6 +68,40 @@ func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, o } +// Network price submissions currently enabled +func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEnabled"); err != nil { + return false, fmt.Errorf("Could not get network price submissions enabled status: %w", err) + } + return *value, nil +} +func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) +} + + +// The frequency in blocks at which network prices should be submitted by trusted nodes +func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { + return 0, fmt.Errorf("Could not get network price submission frequency: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) +} + + // Processing validator withdrawals currently enabled func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { networkSettingsContract, err := getNetworkSettingsContract(rp) From 5c0ab4773433656d8889b05599440a14a9f36050 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 14:23:30 +1000 Subject: [PATCH 185/878] updating settings module --- settings/node.go | 1 + 1 file changed, 1 insertion(+) diff --git a/settings/node.go b/settings/node.go index 2f4595dfa..7b1ec3ae5 100644 --- a/settings/node.go +++ b/settings/node.go @@ -2,6 +2,7 @@ package settings import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" From f782057174e80009cf24b005bf4c9ed8f1d9d4d9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 14:48:32 +1000 Subject: [PATCH 186/878] updating settings module --- settings/auction.go | 146 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 settings/auction.go diff --git a/settings/auction.go b/settings/auction.go new file mode 100644 index 000000000..6a7a4ed99 --- /dev/null +++ b/settings/auction.go @@ -0,0 +1,146 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Config +const AuctionSettingsContractName = "rocketDAOProtocolSettingsAuction" + + +// Lot creation currently enabled +func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := auctionSettingsContract.Call(opts, value, "getCreateLotEnabled"); err != nil { + return false, fmt.Errorf("Could not get lot creation enabled status: %w", err) + } + return *value, nil +} +func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) +} + + +// Lot bidding currently enabled +func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := auctionSettingsContract.Call(opts, value, "getBidOnLotEnabled"); err != nil { + return false, fmt.Errorf("Could not get lot bidding enabled status: %w", err) + } + return *value, nil +} +func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) +} + + +// The minimum lot size in ETH value +func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotMinimumEthValue"); err != nil { + return nil, fmt.Errorf("Could not get lot minimum ETH value: %w", err) + } + return *value, nil +} +func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) +} + + +// The maximum lot size in ETH value +func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotMaximumEthValue"); err != nil { + return nil, fmt.Errorf("Could not get lot maximum ETH value: %w", err) + } + return *value, nil +} +func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) +} + + +// The lot duration in blocks +func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotDuration"); err != nil { + return 0, fmt.Errorf("Could not get lot duration: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) +} + + +// The starting price relative to current ETH price, as a fraction +func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getStartingPriceRatio"); err != nil { + return 0, fmt.Errorf("Could not get lot starting price ratio: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) +} + + +// The reserve price relative to current ETH price, as a fraction +func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getReservePriceRatio"); err != nil { + return 0, fmt.Errorf("Could not get lot reserve price ratio: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) +} + + +// Get contracts +var auctionSettingsContractLock sync.Mutex +func getAuctionSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + auctionSettingsContractLock.Lock() + defer auctionSettingsContractLock.Unlock() + return rp.GetContract(AuctionSettingsContractName) +} + From 12398eb3b867af01c48f6c031914361aafaa7915 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 15:11:51 +1000 Subject: [PATCH 187/878] updating settings module --- settings/inflation.go | 78 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 settings/inflation.go diff --git a/settings/inflation.go b/settings/inflation.go new file mode 100644 index 000000000..6adaffe76 --- /dev/null +++ b/settings/inflation.go @@ -0,0 +1,78 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Config +const InflationSettingsContractName = "rocketDAOProtocolSettingsInflation" + + +// RPL inflation rate per interval +func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + inflationSettingsContract, err := getInflationSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalRate"); err != nil { + return 0, fmt.Errorf("Could not get inflation rate: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) +} + + +// RPL inflation interval in blocks +func GetInflationIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + inflationSettingsContract, err := getInflationSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalBlocks"); err != nil { + return 0, fmt.Errorf("Could not get inflation interval: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) +} + + +// RPL inflation start block +func GetInflationStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + inflationSettingsContract, err := getInflationSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartBlock"); err != nil { + return 0, fmt.Errorf("Could not get inflation start block: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) +} + + +// Get contracts +var inflationSettingsContractLock sync.Mutex +func getInflationSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + inflationSettingsContractLock.Lock() + defer inflationSettingsContractLock.Unlock() + return rp.GetContract(InflationSettingsContractName) +} + From 85186dcfc7e1a4e5593aa2373bc331cb3e6fb64e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 15:49:44 +1000 Subject: [PATCH 188/878] updating settings module --- settings/dao.go | 15 ++++++++ settings/rewards.go | 92 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 settings/rewards.go diff --git a/settings/dao.go b/settings/dao.go index 8e8794f39..6516325fc 100644 --- a/settings/dao.go +++ b/settings/dao.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -40,6 +41,20 @@ func bootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Bootstrap a rewards claimer +func bootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap claimer %s: %w", contractName, err) + } + return txReceipt, nil +} + + // Get contracts var rocketDAOProtocolLock sync.Mutex func getRocketDAOProtocol(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/settings/rewards.go b/settings/rewards.go new file mode 100644 index 000000000..7b4e6fe66 --- /dev/null +++ b/settings/rewards.go @@ -0,0 +1,92 @@ +package settings + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Config +const RewardsSettingsContractName = "rocketDAOProtocolSettingsRewards" + + +// The claim amount for a claimer as a fraction +func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (float64, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPerc", contractName); err != nil { + return 0, fmt.Errorf("Could not get rewards claimer percent: %w", err) + } + return eth.WeiToEth(*value), nil +} + + +// The block that a claimer's share was last updated at +func GetRewardsClaimerPercBlockUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercBlockUpdated", contractName); err != nil { + return 0, fmt.Errorf("Could not get rewards claimer updated block: %w", err) + } + return (*value).Uint64(), nil +} + + +// The total claim amount for all claimers as a fraction +func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersPercTotal"); err != nil { + return 0, fmt.Errorf("Could not get rewards claimers total percent: %w", err) + } + return eth.WeiToEth(*value), nil +} + + +// Bootstrap a rewards claimer amount +func BootstrapRewardsClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapClaimer(rp, contractName, amount, opts); +} + + +// Rewards claim interval in blocks +func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalBlocks"); err != nil { + return 0, fmt.Errorf("Could not get rewards claim interval: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return bootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) +} + + +// Get contracts +var rewardsSettingsContractLock sync.Mutex +func getRewardsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rewardsSettingsContractLock.Lock() + defer rewardsSettingsContractLock.Unlock() + return rp.GetContract(RewardsSettingsContractName) +} + From 29720912caddb80827c43ad8ca1d06ad40d94f4f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 16:05:50 +1000 Subject: [PATCH 189/878] implementing auctions module --- auction/auction.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 auction/auction.go diff --git a/auction/auction.go b/auction/auction.go new file mode 100644 index 000000000..3c73c390b --- /dev/null +++ b/auction/auction.go @@ -0,0 +1,64 @@ +package auction + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get the total RPL balance of the auction contract +func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + totalRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, totalRplBalance, "getTotalRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract total RPL balance: %w", err) + } + return *totalRplBalance, nil +} + + +// Get the allotted RPL balance of the auction contract +func GetAllottedRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + allottedRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, allottedRplBalance, "getAllottedRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract allotted RPL balance: %w", err) + } + return *allottedRplBalance, nil +} + + +// Get the remaining RPL balance of the auction contract +func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + remainingRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, remainingRplBalance, "getRemainingRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract remaining RPL balance: %w", err) + } + return *remainingRplBalance, nil +} + + +// Get contracts +var rocketAuctionManagerLock sync.Mutex +func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketAuctionManagerLock.Lock() + defer rocketAuctionManagerLock.Unlock() + return rp.GetContract("rocketAuctionManager") +} + From ceabe5e64a6e16584d40676ec3cccb70badaebb3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 16:28:00 +1000 Subject: [PATCH 190/878] implementing auctions module --- auction/auction.go | 189 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index 3c73c390b..75efd0acc 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -54,6 +55,194 @@ func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi } +// Get the number of lots for auction +func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotCount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotCount, "getLotCount"); err != nil { + return 0, fmt.Errorf("Could not get lot count: %w", err) + } + return (*lotCount).Uint64(), nil +} + + +// Lot details +func GetLotExists(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotExists := new(bool) + if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists"); err != nil { + return false, fmt.Errorf("Could not get lot exists status: %w", err) + } + return *lotExists, nil +} +func GetLotStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotStartBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock"); err != nil { + return 0, fmt.Errorf("Could not get lot start block: %w", err) + } + return (*lotStartBlock).Uint64(), nil +} +func GetLotEndBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotEndBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock"); err != nil { + return 0, fmt.Errorf("Could not get lot end block: %w", err) + } + return (*lotEndBlock).Uint64(), nil +} +func GetLotStartPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotStartPrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice"); err != nil { + return nil, fmt.Errorf("Could not get lot start price: %w", err) + } + return *lotStartPrice, nil +} +func GetLotReservePrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotReservePrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice"); err != nil { + return nil, fmt.Errorf("Could not get lot reserve price: %w", err) + } + return *lotReservePrice, nil +} +func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotTotalRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount"); err != nil { + return nil, fmt.Errorf("Could not get lot total RPL amount: %w", err) + } + return *lotTotalRplAmount, nil +} +func GetLotTotalBidAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotTotalBidAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount"); err != nil { + return nil, fmt.Errorf("Could not get lot total ETH bid amount: %w", err) + } + return *lotTotalBidAmount, nil +} +func GetLotRPLRecovered(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotRplRecovered := new(bool) + if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered"); err != nil { + return false, fmt.Errorf("Could not get lot RPL recovered status: %w", err) + } + return *lotRplRecovered, nil +} +func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceByTotalBids := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids"); err != nil { + return nil, fmt.Errorf("Could not get lot price by total bids: %w", err) + } + return *lotPriceByTotalBids, nil +} +func GetLotCurrentPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotCurrentPrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice"); err != nil { + return nil, fmt.Errorf("Could not get lot current price: %w", err) + } + return *lotCurrentPrice, nil +} +func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotClaimedRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount"); err != nil { + return nil, fmt.Errorf("Could not get lot claimed RPL amount: %w", err) + } + return *lotClaimedRplAmount, nil +} +func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotRemainingRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount"); err != nil { + return nil, fmt.Errorf("Could not get lot remaining RPL amount: %w", err) + } + return *lotRemainingRplAmount, nil +} +func GetLotIsCleared(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotIsCleared := new(bool) + if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared"); err != nil { + return false, fmt.Errorf("Could not get lot cleared status: %w", err) + } + return *lotIsCleared, nil +} + + +// Get the ETH amount bid on a lot by an address +func GetLotAddressBidAmount(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lot := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", bidder); err != nil { + return nil, fmt.Errorf("Could not get lot address ETH bid amount: %w", err) + } + return *lot, nil +} + + +// Get the price of a lot at a specific block +func GetLotPriceAtBlock(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceAtBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(blockNumber))); err != nil { + return nil, fmt.Errorf("Could not get lot price at block: %w", err) + } + return *lotPriceAtBlock, nil +} + + // Get contracts var rocketAuctionManagerLock sync.Mutex func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 11043d8afa3847325d7ff905aa704c56219e4426 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 16:41:52 +1000 Subject: [PATCH 191/878] implementing auctions module --- auction/auction.go | 146 +++++++++++++++++++++++++++++++-------------- 1 file changed, 101 insertions(+), 45 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 75efd0acc..1a67cfaa0 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -70,179 +70,235 @@ func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) // Lot details -func GetLotExists(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +func GetLotExists(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return false, err } lotExists := new(bool) - if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists"); err != nil { - return false, fmt.Errorf("Could not get lot exists status: %w", err) + if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d exists status: %w", lotIndex, err) } return *lotExists, nil } -func GetLotStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetLotStartBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return 0, err } lotStartBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get lot start block: %w", err) + if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock", big.NewInt(int64(lotIndex))); err != nil { + return 0, fmt.Errorf("Could not get lot %d start block: %w", lotIndex, err) } return (*lotStartBlock).Uint64(), nil } -func GetLotEndBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetLotEndBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return 0, err } lotEndBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock"); err != nil { - return 0, fmt.Errorf("Could not get lot end block: %w", err) + if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock", big.NewInt(int64(lotIndex))); err != nil { + return 0, fmt.Errorf("Could not get lot %d end block: %w", lotIndex, err) } return (*lotEndBlock).Uint64(), nil } -func GetLotStartPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotStartPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotStartPrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice"); err != nil { - return nil, fmt.Errorf("Could not get lot start price: %w", err) + if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d start price: %w", lotIndex, err) } return *lotStartPrice, nil } -func GetLotReservePrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotReservePrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotReservePrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice"); err != nil { - return nil, fmt.Errorf("Could not get lot reserve price: %w", err) + if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d reserve price: %w", lotIndex, err) } return *lotReservePrice, nil } -func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotTotalRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount"); err != nil { - return nil, fmt.Errorf("Could not get lot total RPL amount: %w", err) + if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d total RPL amount: %w", lotIndex, err) } return *lotTotalRplAmount, nil } -func GetLotTotalBidAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotTotalBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotTotalBidAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount"); err != nil { - return nil, fmt.Errorf("Could not get lot total ETH bid amount: %w", err) + if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d total ETH bid amount: %w", lotIndex, err) } return *lotTotalBidAmount, nil } -func GetLotRPLRecovered(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return false, err } lotRplRecovered := new(bool) - if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered"); err != nil { - return false, fmt.Errorf("Could not get lot RPL recovered status: %w", err) + if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d RPL recovered status: %w", lotIndex, err) } return *lotRplRecovered, nil } -func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotPriceByTotalBids := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids"); err != nil { - return nil, fmt.Errorf("Could not get lot price by total bids: %w", err) + if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price by total bids: %w", lotIndex, err) } return *lotPriceByTotalBids, nil } -func GetLotCurrentPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotCurrentPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotCurrentPrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice"); err != nil { - return nil, fmt.Errorf("Could not get lot current price: %w", err) + if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d current price: %w", lotIndex, err) } return *lotCurrentPrice, nil } -func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotClaimedRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount"); err != nil { - return nil, fmt.Errorf("Could not get lot claimed RPL amount: %w", err) + if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d claimed RPL amount: %w", lotIndex, err) } return *lotClaimedRplAmount, nil } -func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotRemainingRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount"); err != nil { - return nil, fmt.Errorf("Could not get lot remaining RPL amount: %w", err) + if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d remaining RPL amount: %w", lotIndex, err) } return *lotRemainingRplAmount, nil } -func GetLotIsCleared(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return false, err } lotIsCleared := new(bool) - if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared"); err != nil { - return false, fmt.Errorf("Could not get lot cleared status: %w", err) + if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d cleared status: %w", lotIndex, err) } return *lotIsCleared, nil } // Get the ETH amount bid on a lot by an address -func GetLotAddressBidAmount(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { +func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lot := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", bidder); err != nil { - return nil, fmt.Errorf("Could not get lot address ETH bid amount: %w", err) + if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { + return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) } return *lot, nil } // Get the price of a lot at a specific block -func GetLotPriceAtBlock(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { +func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } lotPriceAtBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(blockNumber))); err != nil { - return nil, fmt.Errorf("Could not get lot price at block: %w", err) + if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) } return *lotPriceAtBlock, nil } +// Create a new lot +func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketAuctionManager.Transact(opts, "createLot") + if err != nil { + return nil, fmt.Errorf("Could not create lot: %w", err) + } + return txReceipt, nil +} + + +// Place a bid on a lot +func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) + if err != nil { + return nil, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) + } + return txReceipt, nil +} + + +// Claim RPL from a lot that was bid on +func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) + if err != nil { + return nil, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) + } + return txReceipt, nil +} + + +// Recover unclaimed RPL from a lot +func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) + if err != nil { + return nil, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) + } + return txReceipt, nil +} + + // Get contracts var rocketAuctionManagerLock sync.Mutex func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From a15a223e8e176d173cf13b54dfa5d41839c8e204 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 16:57:16 +1000 Subject: [PATCH 192/878] implementing auctions module --- auction/auction.go | 134 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index 1a67cfaa0..973ba3193 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -8,11 +8,145 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Settings +const LotDetailsBatchSize = 10 + + +// Lot details +type LotDetails struct { + Exists bool `json:"exists"` + StartBlock uint64 `json:"startBlock"` + EndBlock uint64 `json:"endBlock"` + StartPrice *big.Int `json:"startPrice"` + ReservePrice *big.Int `json:"reservePrice"` + PriceByTotalBids *big.Int `json:"priceByTotalBids"` + CurrentPrice *big.Int `json:"currentPrice"` + TotalRPLAmount *big.Int `json:"totalRplAmount"` + ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` + RemainingRPLAmount *big.Int `json:"remainingRplAmount"` + TotalBidAmount *big.Int `json:"totalBidAmount"` + Cleared bool `json:"cleared"` + RPLRecovered bool `json:"rplRecovered"` +} + + +// Get a lot's details +func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (LotDetails, error) { + + // Data + var wg errgroup.Group + var exists bool + var startBlock uint64 + var endBlock uint64 + var startPrice *big.Int + var reservePrice *big.Int + var priceByTotalBids *big.Int + var currentPrice *big.Int + var totalRplAmount *big.Int + var claimedRplAmount *big.Int + var remainingRplAmount *big.Int + var totalBidAmount *big.Int + var cleared bool + var rplRecovered bool + + // Load data + wg.Go(func() error { + var err error + exists, err = GetLotExists(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + startBlock, err = GetLotStartBlock(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + endBlock, err = GetLotEndBlock(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + startPrice, err = GetLotStartPrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + reservePrice, err = GetLotReservePrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + priceByTotalBids, err = GetLotPriceByTotalBids(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + currentPrice, err = GetLotCurrentPrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + totalRplAmount, err = GetLotTotalRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + claimedRplAmount, err = GetLotClaimedRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + remainingRplAmount, err = GetLotRemainingRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + totalBidAmount, err = GetLotTotalBidAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + cleared, err = GetLotIsCleared(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + rplRecovered, err = GetLotRPLRecovered(rp, lotIndex, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return LotDetails{}, err + } + + // Return + return LotDetails{ + Exists: exists, + StartBlock: startBlock, + EndBlock: endBlock, + StartPrice: startPrice, + ReservePrice: reservePrice, + PriceByTotalBids: priceByTotalBids, + CurrentPrice: currentPrice, + TotalRPLAmount: totalRplAmount, + ClaimedRPLAmount: claimedRplAmount, + RemainingRPLAmount: remainingRplAmount, + TotalBidAmount: totalBidAmount, + Cleared: cleared, + RPLRecovered: rplRecovered, + }, nil + +} + + // Get the total RPL balance of the auction contract func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) From 930b537ef9ec2d039464eccaea21a21d559ca9be Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 16:58:51 +1000 Subject: [PATCH 193/878] implementing auctions module --- auction/auction.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 973ba3193..5cf356e17 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -349,31 +349,31 @@ func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Call } -// Get the ETH amount bid on a lot by an address -func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { +// Get the price of a lot at a specific block +func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } - lot := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { - return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) + lotPriceAtBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) } - return *lot, nil + return *lotPriceAtBlock, nil } -// Get the price of a lot at a specific block -func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { +// Get the ETH amount bid on a lot by an address +func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { return nil, err } - lotPriceAtBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) + lot := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { + return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) } - return *lotPriceAtBlock, nil + return *lot, nil } From d20b463eaf08569594d98e08eb267f6493c35082 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 5 Feb 2021 17:04:58 +1000 Subject: [PATCH 194/878] implementing auctions module --- auction/auction.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index 5cf356e17..50961b78b 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -36,6 +36,46 @@ type LotDetails struct { } +// Get all lot details +func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, error) { + + // Get lot count + lotCount, err := GetLotCount(rp, opts) + if err != nil { + return []LotDetails{}, err + } + + // Load lot details in batches + details := make([]LotDetails, lotCount) + for bsi := 0; bsi < lotCount; bsi += LotDetailsBatchSize { + + // Get batch start & end index + lsi := bsi + lei := bsi + LotDetailsBatchSize + if lei > lotCount { lei = lotCount } + + // Load details + var wg errgroup.Group + for li := lsi; li < lei; li++ { + li := li + wg.Go(func() error { + lotDetails, err := GetLotDetails(rp, li, opts) + if err == nil { details[li] = lotDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []LotDetails{}, err + } + + } + + // Return + return details, nil + +} + + // Get a lot's details func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (LotDetails, error) { From d5451c7f0c44e34a52f307455e58167ac85142d5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Sun, 7 Feb 2021 17:00:24 +1000 Subject: [PATCH 195/878] implementing rewards module --- rewards/rewards.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 rewards/rewards.go diff --git a/rewards/rewards.go b/rewards/rewards.go new file mode 100644 index 000000000..3a7b2dae8 --- /dev/null +++ b/rewards/rewards.go @@ -0,0 +1,64 @@ +package rewards + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Get whether a claims contract is enabled +func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { + enabled := new(bool) + if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { + return nil, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) + } + return *enabled, nil +} + + +// Get whether a claimer can make a claim +func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { + claimPossible := new(bool) + if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { + return nil, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimPossible, nil +} + + +// Get the percentage of rewards available for a claimer +func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { + claimRewardsPerc := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { + return nil, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return eth.WeiToEth(*claimRewardsPerc), nil +} + + +// Get the total amount of rewards available for a claimer +func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + claimRewardsAmount := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { + return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimRewardsAmount, nil +} + + +// Claim rewards +func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := claimsContract.Transact(opts, "claim") + if err != nil { + return nil, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) + } + return txReceipt, nil +} + From 6042c8185a4e8c6c0dc7d9cf38770529d12ef48f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Sun, 7 Feb 2021 17:13:06 +1000 Subject: [PATCH 196/878] implementing rewards module --- rewards/node.go | 72 +++++++++++++++++++++++++++++++++++++++++ rewards/rewards.go | 6 ++-- rewards/trusted-node.go | 72 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 rewards/node.go create mode 100644 rewards/trusted-node.go diff --git a/rewards/node.go b/rewards/node.go new file mode 100644 index 000000000..a8f1ef96c --- /dev/null +++ b/rewards/node.go @@ -0,0 +1,72 @@ +package rewards + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get whether node reward claims are enabled +func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return false, err + } + return getEnabled(rocketClaimNode, "node", opts) +} + + +// Get whether a node rewards claimer can claim +func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return false, err + } + return getClaimPossible(rocketClaimNode, "node", claimerAddress, opts) +} + + +// Get the percentage of rewards available for a node rewards claimer +func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return 0, err + } + return getClaimRewardsPerc(rocketClaimNode, "node", claimerAddress, opts) +} + + +// Get the total amount of rewards available for a node rewards claimer +func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + return getClaimRewardsAmount(rocketClaimNode, "node", claimerAddress, opts) +} + + +// Claim node rewards +func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + return claim(rocketClaimNode, "node", opts) +} + + +// Get contracts +var rocketClaimNodeLock sync.Mutex +func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketClaimNodeLock.Lock() + defer rocketClaimNodeLock.Unlock() + return rp.GetContract("rocketClaimNode") +} + diff --git a/rewards/rewards.go b/rewards/rewards.go index 3a7b2dae8..5346c0dd6 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -17,7 +17,7 @@ import ( func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { enabled := new(bool) if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { - return nil, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) + return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) } return *enabled, nil } @@ -27,7 +27,7 @@ func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bi func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { claimPossible := new(bool) if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { - return nil, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) + return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) } return *claimPossible, nil } @@ -37,7 +37,7 @@ func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, cl func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { claimRewardsPerc := new(*big.Int) if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { - return nil, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) + return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) } return eth.WeiToEth(*claimRewardsPerc), nil } diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go new file mode 100644 index 000000000..1a4027baa --- /dev/null +++ b/rewards/trusted-node.go @@ -0,0 +1,72 @@ +package rewards + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get whether trusted node reward claims are enabled +func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return false, err + } + return getEnabled(rocketClaimTrustedNode, "trusted node", opts) +} + + +// Get whether a trusted node rewards claimer can claim +func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return false, err + } + return getClaimPossible(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) +} + + +// Get the percentage of rewards available for a trusted node rewards claimer +func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return 0, err + } + return getClaimRewardsPerc(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) +} + + +// Get the total amount of rewards available for a trusted node rewards claimer +func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + return getClaimRewardsAmount(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) +} + + +// Claim trusted node rewards +func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + return claim(rocketClaimTrustedNode, "trusted node", opts) +} + + +// Get contracts +var rocketClaimTrustedNodeLock sync.Mutex +func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketClaimTrustedNodeLock.Lock() + defer rocketClaimTrustedNodeLock.Unlock() + return rp.GetContract("rocketClaimTrustedNode") +} + From b011d2715fe96231c6d9c0d27f4d54f59dc27be7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 10:48:25 +1000 Subject: [PATCH 197/878] updating auctions module --- auction/auction.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index 50961b78b..c981c8138 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -31,11 +31,52 @@ type LotDetails struct { ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` RemainingRPLAmount *big.Int `json:"remainingRplAmount"` TotalBidAmount *big.Int `json:"totalBidAmount"` + AddressBidAmount *big.Int `json:"addressBidAmount"` Cleared bool `json:"cleared"` RPLRecovered bool `json:"rplRecovered"` } +// Get all lot details with bids +func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) ([]LotDetails, error) { + + // Get lot count + lotCount, err := GetLotCount(rp, opts) + if err != nil { + return []LotDetails{}, err + } + + // Load lot details in batches + details := make([]LotDetails, lotCount) + for bsi := 0; bsi < lotCount; bsi += LotDetailsBatchSize { + + // Get batch start & end index + lsi := bsi + lei := bsi + LotDetailsBatchSize + if lei > lotCount { lei = lotCount } + + // Load details + var wg errgroup.Group + for li := lsi; li < lei; li++ { + li := li + wg.Go(func() error { + lotDetails, err := GetLotDetailsWithBids(rp, li, bidder, opts) + if err == nil { details[li] = lotDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []LotDetails{}, err + } + + } + + // Return + return details, nil + +} + + // Get all lot details func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, error) { @@ -76,6 +117,38 @@ func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, erro } +// Get a lot's details with address bid amounts +func GetLotDetailsWithBids(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (LotDetails, error) { + + // Data + var wg errgroup.Group + var details LotDetails + var addressBidAmount *big.Int + + // Load data + wg.Go(func() error { + var err error + details, err = GetLotDetails(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + addressBidAmount, err = GetLotAddressBidAmount(rp, lotIndex, bidder, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return LotDetails{}, err + } + + // Return + details.AddressBidAmount = addressBidAmount + return details, nil + +} + + // Get a lot's details func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (LotDetails, error) { From ca5b02b932c9b259ecb5ccdee0ee21fa67571bf7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 10:54:39 +1000 Subject: [PATCH 198/878] updating node module --- node/node.go | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/node/node.go b/node/node.go index d49aa19dc..3d2f589a7 100644 --- a/node/node.go +++ b/node/node.go @@ -23,9 +23,10 @@ const ( // Node details type NodeDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - TimezoneLocation string `json:"timezoneLocation"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + WithdrawalAddress common.Address `json:"withdrawalAddress"` + TimezoneLocation string `json:"timezoneLocation"` } @@ -116,6 +117,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Data var wg errgroup.Group var exists bool + var withdrawalAddress common.Address var timezoneLocation string // Load data @@ -124,6 +126,11 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts exists, err = GetNodeExists(rp, nodeAddress, opts) return err }) + wg.Go(func() error { + var err error + withdrawalAddress, err = GetNodeWithdrawalAddress(rp, nodeAddress, opts) + return err + }) wg.Go(func() error { var err error timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) @@ -139,6 +146,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts return NodeDetails{ Address: nodeAddress, Exists: exists, + WithdrawalAddress: withdrawalAddress, TimezoneLocation: timezoneLocation, }, nil @@ -187,6 +195,20 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * } +// Get a node's withdrawal address +func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return "", err + } + withdrawalAddress := new(common.Address) + if err := rocketNodeManager.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { + return "", fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) + } + return *withdrawalAddress, nil +} + + // Get a node's timezone location func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -215,6 +237,20 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } +// Set a node's withdrawal address +func SetWithdrawalAddress(rp *rocketpool.RocketPool, withdrawalAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", withdrawalAddress) + if err != nil { + return nil, fmt.Errorf("Could not set node withdrawal address: %w", err) + } + return txReceipt, nil +} + + // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNodeManager, err := getRocketNodeManager(rp) From 517ef897798f1fa5a3b7ab974a552b481f1885f9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 11:48:03 +1000 Subject: [PATCH 199/878] minor documentation update --- rewards/rewards.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 5346c0dd6..33bd94956 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -24,6 +24,7 @@ func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bi // Get whether a claimer can make a claim +// Use to check whether a claimer is able to make claims at all func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { claimPossible := new(bool) if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { @@ -33,7 +34,7 @@ func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, cl } -// Get the percentage of rewards available for a claimer +// Get the percentage of rewards available to a claimer func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { claimRewardsPerc := new(*big.Int) if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { @@ -43,7 +44,8 @@ func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, } -// Get the total amount of rewards available for a claimer +// Get the total amount of rewards available to a claimer +// Use to check whether a claimer is able to make a claim for the current interval (returns zero if unable) func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { claimRewardsAmount := new(*big.Int) if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { From dfcdbf804903117b829917e7662902db49248a92 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 12:16:34 +1000 Subject: [PATCH 200/878] updating DAO & settings modules --- {settings => dao/protocol}/dao.go | 8 ++++---- settings/auction.go | 15 ++++++++------- settings/deposit.go | 11 ++++++----- settings/inflation.go | 7 ++++--- settings/minipool.go | 7 ++++--- settings/network.go | 23 ++++++++++++----------- settings/node.go | 9 +++++---- settings/rewards.go | 5 +++-- 8 files changed, 46 insertions(+), 39 deletions(-) rename {settings => dao/protocol}/dao.go (90%) diff --git a/settings/dao.go b/dao/protocol/dao.go similarity index 90% rename from settings/dao.go rename to dao/protocol/dao.go index 6516325fc..7d1def545 100644 --- a/settings/dao.go +++ b/dao/protocol/dao.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" @@ -14,7 +14,7 @@ import ( // Bootstrap a bool setting -func bootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { return nil, err @@ -28,7 +28,7 @@ func bootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, // Bootstrap a uint256 setting -func bootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { return nil, err @@ -42,7 +42,7 @@ func bootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, // Bootstrap a rewards claimer -func bootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { return nil, err diff --git a/settings/auction.go b/settings/auction.go index 6a7a4ed99..b5b483181 100644 --- a/settings/auction.go +++ b/settings/auction.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -30,7 +31,7 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, return *value, nil } func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) + return protocol.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) } @@ -47,7 +48,7 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e return *value, nil } func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) + return protocol.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) } @@ -64,7 +65,7 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) + return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) } @@ -81,7 +82,7 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) + return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) } @@ -98,7 +99,7 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err return (*value).Uint64(), nil } func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) } @@ -115,7 +116,7 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f return eth.WeiToEth(*value), nil } func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) } @@ -132,7 +133,7 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl return eth.WeiToEth(*value), nil } func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) } diff --git a/settings/deposit.go b/settings/deposit.go index 7756a8965..ec6d3ab16 100644 --- a/settings/deposit.go +++ b/settings/deposit.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -29,7 +30,7 @@ func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, er return *value, nil } func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) + return protocol.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) } @@ -46,7 +47,7 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b return *value, nil } func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) + return protocol.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) } @@ -63,7 +64,7 @@ func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int return *value, nil } func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) + return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) } @@ -80,7 +81,7 @@ func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( return *value, nil } func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) + return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) } @@ -97,7 +98,7 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts return (*value).Uint64(), nil } func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) } diff --git a/settings/inflation.go b/settings/inflation.go index 6adaffe76..00736a836 100644 --- a/settings/inflation.go +++ b/settings/inflation.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -30,7 +31,7 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f return eth.WeiToEth(*value), nil } func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) } @@ -47,7 +48,7 @@ func GetInflationIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) } @@ -64,7 +65,7 @@ func GetInflationStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin return (*value).Uint64(), nil } func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) } diff --git a/settings/minipool.go b/settings/minipool.go index 871b0b4e4..ad61eda3f 100644 --- a/settings/minipool.go +++ b/settings/minipool.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -115,7 +116,7 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. return *value, nil } func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) + return protocol.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) } @@ -132,7 +133,7 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u return (*value).Uint64(), nil } func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) } @@ -149,7 +150,7 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) } diff --git a/settings/network.go b/settings/network.go index 367dd2bc9..013eef10c 100644 --- a/settings/network.go +++ b/settings/network.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -30,7 +31,7 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( return eth.WeiToEth(*value), nil } func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) } @@ -47,7 +48,7 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b return *value, nil } func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) + return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) } @@ -64,7 +65,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) } @@ -81,7 +82,7 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo return *value, nil } func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) + return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) } @@ -98,7 +99,7 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u return (*value).Uint64(), nil } func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) } @@ -115,7 +116,7 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts return *value, nil } func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) + return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) } @@ -132,7 +133,7 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) } @@ -149,7 +150,7 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) } @@ -166,7 +167,7 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) } @@ -183,7 +184,7 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) } @@ -200,7 +201,7 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) } diff --git a/settings/node.go b/settings/node.go index 7b1ec3ae5..40faa3214 100644 --- a/settings/node.go +++ b/settings/node.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -30,7 +31,7 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) return *value, nil } func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) + return protocol.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) } @@ -47,7 +48,7 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool return *value, nil } func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) + return protocol.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } @@ -64,7 +65,7 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } @@ -81,7 +82,7 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) + return protocol.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } diff --git a/settings/rewards.go b/settings/rewards.go index 7b4e6fe66..f99467069 100644 --- a/settings/rewards.go +++ b/settings/rewards.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -61,7 +62,7 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) // Bootstrap a rewards claimer amount func BootstrapRewardsClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapClaimer(rp, contractName, amount, opts); + return protocol.BootstrapClaimer(rp, contractName, amount, opts); } @@ -78,7 +79,7 @@ func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpt return (*value).Uint64(), nil } func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return bootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) + return protocol.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) } From ad490b9c80e5ae871291d14515d26f7449d5ad7b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 12:33:44 +1000 Subject: [PATCH 201/878] updating DAO & settings modules --- dao/protocol/dao.go | 6 ++-- dao/trustednode/dao.go | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 dao/trustednode/dao.go diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 7d1def545..5ec96a9b3 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -21,7 +21,7 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, } txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap setting %s.%s: %w", contractName, settingPath, err) + return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } return txReceipt, nil } @@ -35,7 +35,7 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, } txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap setting %s.%s: %w", contractName, settingPath, err) + return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } return txReceipt, nil } @@ -49,7 +49,7 @@ func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount flo } txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) if err != nil { - return nil, fmt.Errorf("Could not bootstrap claimer %s: %w", contractName, err) + return nil, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) } return txReceipt, nil } diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go new file mode 100644 index 000000000..f9237cd44 --- /dev/null +++ b/dao/trustednode/dao.go @@ -0,0 +1,65 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Bootstrap a bool setting +func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + } + return txReceipt, nil +} + + +// Bootstrap a uint256 setting +func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + } + return txReceipt, nil +} + + +// Bootstrap a DAO member +func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, email, nodeAddress) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketDAONodeTrustedLock sync.Mutex +func getRocketDAONodeTrusted(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAONodeTrustedLock.Lock() + defer rocketDAONodeTrustedLock.Unlock() + return rp.GetContract("rocketDAONodeTrusted") +} + From c84f0842f4d926fe3d24d94306d2e372bb83950a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 12:37:20 +1000 Subject: [PATCH 202/878] updating DAO & settings modules --- settings/rewards.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/settings/rewards.go b/settings/rewards.go index f99467069..4fb4357c0 100644 --- a/settings/rewards.go +++ b/settings/rewards.go @@ -60,12 +60,6 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) } -// Bootstrap a rewards claimer amount -func BootstrapRewardsClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapClaimer(rp, contractName, amount, opts); -} - - // Rewards claim interval in blocks func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp) From 41f947e4ab6bf8c6e4155bb98ba97b355938741b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 12:42:36 +1000 Subject: [PATCH 203/878] updating DAO & settings modules --- settings/{ => protocol}/auction.go | 2 +- settings/{ => protocol}/deposit.go | 2 +- settings/{ => protocol}/inflation.go | 2 +- settings/{ => protocol}/minipool.go | 2 +- settings/{ => protocol}/network.go | 2 +- settings/{ => protocol}/node.go | 2 +- settings/{ => protocol}/rewards.go | 2 +- tests/deposit/deposit_test.go | 6 ++--- tests/minipool/contract_test.go | 8 +++--- tests/network/fees_test.go | 10 ++++---- tests/settings/deposit_test.go | 22 ++++++++-------- tests/settings/minipool_test.go | 28 ++++++++++---------- tests/settings/network_test.go | 38 ++++++++++++++-------------- tests/settings/node_test.go | 10 ++++---- tests/testutils/tokens/neth.go | 8 +++--- 15 files changed, 72 insertions(+), 72 deletions(-) rename settings/{ => protocol}/auction.go (99%) rename settings/{ => protocol}/deposit.go (99%) rename settings/{ => protocol}/inflation.go (99%) rename settings/{ => protocol}/minipool.go (99%) rename settings/{ => protocol}/network.go (99%) rename settings/{ => protocol}/node.go (99%) rename settings/{ => protocol}/rewards.go (99%) diff --git a/settings/auction.go b/settings/protocol/auction.go similarity index 99% rename from settings/auction.go rename to settings/protocol/auction.go index b5b483181..d11505b02 100644 --- a/settings/auction.go +++ b/settings/protocol/auction.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/deposit.go b/settings/protocol/deposit.go similarity index 99% rename from settings/deposit.go rename to settings/protocol/deposit.go index ec6d3ab16..69580f4e3 100644 --- a/settings/deposit.go +++ b/settings/protocol/deposit.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/inflation.go b/settings/protocol/inflation.go similarity index 99% rename from settings/inflation.go rename to settings/protocol/inflation.go index 00736a836..510c599b5 100644 --- a/settings/inflation.go +++ b/settings/protocol/inflation.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/minipool.go b/settings/protocol/minipool.go similarity index 99% rename from settings/minipool.go rename to settings/protocol/minipool.go index ad61eda3f..bc2b62e77 100644 --- a/settings/minipool.go +++ b/settings/protocol/minipool.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/network.go b/settings/protocol/network.go similarity index 99% rename from settings/network.go rename to settings/protocol/network.go index 013eef10c..44fdef8a9 100644 --- a/settings/network.go +++ b/settings/protocol/network.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/node.go b/settings/protocol/node.go similarity index 99% rename from settings/node.go rename to settings/protocol/node.go index 40faa3214..06a65cf93 100644 --- a/settings/node.go +++ b/settings/protocol/node.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/settings/rewards.go b/settings/protocol/rewards.go similarity index 99% rename from settings/rewards.go rename to settings/protocol/rewards.go index 4fb4357c0..1a1f11cf5 100644 --- a/settings/rewards.go +++ b/settings/protocol/rewards.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "fmt" diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index e907082f0..6dbb796fa 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -5,7 +5,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -49,7 +49,7 @@ func TestAssignDeposits(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Disable deposit assignments - if _, err := settings.SetAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.SetAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Make user deposit userDepositOpts := userAccount.GetTransactor() @@ -65,7 +65,7 @@ func TestAssignDeposits(t *testing.T) { if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } // Re-enable deposit assignments - if _, err := settings.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 049c4cb40..c070eb2ca 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -8,7 +8,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -213,9 +213,9 @@ func TestWithdraw(t *testing.T) { } // Disable minipool withdrawal delay - withdrawalDelay, err := settings.GetMinipoolWithdrawalDelay(rp, nil) + withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) if err != nil { t.Fatal(err) } - if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Withdraw minipool if _, err := mp.Withdraw(nodeAccount.GetTransactor()); err != nil { @@ -223,7 +223,7 @@ func TestWithdraw(t *testing.T) { } // Re-enable minipool withdrawal delay - if _, err := settings.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated minipool exists status if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { diff --git a/tests/network/fees_test.go b/tests/network/fees_test.go index 6e2409bb4..e051f46d1 100644 --- a/tests/network/fees_test.go +++ b/tests/network/fees_test.go @@ -6,7 +6,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -19,13 +19,13 @@ func TestNodeFee(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Get settings - targetNodeFee, err := settings.GetTargetNodeFee(rp, nil) + targetNodeFee, err := protocol.GetTargetNodeFee(rp, nil) if err != nil { t.Fatal(err) } - minNodeFee, err := settings.GetMinimumNodeFee(rp, nil) + minNodeFee, err := protocol.GetMinimumNodeFee(rp, nil) if err != nil { t.Fatal(err) } - maxNodeFee, err := settings.GetMaximumNodeFee(rp, nil) + maxNodeFee, err := protocol.GetMaximumNodeFee(rp, nil) if err != nil { t.Fatal(err) } - demandRange, err := settings.GetNodeFeeDemandRange(rp, nil) + demandRange, err := protocol.GetNodeFeeDemandRange(rp, nil) if err != nil { t.Fatal(err) } // Get & check initial node demand diff --git a/tests/settings/deposit_test.go b/tests/settings/deposit_test.go index 505e7f0ad..065d8b35c 100644 --- a/tests/settings/deposit_test.go +++ b/tests/settings/deposit_test.go @@ -3,7 +3,7 @@ package settings import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -18,9 +18,9 @@ func TestDepositSettings(t *testing.T) { // Set & get deposits enabled depositEnabled := false - if _, err := settings.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetDepositEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetDepositEnabled(rp, nil); err != nil { t.Error(err) } else if value != depositEnabled { t.Error("Incorrect deposit enabled value") @@ -28,9 +28,9 @@ func TestDepositSettings(t *testing.T) { // Set & get deposit assignments enabled assignDepositsEnabled := false - if _, err := settings.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetAssignDepositsEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetAssignDepositsEnabled(rp, nil); err != nil { t.Error(err) } else if value != assignDepositsEnabled { t.Error("Incorrect assign deposits enabled value") @@ -38,9 +38,9 @@ func TestDepositSettings(t *testing.T) { // Set & get minimum deposit amount minimumDeposit := eth.EthToWei(1000) - if _, err := settings.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMinimumDeposit(rp, nil); err != nil { + } else if value, err := protocol.GetMinimumDeposit(rp, nil); err != nil { t.Error(err) } else if value.Cmp(minimumDeposit) != 0 { t.Error("Incorrect minimum deposit value") @@ -48,9 +48,9 @@ func TestDepositSettings(t *testing.T) { // Set & get maximum deposit pool size maximumDepositPoolSize := eth.EthToWei(1) - if _, err := settings.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMaximumDepositPoolSize(rp, nil); err != nil { + } else if value, err := protocol.GetMaximumDepositPoolSize(rp, nil); err != nil { t.Error(err) } else if value.Cmp(maximumDepositPoolSize) != 0 { t.Error("Incorrect maximum deposit pool size value") @@ -58,9 +58,9 @@ func TestDepositSettings(t *testing.T) { // Set & get maximum deposit assignments var maximumDepositAssignments uint64 = 50 - if _, err := settings.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMaximumDepositAssignments(rp, nil); err != nil { + } else if value, err := protocol.GetMaximumDepositAssignments(rp, nil); err != nil { t.Error(err) } else if value != maximumDepositAssignments { t.Error("Incorrect maximum deposit assignments value") diff --git a/tests/settings/minipool_test.go b/tests/settings/minipool_test.go index e379a6770..ed70389ba 100644 --- a/tests/settings/minipool_test.go +++ b/tests/settings/minipool_test.go @@ -3,7 +3,7 @@ package settings import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -20,37 +20,37 @@ func TestMinipoolSettings(t *testing.T) { fullMinipoolBalance := eth.EthToWei(32) halfMinipoolBalance := eth.EthToWei(16) emptyMinipoolBalance := eth.EthToWei(0) - if value, err := settings.GetMinipoolLaunchBalance(rp, nil); err != nil { + if value, err := protocol.GetMinipoolLaunchBalance(rp, nil); err != nil { t.Error(err) } else if value.Cmp(fullMinipoolBalance) != 0 { t.Error("Incorrect minipool launch balance") } - if value, err := settings.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(fullMinipoolBalance) != 0 { t.Error("Incorrect minipool full deposit node amount") } - if value, err := settings.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(halfMinipoolBalance) != 0 { t.Error("Incorrect minipool half deposit node amount") } - if value, err := settings.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(emptyMinipoolBalance) != 0 { t.Error("Incorrect minipool empty deposit node amount") } - if value, err := settings.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(halfMinipoolBalance) != 0 { t.Error("Incorrect minipool full deposit user amount") } - if value, err := settings.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(halfMinipoolBalance) != 0 { t.Error("Incorrect minipool half deposit user amount") } - if value, err := settings.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { + if value, err := protocol.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { t.Error(err) } else if value.Cmp(fullMinipoolBalance) != 0 { t.Error("Incorrect minipool empty deposit user amount") @@ -58,9 +58,9 @@ func TestMinipoolSettings(t *testing.T) { // Set & get submit withdrawable enabled submitWithdrawableEnabled := false - if _, err := settings.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { t.Error(err) } else if value != submitWithdrawableEnabled { t.Error("Incorrect minipool withdrawable submissions enabled value") @@ -68,9 +68,9 @@ func TestMinipoolSettings(t *testing.T) { // Set & get minipool launch timeout var minipoolLaunchTimeout uint64 = 5 - if _, err := settings.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMinipoolLaunchTimeout(rp, nil); err != nil { + } else if value, err := protocol.GetMinipoolLaunchTimeout(rp, nil); err != nil { t.Error(err) } else if value != minipoolLaunchTimeout { t.Error("Incorrect minipool launch timeout value") @@ -78,9 +78,9 @@ func TestMinipoolSettings(t *testing.T) { // Set & get minipool withdrawal delay var minipoolWithdrawalDelay uint64 = 5 - if _, err := settings.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMinipoolWithdrawalDelay(rp, nil); err != nil { + } else if value, err := protocol.GetMinipoolWithdrawalDelay(rp, nil); err != nil { t.Error(err) } else if value != minipoolWithdrawalDelay { t.Error("Incorrect minipool withdrawal delay value") diff --git a/tests/settings/network_test.go b/tests/settings/network_test.go index 5b77a8487..0eefbef3f 100644 --- a/tests/settings/network_test.go +++ b/tests/settings/network_test.go @@ -3,7 +3,7 @@ package settings import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -18,9 +18,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get node consensus threshold nodeConsensusThreshold := 0.1 - if _, err := settings.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetNodeConsensusThreshold(rp, nil); err != nil { + } else if value, err := protocol.GetNodeConsensusThreshold(rp, nil); err != nil { t.Error(err) } else if value != nodeConsensusThreshold { t.Error("Incorrect node consensus threshold value") @@ -28,9 +28,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get network balance submissions enabled submitBalancesEnabled := false - if _, err := settings.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetSubmitBalancesEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetSubmitBalancesEnabled(rp, nil); err != nil { t.Error(err) } else if value != submitBalancesEnabled { t.Error("Incorrect network balance submissions enabled value") @@ -38,9 +38,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get network balance submission frequency var submitBalancesFrequency uint64 = 10 - if _, err := settings.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetSubmitBalancesFrequency(rp, nil); err != nil { + } else if value, err := protocol.GetSubmitBalancesFrequency(rp, nil); err != nil { t.Error(err) } else if value != submitBalancesFrequency { t.Error("Incorrect network balance submission frequency value") @@ -48,9 +48,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get process withdrawals enabled processWithdrawalsEnabled := false - if _, err := settings.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetProcessWithdrawalsEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetProcessWithdrawalsEnabled(rp, nil); err != nil { t.Error(err) } else if value != processWithdrawalsEnabled { t.Error("Incorrect process withdrawals enabled value") @@ -58,9 +58,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get minimum node fee minimumNodeFee := 0.80 - if _, err := settings.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMinimumNodeFee(rp, nil); err != nil { + } else if value, err := protocol.GetMinimumNodeFee(rp, nil); err != nil { t.Error(err) } else if value != minimumNodeFee { t.Error("Incorrect minimum node fee value") @@ -68,9 +68,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get target node fee targetNodeFee := 0.85 - if _, err := settings.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetTargetNodeFee(rp, nil); err != nil { + } else if value, err := protocol.GetTargetNodeFee(rp, nil); err != nil { t.Error(err) } else if value != targetNodeFee { t.Error("Incorrect target node fee value") @@ -78,9 +78,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get maximum node fee maximumNodeFee := 0.90 - if _, err := settings.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetMaximumNodeFee(rp, nil); err != nil { + } else if value, err := protocol.GetMaximumNodeFee(rp, nil); err != nil { t.Error(err) } else if value != maximumNodeFee { t.Error("Incorrect maximum node fee value") @@ -88,9 +88,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get node fee demand range nodeFeeDemandRange := eth.EthToWei(10) - if _, err := settings.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetNodeFeeDemandRange(rp, nil); err != nil { + } else if value, err := protocol.GetNodeFeeDemandRange(rp, nil); err != nil { t.Error(err) } else if value.Cmp(nodeFeeDemandRange) != 0 { t.Error("Incorrect node fee demand range value") @@ -98,9 +98,9 @@ func TestNetworkSettings(t *testing.T) { // Set & get target rETH collateral rate targetRethCollateralRate := 0.95 - if _, err := settings.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetTargetRethCollateralRate(rp, nil); err != nil { + } else if value, err := protocol.GetTargetRethCollateralRate(rp, nil); err != nil { t.Error(err) } else if value != targetRethCollateralRate { t.Error("Incorrect target rETH collateral rate value") diff --git a/tests/settings/node_test.go b/tests/settings/node_test.go index e02e9187d..5ee10f551 100644 --- a/tests/settings/node_test.go +++ b/tests/settings/node_test.go @@ -3,7 +3,7 @@ package settings import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -17,9 +17,9 @@ func TestNodeSettings(t *testing.T) { // Set & get node registrations enabled nodeRegistrationsEnabled := false - if _, err := settings.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetNodeRegistrationEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetNodeRegistrationEnabled(rp, nil); err != nil { t.Error(err) } else if value != nodeRegistrationsEnabled { t.Error("Incorrect node registrations enabled value") @@ -27,9 +27,9 @@ func TestNodeSettings(t *testing.T) { // Set & get node deposits enabled nodeDepositsEnabled := false - if _, err := settings.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := settings.GetNodeDepositEnabled(rp, nil); err != nil { + } else if value, err := protocol.GetNodeDepositEnabled(rp, nil); err != nil { t.Error(err) } else if value != nodeDepositsEnabled { t.Error("Incorrect node deposits enabled value") diff --git a/tests/testutils/tokens/neth.go b/tests/testutils/tokens/neth.go index 23aed97e7..66214d5ee 100644 --- a/tests/testutils/tokens/neth.go +++ b/tests/testutils/tokens/neth.go @@ -6,7 +6,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -30,16 +30,16 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trusted if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return err } // Disable minipool withdrawal delay - withdrawalDelay, err := settings.GetMinipoolWithdrawalDelay(rp, nil) + withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) if err != nil { return err } - if _, err := settings.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := protocol.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } // Mark minipool as withdrawable and withdraw if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return err } if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } // Re-enable minipool withdrawal delay - if _, err := settings.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := protocol.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } // Return return nil From 0501750f357cb2d08a353e73bf8e4aba8916b45c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 13:00:36 +1000 Subject: [PATCH 204/878] updating DAO & settings modules --- settings/trustednode/members.go | 79 +++++++++++++++++++++++++++++++ settings/trustednode/proposals.go | 28 +++++++++++ 2 files changed, 107 insertions(+) create mode 100644 settings/trustednode/members.go create mode 100644 settings/trustednode/proposals.go diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go new file mode 100644 index 000000000..4eec284fe --- /dev/null +++ b/settings/trustednode/members.go @@ -0,0 +1,79 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Config +const MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" + + +// Member proposal quorum threshold +func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getQuorum"); err != nil { + return 0, fmt.Errorf("Could not get member quorum threshold: %w", err) + } + return eth.WeiToEth(*value), nil +} +func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.quorum", eth.EthToWei(value), opts) +} + + +// RPL bond required for a member +func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getRPLBond"); err != nil { + return nil, fmt.Errorf("Could not get member RPL bond amount: %w", err) + } + return *value, nil +} +func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.rplbond", value, opts) +} + + +// The maximum number of unbonded minipools a member can run +func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { + return nil, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) + } + return *value, nil +} +func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.minipool.unbonded.max", value, opts) +} + + +// Get contracts +var membersSettingsContractLock sync.Mutex +func getMembersSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + membersSettingsContractLock.Lock() + defer membersSettingsContractLock.Unlock() + return rp.GetContract(MembersSettingsContractName) +} + diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go new file mode 100644 index 000000000..8003ff34f --- /dev/null +++ b/settings/trustednode/proposals.go @@ -0,0 +1,28 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + + +// Config +const ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" + + +// Get contracts +var proposalsSettingsContractLock sync.Mutex +func getProposalsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + proposalsSettingsContractLock.Lock() + defer proposalsSettingsContractLock.Unlock() + return rp.GetContract(ProposalsSettingsContractName) +} + From 5e153ca2157f3187989be72000a844af7b5cf646 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 13:39:15 +1000 Subject: [PATCH 205/878] updating DAO & settings modules --- settings/trustednode/proposals.go | 86 ++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 8003ff34f..6f31e8d0b 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -10,7 +10,6 @@ import ( "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -18,6 +17,91 @@ import ( const ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" +// The cooldown period a member must wait after making a proposal before making another in blocks +func GetCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getCooldown"); err != nil { + return 0, fmt.Errorf("Could not get proposal cooldown period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.cooldown", big.NewInt(int64(value)), opts) +} + + +// The period a proposal can be voted on for in blocks +func GetVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteBlocks"); err != nil { + return 0, fmt.Errorf("Could not get proposal voting period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.vote.blocks", big.NewInt(int64(value)), opts) +} + + +// The delay after creation before a proposal can be voted on in blocks +func GetVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayBlocks"); err != nil { + return 0, fmt.Errorf("Could not get proposal voting delay: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.vote.delay.blocks", big.NewInt(int64(value)), opts) +} + + +// The period during which a passed proposal can be executed in blocks +func GetExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getExecuteBlocks"); err != nil { + return 0, fmt.Errorf("Could not get proposal execution period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.execute.blocks", big.NewInt(int64(value)), opts) +} + + +// The period during which an action can be performed on an executed proposal in blocks +func GetActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getActionBlocks"); err != nil { + return 0, fmt.Errorf("Could not get proposal action period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.action.blocks", big.NewInt(int64(value)), opts) +} + + // Get contracts var proposalsSettingsContractLock sync.Mutex func getProposalsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 011ec4c371ad32366481d727014c58d69d63e422 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 15:25:47 +1000 Subject: [PATCH 206/878] updating DAO & settings modules --- settings/trustednode/members.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 4eec284fe..881c01f8b 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -53,7 +53,7 @@ func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.Tran // The maximum number of unbonded minipools a member can run -func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { membersSettingsContract, err := getMembersSettingsContract(rp) if err != nil { return nil, err @@ -62,10 +62,10 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { return nil, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) } - return *value, nil + return (*value).Uint64(), nil } -func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.minipool.unbonded.max", value, opts) +func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.minipool.unbonded.max", big.NewInt(int64(value)), opts) } From b972486bafa7096e22377aa872a8c5cbab357724 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 15:38:00 +1000 Subject: [PATCH 207/878] updating DAO & settings modules --- dao/proposals.go | 183 +++++++++++++++++++++++++++++++++++++++++++++++ types/dao.go | 51 +++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 dao/proposals.go create mode 100644 types/dao.go diff --git a/dao/proposals.go b/dao/proposals.go new file mode 100644 index 000000000..baf6da26d --- /dev/null +++ b/dao/proposals.go @@ -0,0 +1,183 @@ +package dao + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + + +// Get the proposal count +func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + proposalCount := new(*big.Int) + if err := rocketDAOProposal.Call(opts, proposalCount, "getTotal"); err != nil { + return 0, fmt.Errorf("Could not get proposal count: %w", err) + } + return (*proposalCount).Uint64(), nil +} + + +// Proposal details +func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return "", err + } + daoName := new(string) + if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) + } + return *daoName, nil +} +func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return common.Address{}, err + } + proposerAddress := new(common.Address) + if err := rocketDAOProposal.Call(opts, proposerAddress, "getProposer", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) + } + return *proposerAddress, nil +} +func GetProposalCreatedBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + createdBlock := new(*big.Int) + if err := rocketDAOProposal.Call(opts, createdBlock, "getCreated", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d created block: %w", proposalId, err) + } + return (*createdBlock).Uint64(), nil +} +func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + startBlock := new(*big.Int) + if err := rocketDAOProposal.Call(opts, startBlock, "getStart", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d start block: %w", proposalId, err) + } + return (*startBlock).Uint64(), nil +} +func GetProposalEndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + endBlock := new(*big.Int) + if err := rocketDAOProposal.Call(opts, endBlock, "getEnd", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d end block: %w", proposalId, err) + } + return (*endBlock).Uint64(), nil +} +func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + expiryBlock := new(*big.Int) + if err := rocketDAOProposal.Call(opts, expiryBlock, "getExpires", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d expiry block: %w", proposalId, err) + } + return (*expiryBlock).Uint64(), nil +} +func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesRequired := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesRequired, "getVotesRequired", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes required: %w", proposalId, err) + } + return (*votesRequired).Uint64(), nil +} +func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesFor := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesFor, "getVotesFor", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes for: %w", proposalId, err) + } + return (*votesFor).Uint64(), nil +} +func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesAgainst := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesAgainst, "getVotesAgainst", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes against: %w", proposalId, err) + } + return (*votesAgainst).Uint64(), nil +} +func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + cancelled := new(bool) + if err := rocketDAOProposal.Call(opts, cancelled, "getCancelled", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) + } + return *cancelled, nil +} +func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + executed := new(bool) + if err := rocketDAOProposal.Call(opts, executed, "getExecuted", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) + } + return *executed, nil +} +func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return []byte{}, err + } + payload := new([]byte) + if err := rocketDAOProposal.Call(opts, payload, "getPayload", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) + } + return *payload, nil +} +func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (rptypes.ProposalState, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + state := new(uint8) + if err := rocketDAOProposal.Call(opts, state, "getState", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d state: %w", proposalId, err) + } + return rptypes.ProposalState(*state), nil +} + + +// Get contracts +var rocketDAOProposalLock sync.Mutex +func getRocketDAOProposal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAOProposalLock.Lock() + defer rocketDAOProposalLock.Unlock() + return rp.GetContract("rocketDAOProposal") +} + diff --git a/types/dao.go b/types/dao.go new file mode 100644 index 000000000..b5da9beb5 --- /dev/null +++ b/types/dao.go @@ -0,0 +1,51 @@ +package types + +import ( + "encoding/json" + "fmt" +) + + +// DAO proposal states +type ProposalState uint8 +const ( + Pending ProposalState = iota + Active + Cancelled + Defeated + Succeeded + Expired + Executed +) +var ProposalStates = []string{"Pending", "Active", "Cancelled", "Defeated", "Succeeded", "Expired", "Executed"} + + +// String conversion +func (s ProposalState) String() string { + if int(s) >= len(ProposalStates) { return "" } + return ProposalStates[s] +} +func StringToProposalState(value string) (ProposalState, error) { + for state, str := range ProposalStates { + if value == str { return ProposalState(state), nil } + } + return 0, fmt.Errorf("Invalid proposal state '%s'", value) +} + + +// JSON encoding +func (s ProposalState) MarshalJSON() ([]byte, error) { + str := s.String() + if str == "" { + return []byte{}, fmt.Errorf("Invalid proposal state '%d'", s) + } + return json.Marshal(str) +} +func (s *ProposalState) UnmarshalJSON(data []byte) error { + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { return err } + state, err := StringToProposalState(dataStr) + if err == nil { *s = state } + return err +} + From c1b9904c56eaca245388d93ce23dc02ef0b849aa Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 15:44:10 +1000 Subject: [PATCH 208/878] updating DAO & settings modules --- dao/proposals.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dao/proposals.go b/dao/proposals.go index baf6da26d..6433b6a01 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -173,6 +173,34 @@ func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C } +// Get whether a member has voted on a proposal +func GetProposalMemberVoted(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + voted := new(bool) + if err := rocketDAOProposal.Call(opts, voted, "getReceiptHasVoted", big.NewInt(int64(proposalId)), memberAddress); err != nil { + return false, fmt.Errorf("Could not get proposal %d member %s voted status: %w", proposalId, memberAddress.Hex(), err) + } + return *voted, nil +} + + +// Get whether a member has voted in support of a proposal +func GetProposalMemberSupported(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + supported := new(bool) + if err := rocketDAOProposal.Call(opts, supported, "getReceiptSupported", big.NewInt(int64(proposalId)), memberAddress); err != nil { + return false, fmt.Errorf("Could not get proposal %d member %s supported status: %w", proposalId, memberAddress.Hex(), err) + } + return *supported, nil +} + + // Get contracts var rocketDAOProposalLock sync.Mutex func getRocketDAOProposal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From c0a8a917809be4e454e481d084d17da4c1256a6d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 9 Feb 2021 16:08:16 +1000 Subject: [PATCH 209/878] implementing DAO proposals --- dao/proposals.go | 255 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) diff --git a/dao/proposals.go b/dao/proposals.go index 6433b6a01..8461dba5a 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -7,12 +7,267 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" ) +// Settings +const ProposalDetailsBatchSize = 10 + + +// Proposal details +type ProposalDetails struct { + DAO string `json:"dao"` + ProposerAddress common.Address `json:"proposerAddress"` + CreatedBlock uint64 `json:"createdBlock"` + StartBlock uint64 `json:"startBlock"` + EndBlock uint64 `json:"endBlock"` + ExpiryBlock uint64 `json:"expiryBlock"` + VotesRequired uint64 `json:"votesRequired"` + VotesFor uint64 `json:"votesFor"` + VotesAgainst uint64 `json:"votesAgainst"` + MemberVoted bool `json:"memberVoted"` + MemberSupported bool `json:"memberSupported"` + IsCancelled bool `json:"isCancelled"` + IsExecuted bool `json:"isExecuted"` + Payload []byte `json:"payload"` + State rptypes.ProposalState `json:"state"` +} + + +// Get all proposal details with member data +func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { + + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, proposalCount) + for bsi := 0; bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { pei = proposalCount } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetailsWithMember(rp, pi + 1, memberAddress, opts) // Proposals are 1-indexed + if err == nil { details[pi] = proposalDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get all proposal details +func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { + + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, proposalCount) + for bsi := 0; bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { pei = proposalCount } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, pi + 1, opts) // Proposals are 1-indexed + if err == nil { details[pi] = proposalDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get a proposal's details with member data +func GetProposalDetailsWithMember(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (ProposalDetails, error) { + + // Data + var wg errgroup.Group + var details ProposalDetails + var memberVoted bool + var memberSupported bool + + // Load data + wg.Go(func() error { + var err error + details, err = GetProposalDetails(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + memberVoted, err = GetProposalMemberVoted(rp, proposalId, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + memberSupported, err = GetProposalMemberSupported(rp, proposalId, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Return + details.MemberVoted = memberVoted + details.MemberSupported = memberSupported + return details, nil + +} + + +// Get a proposal's details +func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { + + // Data + var wg errgroup.Group + var dao string + var proposerAddress common.Address + var createdBlock uint64 + var startBlock uint64 + var endBlock uint64 + var expiryBlock uint64 + var votesRequired uint64 + var votesFor uint64 + var votesAgainst uint64 + var isCancelled bool + var isExecuted bool + var payload []byte + var state rptypes.ProposalState + + // Load data + wg.Go(func() error { + var err error + dao, err = GetProposalDAO(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + proposerAddress, err = GetProposalProposerAddress(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + createdBlock, err = GetProposalCreatedBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + startBlock, err = GetProposalStartBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + endBlock, err = GetProposalEndBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + expiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesRequired, err = GetProposalVotesRequired(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesFor, err = GetProposalVotesFor(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesAgainst, err = GetProposalVotesAgainst(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + isCancelled, err = GetProposalIsCancelled(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + isExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + payload, err = GetProposalPayload(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + state, err = GetProposalState(rp, proposalId, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Return + return ProposalDetails{ + DAO: dao, + ProposerAddress: proposerAddress, + CreatedBlock: createdBlock, + StartBlock: startBlock, + EndBlock: endBlock, + ExpiryBlock: expiryBlock, + VotesRequired: votesRequired, + VotesFor: votesFor, + VotesAgainst: votesAgainst, + IsCancelled: isCancelled, + IsExecuted: isExecuted, + Payload: payload, + State: state, + }, nil + +} + + // Get the proposal count func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) From b4e150177466e197baede3939e5d3386a8f9f93c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 09:26:20 +1000 Subject: [PATCH 210/878] minor auctions update --- auction/auction.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index c981c8138..02c0a2dfe 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -20,6 +20,7 @@ const LotDetailsBatchSize = 10 // Lot details type LotDetails struct { + Index uint64 `json:"index"` Exists bool `json:"exists"` StartBlock uint64 `json:"startBlock"` EndBlock uint64 `json:"endBlock"` @@ -242,6 +243,7 @@ func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOp // Return return LotDetails{ + Index: lotIndex, Exists: exists, StartBlock: startBlock, EndBlock: endBlock, From 80c4792fcae890f28e45f7f6bbe81269a054d8a9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 10:03:19 +1000 Subject: [PATCH 211/878] minor auctions update --- auction/auction.go | 76 +++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 02c0a2dfe..f6d5caf9d 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -38,8 +38,8 @@ type LotDetails struct { } -// Get all lot details with bids -func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) ([]LotDetails, error) { +// Get all lot details +func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, error) { // Get lot count lotCount, err := GetLotCount(rp, opts) @@ -61,7 +61,7 @@ func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bin for li := lsi; li < lei; li++ { li := li wg.Go(func() error { - lotDetails, err := GetLotDetailsWithBids(rp, li, bidder, opts) + lotDetails, err := GetLotDetails(rp, li, opts) if err == nil { details[li] = lotDetails } return err }) @@ -78,8 +78,8 @@ func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bin } -// Get all lot details -func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, error) { +// Get all lot details with bids from an address +func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) ([]LotDetails, error) { // Get lot count lotCount, err := GetLotCount(rp, opts) @@ -101,7 +101,7 @@ func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, erro for li := lsi; li < lei; li++ { li := li wg.Go(func() error { - lotDetails, err := GetLotDetails(rp, li, opts) + lotDetails, err := GetLotDetailsWithBids(rp, li, bidder, opts) if err == nil { details[li] = lotDetails } return err }) @@ -118,38 +118,6 @@ func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, erro } -// Get a lot's details with address bid amounts -func GetLotDetailsWithBids(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (LotDetails, error) { - - // Data - var wg errgroup.Group - var details LotDetails - var addressBidAmount *big.Int - - // Load data - wg.Go(func() error { - var err error - details, err = GetLotDetails(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - addressBidAmount, err = GetLotAddressBidAmount(rp, lotIndex, bidder, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return LotDetails{}, err - } - - // Return - details.AddressBidAmount = addressBidAmount - return details, nil - -} - - // Get a lot's details func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (LotDetails, error) { @@ -262,6 +230,38 @@ func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOp } +// Get a lot's details with address bid amounts +func GetLotDetailsWithBids(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (LotDetails, error) { + + // Data + var wg errgroup.Group + var details LotDetails + var addressBidAmount *big.Int + + // Load data + wg.Go(func() error { + var err error + details, err = GetLotDetails(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + addressBidAmount, err = GetLotAddressBidAmount(rp, lotIndex, bidder, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return LotDetails{}, err + } + + // Return + details.AddressBidAmount = addressBidAmount + return details, nil + +} + + // Get the total RPL balance of the auction contract func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) From fd7747e3a753c4b90b51f574de73b46622cab09c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 10:04:22 +1000 Subject: [PATCH 212/878] implementing DAO proposals --- dao/proposals.go | 201 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 166 insertions(+), 35 deletions(-) diff --git a/dao/proposals.go b/dao/proposals.go index 8461dba5a..b082a9129 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -15,11 +15,15 @@ import ( // Settings -const ProposalDetailsBatchSize = 10 +const ( + ProposalDAONamesBatchSize = 50 + ProposalDetailsBatchSize = 10 +) // Proposal details type ProposalDetails struct { + ID uint64 `json:"id"` DAO string `json:"dao"` ProposerAddress common.Address `json:"proposerAddress"` CreatedBlock uint64 `json:"createdBlock"` @@ -38,8 +42,8 @@ type ProposalDetails struct { } -// Get all proposal details with member data -func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { +// Get all proposal details +func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { // Get proposal count proposalCount, err := GetProposalCount(rp, opts) @@ -61,7 +65,7 @@ func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Addr for pi := psi; pi < pei; pi++ { pi := pi wg.Go(func() error { - proposalDetails, err := GetProposalDetailsWithMember(rp, pi + 1, memberAddress, opts) // Proposals are 1-indexed + proposalDetails, err := GetProposalDetails(rp, pi + 1, opts) // Proposals are 1-indexed if err == nil { details[pi] = proposalDetails } return err }) @@ -78,8 +82,8 @@ func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Addr } -// Get all proposal details -func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { +// Get all proposal details with member data +func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { // Get proposal count proposalCount, err := GetProposalCount(rp, opts) @@ -101,7 +105,7 @@ func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDet for pi := psi; pi < pei; pi++ { pi := pi wg.Go(func() error { - proposalDetails, err := GetProposalDetails(rp, pi + 1, opts) // Proposals are 1-indexed + proposalDetails, err := GetProposalDetailsWithMember(rp, pi + 1, memberAddress, opts) // Proposals are 1-indexed if err == nil { details[pi] = proposalDetails } return err }) @@ -118,45 +122,132 @@ func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDet } -// Get a proposal's details with member data -func GetProposalDetailsWithMember(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (ProposalDetails, error) { +// Get DAO proposal details +func GetDAOProposals(rp *rocketpool.RocketPool, daoName string, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Data - var wg errgroup.Group - var details ProposalDetails - var memberVoted bool - var memberSupported bool + // Get DAO proposal IDs + proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) + if err != nil { + return []ProposalDetails{}, err + } - // Load data - wg.Go(func() error { - var err error - details, err = GetProposalDetails(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - memberVoted, err = GetProposalMemberVoted(rp, proposalId, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - memberSupported, err = GetProposalMemberSupported(rp, proposalId, memberAddress, opts) - return err - }) + // Load proposal details in batches + details := make([]ProposalDetails, len(proposalIds)) + for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > len(proposalIds) { pei = len(proposalIds) } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, proposalIds[pi], opts) + if err == nil { details[pi] = proposalDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } - // Wait for data - if err := wg.Wait(); err != nil { - return ProposalDetails{}, err } // Return - details.MemberVoted = memberVoted - details.MemberSupported = memberSupported return details, nil } +// Get DAO proposal details with member data +func GetDAOProposalsWithMember(rp *rocketpool.RocketPool, daoName string, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { + + // Get DAO proposal IDs + proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, len(proposalIds)) + for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > len(proposalIds) { pei = len(proposalIds) } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetailsWithMember(rp, proposalIds[pi], memberAddress, opts) + if err == nil { details[pi] = proposalDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get the IDs of proposals filtered by a DAO +func GetDAOProposalIDs(rp *rocketpool.RocketPool, daoName string, opts *bind.CallOpts) ([]uint64, error) { + + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []uint64{}, err + } + + // Load proposal DAO names in batches + proposalDaoNames := make([]string, proposalCount) + for bsi := 0; bsi < proposalCount; bsi += ProposalDAONamesBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDAONamesBatchSize + if pei > proposalCount { pei = proposalCount } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDaoName, err := GetProposalDAO(rp, pi + 1, opts) // Proposals are 1-indexed + if err == nil { proposalDaoNames[pi] = proposalDaoName } + return err + }) + } + if err := wg.Wait(); err != nil { + return []uint64{}, err + } + + } + + // Get & return IDs for DAO proposals + ids := []uint64{} + for pi, proposalDaoName := range proposalDaoNames { + if proposalDaoName == daoName { + ids = append(ids, pi + 1) // Proposals are 1-indexed + } + } + return ids, nil + +} + + // Get a proposal's details func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { @@ -250,6 +341,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind // Return return ProposalDetails{ + ID: proposalId, DAO: dao, ProposerAddress: proposerAddress, CreatedBlock: createdBlock, @@ -268,6 +360,45 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } +// Get a proposal's details with member data +func GetProposalDetailsWithMember(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (ProposalDetails, error) { + + // Data + var wg errgroup.Group + var details ProposalDetails + var memberVoted bool + var memberSupported bool + + // Load data + wg.Go(func() error { + var err error + details, err = GetProposalDetails(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + memberVoted, err = GetProposalMemberVoted(rp, proposalId, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + memberSupported, err = GetProposalMemberSupported(rp, proposalId, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Return + details.MemberVoted = memberVoted + details.MemberSupported = memberSupported + return details, nil + +} + + // Get the proposal count func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) From e8befd07be26f22a33c80d5e4151438d40576837 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 10:32:12 +1000 Subject: [PATCH 213/878] minor fix --- minipool/minipool.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 61c04985b..d3900d36e 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -364,7 +364,7 @@ func GetUnprocessedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getUnprocessedMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get minipool count: %w", err) + return 0, fmt.Errorf("Could not get unprocessed minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -378,7 +378,7 @@ func GetUnprocessedMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bin } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getUnprocessedMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + return common.Address{}, fmt.Errorf("Could not get unprocessed minipool %d address: %w", index, err) } return *minipoolAddress, nil } From 1b25ee0591fa19a37bdeb5826f51586a19af3a85 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 10:48:56 +1000 Subject: [PATCH 214/878] implementing trusted node DAO --- dao/trustednode/dao.go | 108 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index f9237cd44..3c3630896 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -13,6 +13,114 @@ import ( ) +// Get the member count +func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + memberCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, memberCount, "getMemberCount"); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member count: %w", err) + } + return (*memberCount).Uint64(), nil +} + + +// Get a member address by index +func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Address{}, err + } + memberAddress := new(common.Address) + if err := rocketDAONodeTrusted.Call(opts, memberAddress, "getMemberAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %d address: %w", index, err) + } + return *memberAddress, nil +} + + +// Member details +func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketDAONodeTrusted.Call(opts, exists, "getMemberIsValid", memberAddress); err != nil { + return false, fmt.Errorf("Could not get trusted node DAO member %s exists status: %w", memberAddress.Hex(), err) + } + return *exists, nil +} +func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return "", err + } + id := new(string) + if err := rocketDAONodeTrusted.Call(opts, id, "getMemberID", memberAddress); err != nil { + return "", fmt.Errorf("Could not get trusted node DAO member %s ID: %w", memberAddress.Hex(), err) + } + return *id, nil +} +func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return "", err + } + email := new(string) + if err := rocketDAONodeTrusted.Call(opts, email, "getMemberEmail", memberAddress); err != nil { + return "", fmt.Errorf("Could not get trusted node DAO member %s email: %w", memberAddress.Hex(), err) + } + return *email, nil +} +func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + joinedBlock := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, joinedBlock, "getMemberJoinedBlock", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s joined block: %w", memberAddress.Hex(), err) + } + return (*joinedBlock).Uint64(), nil +} +func GetMemberLastProposalBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + lastProposalBlock := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, lastProposalBlock, "getMemberLastProposalBlock", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal block: %w", memberAddress.Hex(), err) + } + return (*lastProposalBlock).Uint64(), nil +} +func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + rplBondAmount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, rplBondAmount, "getMemberRPLBondAmount", memberAddress); err != nil { + return nil, fmt.Errorf("Could not get trusted node DAO member %s RPL bond amount: %w", memberAddress.Hex(), err) + } + return *rplBondAmount, nil +} +func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + unbondedValidatorCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, unbondedValidatorCount, "getMemberUnbondedValidatorCount", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s unbonded validator count: %w", memberAddress.Hex(), err) + } + return (*unbondedValidatorCount).Uint64(), nil +} + + // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) From c20dfefca6831873f3b1b44e88e1d2c20d8e54af Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 11:15:51 +1000 Subject: [PATCH 215/878] implementing trusted node DAO --- dao/trustednode/dao.go | 171 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 3c3630896..b3d790810 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -13,6 +13,177 @@ import ( ) +// Settings +const ( + MemberAddressBatchSize = 50 + MemberDetailsBatchSize = 20 +) + + +// Proposal details +type MemberDetails struct { + Address common.Address `json:"address"` + Exists bool `json:"exists"` + ID string `json:"id"` + Email string `json:"email"` + JoinedBlock uint64 `json:"joinedBlock"` + LastProposalBlock uint64 `json:"lastProposalBlock"` + RPLBondAmount *big.Int `json:"rplBondAmount"` + UnbondedValidatorCount uint64 `json:"unbondedValidatorCount"` +} + + +// Get all member details +func GetMembers(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MemberDetails, error) { + + // Get member addresses + memberAddresses, err := GetMemberAddresses(rp, opts) + if err != nil { + return []MemberDetails{}, err + } + + // Load member details in batches + details := make([]MemberDetails, len(memberAddresses)) + for bsi := 0; bsi < len(memberAddresses); bsi += MemberDetailsBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MemberDetailsBatchSize + if mei > len(memberAddresses) { mei = len(memberAddresses) } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + memberAddress := memberAddresses[mi] + memberDetails, err := GetMemberDetails(rp, memberAddress, opts) + if err == nil { details[mi] = memberDetails } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MemberDetails{}, err + } + + } + + // Return + return details, nil + +} + + +// Get all member addresses +func GetMemberAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + // Get member count + memberCount, err := GetMemberCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load member addresses in batches + addresses := make([]common.Address, memberCount) + for bsi := uint64(0); bsi < memberCount; bsi += MemberAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MemberAddressBatchSize + if mei > memberCount { mei = memberCount } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMemberAt(rp, mi, opts) + if err == nil { addresses[mi] = address } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil + +} + + +// Get a member's details +func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (MemberDetails, error) { + + // Data + var wg errgroup.Group + var exists bool + var id string + var email string + var joinedBlock uint64 + var lastProposalBlock uint64 + var rplBondAmount *big.Int + var unbondedValidatorCount uint64 + + // Load data + wg.Go(func() error { + var err error + exists, err = GetMemberExists(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + id, err = GetMemberID(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + email, err = GetMemberEmail(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + joinedBlock, err = GetMemberJoinedBlock(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + lastProposalBlock, err = GetMemberLastProposalBlock(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + rplBondAmount, err = GetMemberRPLBondAmount(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + unbondedValidatorCount, err = GetMemberUnbondedValidatorCount(rp, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return MemberDetails{}, err + } + + // Return + return MemberDetails{ + Address: memberAddress, + Exists: exists, + ID: id, + Email: email, + JoinedBlock: joinedBlock, + LastProposalBlock: lastProposalBlock, + RPLBondAmount: rplBondAmount, + UnbondedValidatorCount: unbondedValidatorCount, + }, nil + +} + + // Get the member count func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) From 29d43517754c2ef9cdbc023c78534e08028fd85a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 12:07:36 +1000 Subject: [PATCH 216/878] implementing trusted node DAO --- dao/trustednode/actions.go | 67 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 dao/trustednode/actions.go diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go new file mode 100644 index 000000000..c502b0739 --- /dev/null +++ b/dao/trustednode/actions.go @@ -0,0 +1,67 @@ +package trustednode + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Join the trusted node DAO +// Requires an executed invite proposal +func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") + if err != nil { + return nil, fmt.Errorf("Could not join the trusted node DAO: %w") + } + return txReceipt, nil +} + + +// Leave the trusted node DAO +// Requires an executed leave proposal +func Leave(rp *rocketpool.RocketPool, bondRefundAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", bondRefundAddress) + if err != nil { + return nil, fmt.Errorf("Could not leave the trusted node DAO: %w") + } + return txReceipt, nil +} + + +// Replace a node's position in the trusted node DAO with another node +// Requires an executed replace proposal +func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave") + if err != nil { + return nil, fmt.Errorf("Could not replace position in the trusted node DAO: %w") + } + return txReceipt, nil +} + + +// Get contracts +var rocketDAONodeTrustedActionsLock sync.Mutex +func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAONodeTrustedActionsLock.Lock() + defer rocketDAONodeTrustedActionsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedActions") +} + From c2d1ca50126a133a7d68a4b5a915c110e9d8dd49 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 12:09:12 +1000 Subject: [PATCH 217/878] implementing trusted node DAO --- dao/trustednode/actions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index c502b0739..16454b265 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -42,7 +42,7 @@ func Leave(rp *rocketpool.RocketPool, bondRefundAddress common.Address, opts *bi } -// Replace a node's position in the trusted node DAO with another node +// Replace node's position in the trusted node DAO with another node // Requires an executed replace proposal func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) @@ -51,7 +51,7 @@ func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt } txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave") if err != nil { - return nil, fmt.Errorf("Could not replace position in the trusted node DAO: %w") + return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w") } return txReceipt, nil } From d3fbd57450ecffef98d2710bc1129009c5ef585a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 14:15:44 +1000 Subject: [PATCH 218/878] implementing trusted node DAO --- dao/trustednode/actions.go | 10 +-- dao/trustednode/proposals.go | 115 +++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 dao/trustednode/proposals.go diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index 16454b265..a629fa0e4 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -21,7 +21,7 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, e } txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") if err != nil { - return nil, fmt.Errorf("Could not join the trusted node DAO: %w") + return nil, fmt.Errorf("Could not join the trusted node DAO: %w", err) } return txReceipt, nil } @@ -29,14 +29,14 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, e // Leave the trusted node DAO // Requires an executed leave proposal -func Leave(rp *rocketpool.RocketPool, bondRefundAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { return nil, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", bondRefundAddress) + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) if err != nil { - return nil, fmt.Errorf("Could not leave the trusted node DAO: %w") + return nil, fmt.Errorf("Could not leave the trusted node DAO: %w", err) } return txReceipt, nil } @@ -51,7 +51,7 @@ func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt } txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave") if err != nil { - return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w") + return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w", err) } return txReceipt, nil } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go new file mode 100644 index 000000000..026226665 --- /dev/null +++ b/dao/trustednode/proposals.go @@ -0,0 +1,115 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Submit a proposal to invite a new member to the trusted node DAO +func ProposeInviteMember(rp *rocketpool.RocketPool, message, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a proposal for a member to leave the trusted node DAO +func ProposeLeaveMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a proposal to replace a member in the trusted node DAO +func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a proposal to kick a member from the trusted node DAO +func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a proposal to update a uint256 trusted node DAO setting +func ProposeSetUintSetting(rp *rocketpool.RocketPool, message string, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a proposal to update a bool trusted node DAO setting +func ProposeSetBoolSetting(rp *rocketpool.RocketPool, message string, opts *bind.TransactOpts) (*types.Receipt, error) { + return SubmitProposal(rp, message, , opts) +} + + +// Submit a trusted node DAO proposal +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) + if err != nil { + return nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w") + } + return txReceipt, nil +} + + +// Cancel a submitted proposal +func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + if err != nil { + return nil, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) + } + return txReceipt, nil +} + + +// Vote on a submitted proposal +func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + if err != nil { + return nil, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) + } + return txReceipt, nil +} + + +// Execute a submitted proposal +func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + if err != nil { + return nil, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) + } + return txReceipt, nil +} + + +// Get contracts +var rocketDAONodeTrustedProposalsLock sync.Mutex +func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAONodeTrustedProposalsLock.Lock() + defer rocketDAONodeTrustedProposalsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedProposals") +} + From ce04b542227cde232a92bdb5cf62b768cd8c648e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 14:17:18 +1000 Subject: [PATCH 219/878] implementing trusted node DAO --- dao/trustednode/proposals.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 026226665..6775d1bc1 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -14,13 +14,13 @@ import ( // Submit a proposal to invite a new member to the trusted node DAO -func ProposeInviteMember(rp *rocketpool.RocketPool, message, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { return SubmitProposal(rp, message, , opts) } // Submit a proposal for a member to leave the trusted node DAO -func ProposeLeaveMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { return SubmitProposal(rp, message, , opts) } From f28345cb82ececbee6bc2caafa1f8c86c9eeedf5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 14:41:14 +1000 Subject: [PATCH 220/878] implementing trusted node DAO --- dao/trustednode/proposals.go | 68 ++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 6775d1bc1..827a75a96 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -15,37 +15,85 @@ import ( // Submit a proposal to invite a new member to the trusted node DAO func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) + if err != nil { + return nil, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } // Submit a proposal for a member to leave the trusted node DAO func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) + if err != nil { + return nil, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to replace a member in the trusted node DAO func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) + if err != nil { + return nil, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to kick a member from the trusted node DAO func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) + if err != nil { + return nil, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } -// Submit a proposal to update a uint256 trusted node DAO setting -func ProposeSetUintSetting(rp *rocketpool.RocketPool, message string, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) +// Submit a proposal to update a bool trusted node DAO setting +func ProposeSetBoolSetting(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } -// Submit a proposal to update a bool trusted node DAO setting -func ProposeSetBoolSetting(rp *rocketpool.RocketPool, message string, opts *bind.TransactOpts) (*types.Receipt, error) { - return SubmitProposal(rp, message, , opts) +// Submit a proposal to update a uint trusted node DAO setting +func ProposeSetUintSetting(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } From 0d9ac2ddd4bf37d86109ba63b596a9346f0290b9 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 15:46:58 +1000 Subject: [PATCH 221/878] implementing trusted node DAO --- dao/trustednode/proposals.go | 4 ++-- settings/trustednode/members.go | 22 ++++++++++++++++---- settings/trustednode/proposals.go | 34 +++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 827a75a96..1c2237c0e 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -70,7 +70,7 @@ func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress // Submit a proposal to update a bool trusted node DAO setting -func ProposeSetBoolSetting(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return nil, err @@ -84,7 +84,7 @@ func ProposeSetBoolSetting(rp *rocketpool.RocketPool, message, contractName, set // Submit a proposal to update a uint trusted node DAO setting -func ProposeSetUintSetting(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return nil, err diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 881c01f8b..e87e3db1b 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -15,7 +15,12 @@ import ( // Config -const MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" +const ( + MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" + QuorumSettingPath = "members.quorum" + RPLBondSettingPath = "members.rplbond" + MinipoolUnbondedMaxSettingPath = "members.minipool.unbonded.max" +) // Member proposal quorum threshold @@ -31,7 +36,10 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) return eth.WeiToEth(*value), nil } func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.quorum", eth.EthToWei(value), opts) + return trustednode.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) +} +func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } @@ -48,7 +56,10 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error return *value, nil } func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.rplbond", value, opts) + return trustednode.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) +} +func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } @@ -65,7 +76,10 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin return (*value).Uint64(), nil } func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, "members.minipool.unbonded.max", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 6f31e8d0b..03318cc2c 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -14,7 +14,14 @@ import ( // Config -const ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" +const ( + ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" + CooldownSettingPath = "proposal.cooldown" + VoteBlocksSettingPath = "proposal.vote.blocks" + VoteDelayBlocksSettingPath = "proposal.vote.delay.blocks" + ExecuteBlocksSettingPath = "proposal.execute.blocks" + ActionBlocksSettingPath = "proposal.action.blocks" +) // The cooldown period a member must wait after making a proposal before making another in blocks @@ -30,7 +37,10 @@ func GetCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) return (*value).Uint64(), nil } func BootstrapCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.cooldown", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -47,7 +57,10 @@ func GetVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, erro return (*value).Uint64(), nil } func BootstrapVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.vote.blocks", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -64,7 +77,10 @@ func GetVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, return (*value).Uint64(), nil } func BootstrapVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.vote.delay.blocks", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -81,7 +97,10 @@ func GetExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e return (*value).Uint64(), nil } func BootstrapExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.execute.blocks", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -98,7 +117,10 @@ func GetActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, er return (*value).Uint64(), nil } func BootstrapActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, "proposal.action.blocks", big.NewInt(int64(value)), opts) + return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } From bc20b4d229340bb151c609ec8990149c31cc811b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 10 Feb 2021 16:33:00 +1000 Subject: [PATCH 222/878] implementing trusted node DAO --- dao/proposal-payload.go | 48 +++++++++++++++++++++++++++++++++++++++++ dao/proposals.go | 8 +++++++ 2 files changed, 56 insertions(+) create mode 100644 dao/proposal-payload.go diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go new file mode 100644 index 000000000..c7ea2916a --- /dev/null +++ b/dao/proposal-payload.go @@ -0,0 +1,48 @@ +package dao + +import ( + "fmt" + "strings" + "sync" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + + +// Get the string representation of a proposal payload +var getProposalPayloadStringLock sync.Mutex +func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload []byte) (string, error) { + + // Lock while getting proposal payload string + getProposalPayloadStringLock.Lock() + defer getProposalPayloadStringLock.Unlock() + + // Get proposal DAO contract ABI + abi, err := rp.GetABI(daoName) + if err != nil { + return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) + } + + // Get proposal payload method + method, err := abi.MethodById(payload) + if err != nil { + return "", fmt.Errorf("Could not get proposal payload method: %w", err) + } + + // Get proposal payload argument values + args, err := method.Inputs.UnpackValues(payload) + if err != nil { + return "", fmt.Errorf("Could not get proposal payload arguments: %w", err) + } + + // Format argument values as strings + argStrs := []string{} + for _, arg := range args { + argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + } + + // Build & return payload string + return fmt.Sprintf("%s(%s)", method.Sig, strings.Join(argStrs, ",")), nil + +} + diff --git a/dao/proposals.go b/dao/proposals.go index b082a9129..b76cb7ec3 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -38,6 +38,7 @@ type ProposalDetails struct { IsCancelled bool `json:"isCancelled"` IsExecuted bool `json:"isExecuted"` Payload []byte `json:"payload"` + PayloadStr string `json:"payloadStr"` State rptypes.ProposalState `json:"state"` } @@ -339,6 +340,12 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return ProposalDetails{}, err } + // Get proposal payload string + payloadStr, err := GetProposalPayloadString(rp, dao, payload) + if err != nil { + payloadStr = "(unknown)" + } + // Return return ProposalDetails{ ID: proposalId, @@ -354,6 +361,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind IsCancelled: isCancelled, IsExecuted: isExecuted, Payload: payload, + PayloadStr: payloadStr, State: state, }, nil From 926482747102db5079100dd7507c35fb1c5a9740 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 09:58:08 +1000 Subject: [PATCH 223/878] implementing trusted node DAO --- dao/trustednode/dao.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index b3d790810..cfe3c7e45 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -292,6 +292,43 @@ func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress co } +// Get the block that a proposal for a member was executed at +func GetMemberInviteProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + return GetMemberProposalExecutedBlock(rp, "invited", memberAddress, opts) +} +func GetMemberLeaveProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + return GetMemberProposalExecutedBlock(rp, "leave", memberAddress, opts) +} +func GetMemberReplaceProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + return GetMemberProposalExecutedBlock(rp, "replace", memberAddress, opts) +} +func GetMemberProposalExecutedBlock(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + proposalExecutedBlock := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, proposalExecutedBlock, "getMemberProposalExecutedBlock", proposalType, memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed block for member %s: %w", proposalType, memberAddress.Hex(), err) + } + return (*proposalExecutedBlock).Uint64(), nil +} + + +// Get a member's replacement address if being replaced +func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (common.Address, err) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Address{}, err + } + replacementAddress := new(common.Address) + if err := rocketDAONodeTrusted.Call(opts, replacementAddress, "getMemberReplacedAddress", "new", memberAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %s replacement address: %w", memberAddress.Hex(), err) + } + return *replacementAddress, nil +} + + // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) From e501922017ddf9e86404bc90398f1fc5ea3e7830 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 10:12:42 +1000 Subject: [PATCH 224/878] updating auctions module --- auction/auction.go | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index f6d5caf9d..3f557ce9b 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -20,21 +20,22 @@ const LotDetailsBatchSize = 10 // Lot details type LotDetails struct { - Index uint64 `json:"index"` - Exists bool `json:"exists"` - StartBlock uint64 `json:"startBlock"` - EndBlock uint64 `json:"endBlock"` - StartPrice *big.Int `json:"startPrice"` - ReservePrice *big.Int `json:"reservePrice"` - PriceByTotalBids *big.Int `json:"priceByTotalBids"` - CurrentPrice *big.Int `json:"currentPrice"` - TotalRPLAmount *big.Int `json:"totalRplAmount"` - ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` - RemainingRPLAmount *big.Int `json:"remainingRplAmount"` - TotalBidAmount *big.Int `json:"totalBidAmount"` - AddressBidAmount *big.Int `json:"addressBidAmount"` - Cleared bool `json:"cleared"` - RPLRecovered bool `json:"rplRecovered"` + Index uint64 `json:"index"` + Exists bool `json:"exists"` + StartBlock uint64 `json:"startBlock"` + EndBlock uint64 `json:"endBlock"` + StartPrice *big.Int `json:"startPrice"` + ReservePrice *big.Int `json:"reservePrice"` + PriceAtCurrentBlock *big.Int `json:"priceAtCurrentBlock"` + PriceByTotalBids *big.Int `json:"priceByTotalBids"` + CurrentPrice *big.Int `json:"currentPrice"` + TotalRPLAmount *big.Int `json:"totalRplAmount"` + ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` + RemainingRPLAmount *big.Int `json:"remainingRplAmount"` + TotalBidAmount *big.Int `json:"totalBidAmount"` + AddressBidAmount *big.Int `json:"addressBidAmount"` + Cleared bool `json:"cleared"` + RPLRecovered bool `json:"rplRecovered"` } @@ -407,6 +408,17 @@ func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C } return *lotRplRecovered, nil } +func GetLotPriceAtCurrentBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceAtCurrentBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceAtCurrentBlock, "getLotPriceAtCurrentBlock", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price by current block: %w", lotIndex, err) + } + return *lotPriceAtCurrentBlock, nil +} func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { From 83931338bbe339d118c0d336d51efeae59347eb2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 10:47:14 +1000 Subject: [PATCH 225/878] updating trusted node DAO module --- dao/trustednode/dao.go | 14 ++++++++++++++ dao/trustednode/proposals.go | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index cfe3c7e45..fb0ee2684 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -371,6 +371,20 @@ func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress co } +// Bootstrap a contract upgrade +func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, contractAbi, contractAddress) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) + } + return txReceipt, nil +} + + // Get contracts var rocketDAONodeTrustedLock sync.Mutex func getRocketDAONodeTrusted(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 1c2237c0e..b5b41aed8 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -97,6 +97,20 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat } +// Submit a proposal to upgrade a contract +func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, contractAbi, contractAddress) + if err != nil { + return nil, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + + // Submit a trusted node DAO proposal func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) From ce6e79ec8d91b6555a416417706b8ce31277a91c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:33:34 +1000 Subject: [PATCH 226/878] updating trusted node DAO module --- dao/trustednode/dao.go | 6 +++- dao/trustednode/proposals.go | 6 +++- rocketpool/abi.go | 57 ++++++++++++++++++++++++++++++++++++ rocketpool/rocketpool.go | 33 +-------------------- 4 files changed, 68 insertions(+), 34 deletions(-) create mode 100644 rocketpool/abi.go diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index fb0ee2684..962ba4282 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -373,11 +373,15 @@ func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress co // Bootstrap a contract upgrade func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return nil, err + } rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return nil, err } - txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, contractAbi, contractAddress) + txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { return nil, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index b5b41aed8..322127b4d 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -99,11 +99,15 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat // Submit a proposal to upgrade a contract func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return nil, err + } rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return nil, err } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, contractAbi, contractAddress) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { return nil, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) } diff --git a/rocketpool/abi.go b/rocketpool/abi.go new file mode 100644 index 000000000..0e2afb9f9 --- /dev/null +++ b/rocketpool/abi.go @@ -0,0 +1,57 @@ +package rocketpool + +import ( + "bytes" + "compress/zlib" + "encoding/base64" + + "github.com/ethereum/go-ethereum/accounts/abi" +) + + +// Decode, decompress and parse a zlib-compressed, base64-encoded ABI +func DecodeAbi(abiEncoded string) (*abi.ABI, error) { + + // base64 decode + abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode base64 data: %w", err) + } + + // zlib decompress + byteReader := bytes.NewReader(abiCompressed) + zlibReader, err := zlib.NewReader(byteReader) + if err != nil { + return nil, fmt.Errorf("Could not decompress zlib data: %w", err) + } + defer zlibReader.Close() + + // Parse ABI + abiParsed, err := abi.JSON(zlibReader) + if err != nil { + return nil, fmt.Errorf("Could not parse JSON: %w", err) + } + + // Return + return &abiParsed, nil + +} + + +// zlib-compress and base64-encode an ABI JSON string +func EncodeAbiStr(abiStr string) (string, error) { + + // zlib compress + var abiCompressed bytes.Buffer + zlibWriter := zlib.NewWriter(&abiCompressed) + defer zlibWriter.Close() + if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } + zlibWriter.Flush() + + // base64 encode & return + return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()) + +} + diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 16054c121..7d8c0c3a2 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -1,9 +1,6 @@ package rocketpool import ( - "bytes" - "compress/zlib" - "encoding/base64" "fmt" "sync" "time" @@ -146,7 +143,7 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { } // Decode ABI - abi, err := decodeAbi(abiEncoded) + abi, err := DecodeAbi(abiEncoded) if err != nil { return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) } @@ -343,31 +340,3 @@ func (rp *RocketPool) deleteCachedContract(contractName string) { delete(rp.contracts, contractName) } - -// Decode, decompress and parse zlib-compressed, base64-encoded ABI -func decodeAbi(abiEncoded string) (*abi.ABI, error) { - - // Base 64 decode - abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) - if err != nil { - return nil, fmt.Errorf("Could not decode base64 data: %w", err) - } - - // Zlib decompress - byteReader := bytes.NewReader(abiCompressed) - zlibReader, err := zlib.NewReader(byteReader) - if err != nil { - return nil, fmt.Errorf("Could not decompress zlib data: %w", err) - } - - // Parse ABI - abiParsed, err := abi.JSON(zlibReader) - if err != nil { - return nil, fmt.Errorf("Could not parse JSON: %w", err) - } - - // Return - return &abiParsed, nil - -} - From ef6261f46affbcb7f40c3948fe877b23ec637088 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:37:22 +1000 Subject: [PATCH 227/878] various bugfixes --- rocketpool/abi.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rocketpool/abi.go b/rocketpool/abi.go index 0e2afb9f9..62667c5ee 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -4,6 +4,7 @@ import ( "bytes" "compress/zlib" "encoding/base64" + "fmt" "github.com/ethereum/go-ethereum/accounts/abi" ) @@ -51,7 +52,7 @@ func EncodeAbiStr(abiStr string) (string, error) { zlibWriter.Flush() // base64 encode & return - return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()) + return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()), nil } From 08cb478fe4ab51efa96b0401ed4196361c6874f7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:48:50 +1000 Subject: [PATCH 228/878] various bugfixes --- auction/auction.go | 4 ++-- dao/proposals.go | 18 +++++++++--------- dao/trustednode/dao.go | 29 +++++++++++++++-------------- dao/trustednode/proposals.go | 2 +- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 3f557ce9b..aebdd685b 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -50,7 +50,7 @@ func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, erro // Load lot details in batches details := make([]LotDetails, lotCount) - for bsi := 0; bsi < lotCount; bsi += LotDetailsBatchSize { + for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { // Get batch start & end index lsi := bsi @@ -90,7 +90,7 @@ func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bin // Load lot details in batches details := make([]LotDetails, lotCount) - for bsi := 0; bsi < lotCount; bsi += LotDetailsBatchSize { + for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { // Get batch start & end index lsi := bsi diff --git a/dao/proposals.go b/dao/proposals.go index b76cb7ec3..14b938553 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -54,7 +54,7 @@ func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDet // Load proposal details in batches details := make([]ProposalDetails, proposalCount) - for bsi := 0; bsi < proposalCount; bsi += ProposalDetailsBatchSize { + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { // Get batch start & end index psi := bsi @@ -94,7 +94,7 @@ func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Addr // Load proposal details in batches details := make([]ProposalDetails, proposalCount) - for bsi := 0; bsi < proposalCount; bsi += ProposalDetailsBatchSize { + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { // Get batch start & end index psi := bsi @@ -214,7 +214,7 @@ func GetDAOProposalIDs(rp *rocketpool.RocketPool, daoName string, opts *bind.Cal // Load proposal DAO names in batches proposalDaoNames := make([]string, proposalCount) - for bsi := 0; bsi < proposalCount; bsi += ProposalDAONamesBatchSize { + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDAONamesBatchSize { // Get batch start & end index psi := bsi @@ -241,7 +241,7 @@ func GetDAOProposalIDs(rp *rocketpool.RocketPool, daoName string, opts *bind.Cal ids := []uint64{} for pi, proposalDaoName := range proposalDaoNames { if proposalDaoName == daoName { - ids = append(ids, pi + 1) // Proposals are 1-indexed + ids = append(ids, uint64(pi + 1)) // Proposals are 1-indexed } } return ids, nil @@ -429,7 +429,7 @@ func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Cal } daoName := new(string) if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) + return "", fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) } return *daoName, nil } @@ -440,7 +440,7 @@ func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, op } proposerAddress := new(common.Address) if err := rocketDAOProposal.Call(opts, proposerAddress, "getProposer", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) + return common.Address{}, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) } return *proposerAddress, nil } @@ -528,7 +528,7 @@ func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts * } cancelled := new(bool) if err := rocketDAOProposal.Call(opts, cancelled, "getCancelled", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) + return false, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) } return *cancelled, nil } @@ -539,7 +539,7 @@ func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *b } executed := new(bool) if err := rocketDAOProposal.Call(opts, executed, "getExecuted", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) + return false, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) } return *executed, nil } @@ -550,7 +550,7 @@ func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } payload := new([]byte) if err := rocketDAOProposal.Call(opts, payload, "getPayload", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) + return []byte{}, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) } return *payload, nil } diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 962ba4282..0ccef102e 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -185,7 +186,7 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o // Get the member count -func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err) { +func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err @@ -199,7 +200,7 @@ func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err // Get a member address by index -func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, err) { +func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return common.Address{}, err @@ -213,7 +214,7 @@ func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) ( // Member details -func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, err) { +func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return false, err @@ -224,7 +225,7 @@ func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, op } return *exists, nil } -func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, err) { +func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return "", err @@ -235,7 +236,7 @@ func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts * } return *id, nil } -func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, err) { +func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return "", err @@ -246,7 +247,7 @@ func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opt } return *email, nil } -func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err @@ -257,7 +258,7 @@ func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Addres } return (*joinedBlock).Uint64(), nil } -func GetMemberLastProposalBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberLastProposalBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err @@ -268,7 +269,7 @@ func GetMemberLastProposalBlock(rp *rocketpool.RocketPool, memberAddress common. } return (*lastProposalBlock).Uint64(), nil } -func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, err) { +func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return nil, err @@ -279,7 +280,7 @@ func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Addr } return *rplBondAmount, nil } -func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err @@ -293,16 +294,16 @@ func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress co // Get the block that a proposal for a member was executed at -func GetMemberInviteProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberInviteProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { return GetMemberProposalExecutedBlock(rp, "invited", memberAddress, opts) } -func GetMemberLeaveProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberLeaveProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { return GetMemberProposalExecutedBlock(rp, "leave", memberAddress, opts) } -func GetMemberReplaceProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberReplaceProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { return GetMemberProposalExecutedBlock(rp, "replace", memberAddress, opts) } -func GetMemberProposalExecutedBlock(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, err) { +func GetMemberProposalExecutedBlock(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err @@ -316,7 +317,7 @@ func GetMemberProposalExecutedBlock(rp *rocketpool.RocketPool, proposalType stri // Get a member's replacement address if being replaced -func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (common.Address, err) { +func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (common.Address, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return common.Address{}, err diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 322127b4d..51f6a7524 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -123,7 +123,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o } txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) if err != nil { - return nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w") + return nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) } return txReceipt, nil } From e8fa3d39ccf53ec389e18b2f65f69f9fb25e4470 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:51:30 +1000 Subject: [PATCH 229/878] various bugfixes --- node/node.go | 4 ++-- settings/protocol/node.go | 8 ++++---- settings/trustednode/members.go | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/node/node.go b/node/node.go index 3d2f589a7..08d9e71da 100644 --- a/node/node.go +++ b/node/node.go @@ -199,11 +199,11 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { - return "", err + return common.Address{}, err } withdrawalAddress := new(common.Address) if err := rocketNodeManager.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { - return "", fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) + return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) } return *withdrawalAddress, nil } diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 06a65cf93..05b22f1e9 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -56,11 +56,11 @@ func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bi func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { nodeSettingsContract, err := getNodeSettingsContract(rp) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { - return nil, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + return 0, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) } return eth.WeiToEth(*value), nil } @@ -73,11 +73,11 @@ func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { nodeSettingsContract, err := getNodeSettingsContract(rp) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { - return nil, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + return 0, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) } return eth.WeiToEth(*value), nil } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index e87e3db1b..838de7e49 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -67,11 +67,11 @@ func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.Transa func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { membersSettingsContract, err := getMembersSettingsContract(rp) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { - return nil, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) + return 0, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) } return (*value).Uint64(), nil } From 0ed5c5f2d3e6490bd9aac46f9925c7ab7f082467 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:54:25 +1000 Subject: [PATCH 230/878] updating existing unit tests --- tests/deposit/deposit_test.go | 4 ++-- tests/minipool/contract_test.go | 4 ++-- tests/settings/deposit_test.go | 10 +++++----- tests/settings/minipool_test.go | 6 +++--- tests/settings/network_test.go | 18 +++++++++--------- tests/settings/node_test.go | 4 ++-- tests/testutils/tokens/neth.go | 4 ++-- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 6dbb796fa..f9de9127d 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -49,7 +49,7 @@ func TestAssignDeposits(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Disable deposit assignments - if _, err := protocol.SetAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Make user deposit userDepositOpts := userAccount.GetTransactor() @@ -65,7 +65,7 @@ func TestAssignDeposits(t *testing.T) { if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } // Re-enable deposit assignments - if _, err := protocol.SetAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get initial deposit pool balance balance1, err := deposit.GetBalance(rp, nil) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index c070eb2ca..5b19bcba8 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -215,7 +215,7 @@ func TestWithdraw(t *testing.T) { // Disable minipool withdrawal delay withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) if err != nil { t.Fatal(err) } - if _, err := protocol.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Withdraw minipool if _, err := mp.Withdraw(nodeAccount.GetTransactor()); err != nil { @@ -223,7 +223,7 @@ func TestWithdraw(t *testing.T) { } // Re-enable minipool withdrawal delay - if _, err := protocol.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated minipool exists status if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { diff --git a/tests/settings/deposit_test.go b/tests/settings/deposit_test.go index 065d8b35c..4647cb80f 100644 --- a/tests/settings/deposit_test.go +++ b/tests/settings/deposit_test.go @@ -18,7 +18,7 @@ func TestDepositSettings(t *testing.T) { // Set & get deposits enabled depositEnabled := false - if _, err := protocol.SetDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetDepositEnabled(rp, nil); err != nil { t.Error(err) @@ -28,7 +28,7 @@ func TestDepositSettings(t *testing.T) { // Set & get deposit assignments enabled assignDepositsEnabled := false - if _, err := protocol.SetAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetAssignDepositsEnabled(rp, nil); err != nil { t.Error(err) @@ -38,7 +38,7 @@ func TestDepositSettings(t *testing.T) { // Set & get minimum deposit amount minimumDeposit := eth.EthToWei(1000) - if _, err := protocol.SetMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinimumDeposit(rp, nil); err != nil { t.Error(err) @@ -48,7 +48,7 @@ func TestDepositSettings(t *testing.T) { // Set & get maximum deposit pool size maximumDepositPoolSize := eth.EthToWei(1) - if _, err := protocol.SetMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMaximumDepositPoolSize(rp, nil); err != nil { t.Error(err) @@ -58,7 +58,7 @@ func TestDepositSettings(t *testing.T) { // Set & get maximum deposit assignments var maximumDepositAssignments uint64 = 50 - if _, err := protocol.SetMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMaximumDepositAssignments(rp, nil); err != nil { t.Error(err) diff --git a/tests/settings/minipool_test.go b/tests/settings/minipool_test.go index ed70389ba..1491768c2 100644 --- a/tests/settings/minipool_test.go +++ b/tests/settings/minipool_test.go @@ -58,7 +58,7 @@ func TestMinipoolSettings(t *testing.T) { // Set & get submit withdrawable enabled submitWithdrawableEnabled := false - if _, err := protocol.SetMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { t.Error(err) @@ -68,7 +68,7 @@ func TestMinipoolSettings(t *testing.T) { // Set & get minipool launch timeout var minipoolLaunchTimeout uint64 = 5 - if _, err := protocol.SetMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinipoolLaunchTimeout(rp, nil); err != nil { t.Error(err) @@ -78,7 +78,7 @@ func TestMinipoolSettings(t *testing.T) { // Set & get minipool withdrawal delay var minipoolWithdrawalDelay uint64 = 5 - if _, err := protocol.SetMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinipoolWithdrawalDelay(rp, nil); err != nil { t.Error(err) diff --git a/tests/settings/network_test.go b/tests/settings/network_test.go index 0eefbef3f..4384d698a 100644 --- a/tests/settings/network_test.go +++ b/tests/settings/network_test.go @@ -18,7 +18,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get node consensus threshold nodeConsensusThreshold := 0.1 - if _, err := protocol.SetNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetNodeConsensusThreshold(rp, nil); err != nil { t.Error(err) @@ -28,7 +28,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get network balance submissions enabled submitBalancesEnabled := false - if _, err := protocol.SetSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetSubmitBalancesEnabled(rp, nil); err != nil { t.Error(err) @@ -38,7 +38,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get network balance submission frequency var submitBalancesFrequency uint64 = 10 - if _, err := protocol.SetSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetSubmitBalancesFrequency(rp, nil); err != nil { t.Error(err) @@ -48,7 +48,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get process withdrawals enabled processWithdrawalsEnabled := false - if _, err := protocol.SetProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetProcessWithdrawalsEnabled(rp, nil); err != nil { t.Error(err) @@ -58,7 +58,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get minimum node fee minimumNodeFee := 0.80 - if _, err := protocol.SetMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinimumNodeFee(rp, nil); err != nil { t.Error(err) @@ -68,7 +68,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get target node fee targetNodeFee := 0.85 - if _, err := protocol.SetTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetTargetNodeFee(rp, nil); err != nil { t.Error(err) @@ -78,7 +78,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get maximum node fee maximumNodeFee := 0.90 - if _, err := protocol.SetMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMaximumNodeFee(rp, nil); err != nil { t.Error(err) @@ -88,7 +88,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get node fee demand range nodeFeeDemandRange := eth.EthToWei(10) - if _, err := protocol.SetNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetNodeFeeDemandRange(rp, nil); err != nil { t.Error(err) @@ -98,7 +98,7 @@ func TestNetworkSettings(t *testing.T) { // Set & get target rETH collateral rate targetRethCollateralRate := 0.95 - if _, err := protocol.SetTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetTargetRethCollateralRate(rp, nil); err != nil { t.Error(err) diff --git a/tests/settings/node_test.go b/tests/settings/node_test.go index 5ee10f551..9e86067d5 100644 --- a/tests/settings/node_test.go +++ b/tests/settings/node_test.go @@ -17,7 +17,7 @@ func TestNodeSettings(t *testing.T) { // Set & get node registrations enabled nodeRegistrationsEnabled := false - if _, err := protocol.SetNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetNodeRegistrationEnabled(rp, nil); err != nil { t.Error(err) @@ -27,7 +27,7 @@ func TestNodeSettings(t *testing.T) { // Set & get node deposits enabled nodeDepositsEnabled := false - if _, err := protocol.SetNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + if _, err := protocol.BootstrapNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetNodeDepositEnabled(rp, nil); err != nil { t.Error(err) diff --git a/tests/testutils/tokens/neth.go b/tests/testutils/tokens/neth.go index 66214d5ee..7a2796b1f 100644 --- a/tests/testutils/tokens/neth.go +++ b/tests/testutils/tokens/neth.go @@ -32,14 +32,14 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trusted // Disable minipool withdrawal delay withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) if err != nil { return err } - if _, err := protocol.SetMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } // Mark minipool as withdrawable and withdraw if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return err } if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } // Re-enable minipool withdrawal delay - if _, err := protocol.SetMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } // Return return nil From 1620b163733f618da468516506df1cdf27410d7a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 11:56:41 +1000 Subject: [PATCH 231/878] various bugfixes --- tokens/rpl.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tokens/rpl.go b/tokens/rpl.go index 4aa8fd34f..fcbf13d96 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -1,6 +1,7 @@ package tokens import ( + "fmt" "math/big" "sync" From abc0bfdb8a77d55efe68b1bf74ff4be74e853bd3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 12:20:49 +1000 Subject: [PATCH 232/878] updating existing unit tests --- tests/testutils/node/node.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index 779ac45f0..1a790397a 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -1,6 +1,9 @@ package node import ( + "fmt" + + "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -8,10 +11,15 @@ import ( ) +// Trusted node counter +var trustedNodeIndex = 0 + + // Register a trusted node func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := node.SetNodeTrusted(rp, trustedNodeAccount.Address, true, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := trustednode.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } + trustedNodeIndex++ return nil } From a723a4261e3d5e546fbff7d0eae94d049d1d3071 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 14:47:00 +1000 Subject: [PATCH 233/878] implementing unit test helpers --- tests/testutils/tokens/rpl.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/testutils/tokens/rpl.go diff --git a/tests/testutils/tokens/rpl.go b/tests/testutils/tokens/rpl.go new file mode 100644 index 000000000..e1ec3416d --- /dev/null +++ b/tests/testutils/tokens/rpl.go @@ -0,0 +1,33 @@ +package tokens + +import ( + "fmt" + "math/big" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +// Mint an amount of RPL to an account +func MintRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { + if err := MintFixedSupplyRPL(rp, ownerAccount, toAccount, amount); err != nil { return err } + if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, amount, toAccount.GetTransactor()); err != nil { return err } + return nil +} + + +// Mint an amount of fixed-supply RPL to an account +func MintFixedSupplyRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { + rocketTokenFixedSupplyRPL, err := rp.GetContract("rocketTokenRPLFixedSupply") + if err != nil { + return err + } + if _, err := rocketTokenFixedSupplyRPL.Transact(ownerAccount.GetTransactor(), "mint", toAccount.Address, amount); err != nil { + return fmt.Errorf("Could not mint fixed-supply RPL tokens to %s: %w", toAccount.Address.Hex(), err) + } + return nil +} + From 84cf00b3e839869c2c2dff36088b1686b2eb9f1f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 14:48:32 +1000 Subject: [PATCH 234/878] implementing unit test helpers --- tests/testutils/minipool/minipool.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 0a48d03c6..da863527a 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -7,8 +7,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" @@ -66,3 +68,24 @@ func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount } + +// Get the RPL required per minipool +func GetMinipoolRPLRequired(rp *rocketpool.RocketPool) (*big.Int, error) { + + // Get data + depositUserAmount, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil) + if err != nil { return err } + minimumPerMinipoolStake, err := protocol.GetMinimumPerMinipoolStake(rp, nil) + if err != nil { return err } + rplPrice, err := network.GetRPLPrice(rp, nil) + if err != nil { return err } + + // Calculate and return RPL required + var tmp big.Int + var rplRequired big.Int + tmp.Mul(depositUserAmount, minimumPerMinipoolStake) + rplRequired.Quo(tmp, rplPrice) + return &rplRequired, nil + +} + From a4fc9f33d55ce64b6c08887115a536fa38e6345c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 14:52:38 +1000 Subject: [PATCH 235/878] implementing unit test helpers --- tests/testutils/minipool/minipool.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index da863527a..d31a2844f 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" @@ -74,17 +75,17 @@ func GetMinipoolRPLRequired(rp *rocketpool.RocketPool) (*big.Int, error) { // Get data depositUserAmount, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil) - if err != nil { return err } + if err != nil { return nil, err } minimumPerMinipoolStake, err := protocol.GetMinimumPerMinipoolStake(rp, nil) - if err != nil { return err } + if err != nil { return nil, err } rplPrice, err := network.GetRPLPrice(rp, nil) - if err != nil { return err } + if err != nil { return nil, err } // Calculate and return RPL required var tmp big.Int var rplRequired big.Int - tmp.Mul(depositUserAmount, minimumPerMinipoolStake) - rplRequired.Quo(tmp, rplPrice) + tmp.Mul(depositUserAmount, eth.EthToWei(minimumPerMinipoolStake)) + rplRequired.Quo(&tmp, rplPrice) return &rplRequired, nil } From c933b124993b4f74fed7e7464ff9d9c430f921fa Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 15:13:08 +1000 Subject: [PATCH 236/878] implementing unit test helpers --- tests/minipool/contract_test.go | 12 +++++----- tests/minipool/minipool_test.go | 2 +- tests/minipool/queue_test.go | 12 +++++----- tests/minipool/status_test.go | 2 +- tests/network/withdrawal_test.go | 2 +- tests/testutils/minipool/minipool.go | 8 ++++++- tests/testutils/node/staking.go | 31 +++++++++++++++++++++++++ tests/testutils/tokens/neth.go | 2 +- tests/testutils/tokens/{ => rpl}/rpl.go | 12 +++++++++- 9 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 tests/testutils/node/staking.go rename tests/testutils/tokens/{ => rpl}/rpl.go (77%) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 5b19bcba8..c141f6386 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -34,7 +34,7 @@ func TestDetails(t *testing.T) { if err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) if err != nil { t.Fatal(err) } // Make user deposit @@ -112,7 +112,7 @@ func TestRefund(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) if err != nil { t.Fatal(err) } // Make user deposit @@ -152,7 +152,7 @@ func TestStake(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) if err != nil { t.Fatal(err) } // Get validator & deposit data @@ -196,7 +196,7 @@ func TestWithdraw(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) if err != nil { t.Fatal(err) } // Stake minipool @@ -245,7 +245,7 @@ func TestDissolve(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) if err != nil { t.Fatal(err) } // Get & check initial minipool status @@ -280,7 +280,7 @@ func TestClose(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) if err != nil { t.Fatal(err) } // Dissolve minipool diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index 005957c83..f80f30aad 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -52,7 +52,7 @@ func TestMinipoolDetails(t *testing.T) { minipoolWithdrawalAmount := eth.EthToWei(34) // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, minipoolDepositAmount) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, minipoolDepositAmount) if err != nil { t.Fatal(err) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index 507aee351..d272650a7 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -42,7 +42,7 @@ func TestQueueLengths(t *testing.T) { } // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { @@ -63,7 +63,7 @@ func TestQueueLengths(t *testing.T) { } // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { @@ -84,7 +84,7 @@ func TestQueueLengths(t *testing.T) { } // Create empty deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { @@ -133,7 +133,7 @@ func TestQueueCapacity(t *testing.T) { } // Create empty deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { @@ -151,7 +151,7 @@ func TestQueueCapacity(t *testing.T) { } // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { @@ -169,7 +169,7 @@ func TestQueueCapacity(t *testing.T) { } // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index 62221afd8..0bb72cb86 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -39,7 +39,7 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) if err != nil { t.Fatal(err) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go index aae9ac789..04a4ea983 100644 --- a/tests/network/withdrawal_test.go +++ b/tests/network/withdrawal_test.go @@ -76,7 +76,7 @@ func TestProcessWithdrawal(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) if err != nil { t.Fatal(err) } // Make user deposit diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index d31a2844f..b11e71fae 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -14,6 +14,7 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -27,7 +28,12 @@ type minipoolCreated struct { // Create a minipool -func CreateMinipool(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int) (*minipool.Minipool, error) { +func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, depositAmount *big.Int) (*minipool.Minipool, error) { + + // Mint & stake RPL required for mininpool + rplRequired, err := GetMinipoolRPLRequired(rp) + if err != nil { return nil, err } + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { return nil, err } // Make node deposit opts := nodeAccount.GetTransactor() diff --git a/tests/testutils/node/staking.go b/tests/testutils/node/staking.go new file mode 100644 index 000000000..5c4ebb5da --- /dev/null +++ b/tests/testutils/node/staking.go @@ -0,0 +1,31 @@ +package node + +import ( + "math/big" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +// Mint & stake an amount of RPL against a node +func StakeRPL(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, amount *big.Int) error { + + // Get RocketNodeStaking contract address + rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") + if err != nil { return err } + + // Mint, approve & stake RPL + if err := rpl.MintRPL(rp, ownerAccount, nodeAccount, amount); err != nil { return err } + if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, amount, nodeAccount.GetTransactor()); err != nil { return err } + if _, err := node.StakeRPL(rp, amount, nodeAccount.GetTransactor()); err != nil { return err } + + // Return + return nil + +} + diff --git a/tests/testutils/tokens/neth.go b/tests/testutils/tokens/neth.go index 7a2796b1f..8c08b5641 100644 --- a/tests/testutils/tokens/neth.go +++ b/tests/testutils/tokens/neth.go @@ -25,7 +25,7 @@ func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trusted } // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, toAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, toAccount, eth.EthToWei(32)) if err != nil { return err } if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return err } diff --git a/tests/testutils/tokens/rpl.go b/tests/testutils/tokens/rpl/rpl.go similarity index 77% rename from tests/testutils/tokens/rpl.go rename to tests/testutils/tokens/rpl/rpl.go index e1ec3416d..0573e323e 100644 --- a/tests/testutils/tokens/rpl.go +++ b/tests/testutils/tokens/rpl/rpl.go @@ -1,4 +1,4 @@ -package tokens +package rpl import ( "fmt" @@ -13,9 +13,19 @@ import ( // Mint an amount of RPL to an account func MintRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { + + // Get RPL token contract address + rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") + if err != nil { return err } + + // Mint, approve & swap fixed-supply RPL if err := MintFixedSupplyRPL(rp, ownerAccount, toAccount, amount); err != nil { return err } + if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, amount, toAccount.GetTransactor()); err != nil { return err } if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, amount, toAccount.GetTransactor()); err != nil { return err } + + // Return return nil + } From 5f2048e23995dbb5d4b01d8894ec75c92c68f7e8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 15:21:14 +1000 Subject: [PATCH 237/878] implementing unit test helpers --- tests/deposit/deposit_test.go | 9 +++------ tests/testutils/node/staking.go | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index f9de9127d..9d0896b21 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -9,6 +9,7 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" ) @@ -56,13 +57,9 @@ func TestAssignDeposits(t *testing.T) { userDepositOpts.Value = eth.EthToWei(32) if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - // Register node + // Register node & create minipool if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Make node deposit - nodeDepositOpts := nodeAccount.GetTransactor() - nodeDepositOpts.Value = eth.EthToWei(16) - if _, err := node.Deposit(rp, 0, nodeDepositOpts); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Re-enable deposit assignments if _, err := protocol.BootstrapAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/testutils/node/staking.go b/tests/testutils/node/staking.go index 5c4ebb5da..39207ac4d 100644 --- a/tests/testutils/node/staking.go +++ b/tests/testutils/node/staking.go @@ -8,7 +8,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -20,7 +20,7 @@ func StakeRPL(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Acc if err != nil { return err } // Mint, approve & stake RPL - if err := rpl.MintRPL(rp, ownerAccount, nodeAccount, amount); err != nil { return err } + if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, amount); err != nil { return err } if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, amount, nodeAccount.GetTransactor()); err != nil { return err } if _, err := node.StakeRPL(rp, amount, nodeAccount.GetTransactor()); err != nil { return err } From 31310bbfd0df99391f872a9bd2f8f95db7601e05 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 15:23:18 +1000 Subject: [PATCH 238/878] implementing unit test helpers --- tests/testutils/tokens/{ => neth}/neth.go | 0 tests/testutils/tokens/{ => reth}/reth.go | 0 tests/tokens/neth_test.go | 8 ++++---- tests/tokens/reth_test.go | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) rename tests/testutils/tokens/{ => neth}/neth.go (100%) rename tests/testutils/tokens/{ => reth}/reth.go (100%) diff --git a/tests/testutils/tokens/neth.go b/tests/testutils/tokens/neth/neth.go similarity index 100% rename from tests/testutils/tokens/neth.go rename to tests/testutils/tokens/neth/neth.go diff --git a/tests/testutils/tokens/reth.go b/tests/testutils/tokens/reth/reth.go similarity index 100% rename from tests/testutils/tokens/reth.go rename to tests/testutils/tokens/reth/reth.go diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index 49de259a4..a94e76c25 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -11,7 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" + nethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/neth" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -28,7 +28,7 @@ func TestNETHBalances(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Get & check nETH total supply if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { @@ -56,7 +56,7 @@ func TestTransferNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Transfer nETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") @@ -84,7 +84,7 @@ func TestBurnNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := tokenutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Transfer validator balance opts := userAccount.GetTransactor() diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index d1c0688f1..89699d798 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -11,7 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - tokenutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens" + rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" ) @@ -26,7 +26,7 @@ func TestRETHBalances(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Get & check rETH total supply if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { @@ -53,7 +53,7 @@ func TestTransferRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Transfer rETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") @@ -80,7 +80,7 @@ func TestBurnRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := tokenutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } // Get initial balances balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) From 79845782760f3a1678152372ad92f497027962d5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 11 Feb 2021 15:49:57 +1000 Subject: [PATCH 239/878] updating existing unit tests --- tests/node/deposit_test.go | 7 +++++++ tests/node/main_test.go | 3 +++ tests/testutils/node/node.go | 25 +++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index 47d32689d..08a0ce251 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -8,6 +8,8 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -28,6 +30,11 @@ func TestDeposit(t *testing.T) { t.Fatal(err) } + // Mint & stake RPL required for mininpool + rplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) + if err != nil { t.Fatal(err) } + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { t.Fatal(err) } + // Deposit opts := nodeAccount.GetTransactor() opts.Value = eth.EthToWei(16) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 58dbcfe0f..34f51a13a 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -19,6 +19,7 @@ var ( client *ethclient.Client rp *rocketpool.RocketPool + ownerAccount *accounts.Account nodeAccount *accounts.Account ) @@ -35,6 +36,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index 1a790397a..6c0f597b8 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -6,8 +6,11 @@ import ( "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -17,9 +20,31 @@ var trustedNodeIndex = 0 // Register a trusted node func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { + + // Register node if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Bootstrap trusted node DAO member if _, err := trustednode.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } + + // Get RPL bond amount + rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) + if err != nil { return err } + + // Get RocketDAONodeTrustedActions contract address + rocketDAONodeTrustedActionsAddress, err := rp.GetAddress("rocketDAONodeTrustedActions") + if err != nil { return err } + + // Mint RPL to node & allow trusted node DAO contract to spend it + if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { return err } + if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Join trusted node DAO + if _, err := trustednode.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Increment trusted node counter & return trustedNodeIndex++ return nil + } From 1a70d1dfd421f665b08c087bdd678ff98b00eba8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 12 Feb 2021 09:36:43 +1000 Subject: [PATCH 240/878] updating network unit tests --- tests/network/prices_test.go | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 tests/network/prices_test.go diff --git a/tests/network/prices_test.go b/tests/network/prices_test.go new file mode 100644 index 000000000..94832e358 --- /dev/null +++ b/tests/network/prices_test.go @@ -0,0 +1,45 @@ +package network + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +func TestSubmitPrices(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Submit prices + var pricesBlock uint64 = 100 + rplPrice := eth.EthToWei(1000) + if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check network prices block + if networkPricesBlock, err := network.GetPricesBlock(rp, nil); err != nil { + t.Error(err) + } else if networkPricesBlock != pricesBlock { + t.Errorf("Incorrect network prices block %d", networkPricesBlock) + } + + // Get & check network RPL price + if networkRplPrice, err := network.GetRPLPrice(rp, nil); err != nil { + t.Error(err) + } else if networkRplPrice.Cmp(rplPrice) != 0 { + t.Errorf("Incorrect network RPL price %s", networkRplPrice.String()) + } + +} + From c7338a9d7591d6ab7fe117a71ee88f4e2983e8b4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 12 Feb 2021 10:28:26 +1000 Subject: [PATCH 241/878] updating node unit tests --- tests/node/node_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index fac8a6e7e..411af22c4 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -4,6 +4,8 @@ import ( "bytes" "testing" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -49,6 +51,9 @@ func TestRegisterNode(t *testing.T) { if !nodeDetails.Exists { t.Error("Incorrect node exists status") } + if !bytes.Equal(nodeDetails.WithdrawalAddress.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeDetails.WithdrawalAddress.Hex()) + } if nodeDetails.TimezoneLocation != timezoneLocation { t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) } @@ -57,6 +62,33 @@ func TestRegisterNode(t *testing.T) { } +func TestSetWithdrawalAddress(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set withdrawal address + withdrawalAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := node.SetWithdrawalAddress(rp, withdrawalAddress, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node withdrawal address + if nodeWithdrawalAddress, err := node.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) + } + +} + + func TestSetTimezoneLocation(t *testing.T) { // State snapshotting From 90736c73d1c8a6eaeea7bcfe0490ea736519eb4b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 09:45:01 +1000 Subject: [PATCH 242/878] implementing eth1 withdrawals changes --- minipool/minipool-contract.go | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 9c4f6295c..2862b3f84 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -29,6 +29,7 @@ type NodeDetails struct { DepositBalance *big.Int `json:"depositBalance"` RefundBalance *big.Int `json:"refundBalance"` DepositAssigned bool `json:"depositAssigned"` + Withdrawn bool `json:"withdrawn"` } type UserDetails struct { DepositBalance *big.Int `json:"depositBalance"` @@ -38,6 +39,7 @@ type UserDetails struct { type StakingDetails struct { StartBalance *big.Int `json:"startBalance"` EndBalance *big.Int `json:"endBalance"` + BalanceWithdrawn bool `json:"balanceWithdrawn"` } @@ -149,6 +151,7 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { var depositBalance *big.Int var refundBalance *big.Int var depositAssigned bool + var withdrawn bool // Load data wg.Go(func() error { @@ -176,6 +179,11 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { depositAssigned, err = mp.GetNodeDepositAssigned(opts) return err }) + wg.Go(func() error { + var err error + withdrawn, err = mp.GetNodeWithdrawn(opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -189,6 +197,7 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { DepositBalance: depositBalance, RefundBalance: refundBalance, DepositAssigned: depositAssigned, + Withdrawn: withdrawn, }, nil } @@ -227,6 +236,13 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { } return *nodeDepositAssigned, nil } +func (mp *Minipool) GetNodeWithdrawn(opts *bind.CallOpts) (bool, error) { + nodeWithdrawn := new(bool) + if err := mp.Contract.Call(opts, nodeWithdrawn, "getNodeWithdrawn"); err != nil { + return false, fmt.Errorf("Could not get minipool %s node withdrawn status: %w", mp.Address.Hex(), err) + } + return *nodeWithdrawn, nil +} // Get user deposit details @@ -298,6 +314,7 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro var wg errgroup.Group var startBalance *big.Int var endBalance *big.Int + var balanceWithdrawn bool // Load data wg.Go(func() error { @@ -310,6 +327,11 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro endBalance, err = mp.GetStakingEndBalance(opts) return err }) + wg.Go(func() error { + var err error + balanceWithdrawn, err = mp.GetValidatorBalanceWithdrawn(opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -320,6 +342,7 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro return StakingDetails{ StartBalance: startBalance, EndBalance: endBalance, + BalanceWithdrawn: balanceWithdrawn, }, nil } @@ -337,6 +360,23 @@ func (mp *Minipool) GetStakingEndBalance(opts *bind.CallOpts) (*big.Int, error) } return *stakingEndBalance, nil } +func (mp *Minipool) GetValidatorBalanceWithdrawn(opts *bind.CallOpts) (bool, error) { + validatorBalanceWithdrawn := new(bool) + if err := mp.Contract.Call(opts, validatorBalanceWithdrawn, "getValidatorBalanceWithdrawn"); err != nil { + return false, fmt.Errorf("Could not get minipool %s validator balance withdrawn status: %w", mp.Address.Hex(), err) + } + return *validatorBalanceWithdrawn, nil +} + + +// Get withdrawal credentials +func (mp *Minipool) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) { + withdrawalCredentials := new(common.Hash) + if err := mp.Contract.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { + return common.Hash{}, fmt.Errorf("Could not get minipool %s withdrawal credentials: %w", mp.Address.Hex(), err) + } + return *withdrawalCredentials, nil +} // Refund node ETH from the minipool From 6b1cd711d36bb54c44884b7bd6927608407ece25 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 09:47:16 +1000 Subject: [PATCH 243/878] implementing eth1 withdrawals changes --- minipool/minipool.go | 78 -------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index d3900d36e..00f36011e 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -43,16 +43,6 @@ func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDet } -// Get unprocessed minipool details -func GetUnprocessedMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { - minipoolAddresses, err := GetUnprocessedMinipoolAddresses(rp, opts) - if err != nil { - return []MinipoolDetails{}, err - } - return loadMinipoolDetails(rp, minipoolAddresses, opts); -} - - // Get a node's minipool details func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) @@ -138,46 +128,6 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com } -// Get unprocessed minipool addresses -func GetUnprocessedMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - - // Get minipool count - minipoolCount, err := GetUnprocessedMinipoolCount(rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Load minipool addresses in batches - addresses := make([]common.Address, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MinipoolAddressBatchSize - if mei > minipoolCount { mei = minipoolCount } - - // Load addresses - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetUnprocessedMinipoolAt(rp, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil - -} - - // Get a node's minipool addresses func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { @@ -356,34 +306,6 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) } -// Get the unprocessed minipool count -func GetUnprocessedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getUnprocessedMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get unprocessed minipool count: %w", err) - } - return (*minipoolCount).Uint64(), nil -} - - -// Get an unprocessed minipool address by index -func GetUnprocessedMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getUnprocessedMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get unprocessed minipool %d address: %w", index, err) - } - return *minipoolAddress, nil -} - - // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) From 45712b744be1734f57a9928d254f0436ec126de4 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 09:57:04 +1000 Subject: [PATCH 244/878] implementing eth1 withdrawals changes --- network/withdrawal.go | 66 ++++++++----------------------------------- 1 file changed, 11 insertions(+), 55 deletions(-) diff --git a/network/withdrawal.go b/network/withdrawal.go index 6f6822a11..1c55496fc 100644 --- a/network/withdrawal.go +++ b/network/withdrawal.go @@ -2,7 +2,6 @@ package network import ( "fmt" - "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -10,75 +9,32 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" ) -// Get the withdrawal pool balance -func GetWithdrawalBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// Get the system withdrawal contract address +func GetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { - return nil, err - } - balance := new(*big.Int) - if err := rocketNetworkWithdrawal.Call(opts, balance, "getBalance"); err != nil { - return nil, fmt.Errorf("Could not get withdrawal pool balance: %w", err) - } - return *balance, nil -} - - -// Get the current network validator withdrawal credentials -func GetWithdrawalCredentials(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Hash, error) { - rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) - if err != nil { - return common.Hash{}, err - } - withdrawalCredentials := new(common.Hash) - if err := rocketNetworkWithdrawal.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { - return common.Hash{}, fmt.Errorf("Could not get network withdrawal credentials: %w", err) - } - return *withdrawalCredentials, nil -} - - -// Set the network validator withdrawal credentials -func SetWithdrawalCredentials(rp *rocketpool.RocketPool, withdrawalCredentials common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "setWithdrawalCredentials", withdrawalCredentials.Bytes()) - if err != nil { - return nil, fmt.Errorf("Could not set network withdrawal credentials: %w", err) - } - return txReceipt, nil -} - - -// Transfer a validator balance to the withdrawal contract -func TransferWithdrawal(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) - if err != nil { - return nil, err + return common.Address{}, err } - txReceipt, err := rocketNetworkWithdrawal.Transfer(opts) - if err != nil { - return nil, fmt.Errorf("Could not transfer validator balance: %w", err) + swcAddress := new(common.Address) + if err := rocketNetworkWithdrawal.Call(opts, swcAddress, "getSystemWithdrawalContractAddress"); err != nil { + return common.Address{}, fmt.Errorf("Could not get system withdrawal contract address: %w", err) } - return txReceipt, nil + return *swcAddress, nil } -// Process a validator withdrawal from the beacon chain -func ProcessWithdrawal(rp *rocketpool.RocketPool, validatorPubkey rptypes.ValidatorPubkey, opts *bind.TransactOpts) (*types.Receipt, error) { +// Set the system withdrawal contract address +func SetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, swcAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) if err != nil { return nil, err } - txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "processWithdrawal", validatorPubkey[:]) + txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "setSystemWithdrawalContractAddress", swcAddress) if err != nil { - return nil, fmt.Errorf("Could not process validator %s withdrawal: %w", validatorPubkey.Hex(), err) + return nil, fmt.Errorf("Could not set system withdrawal contract address: %w", err) } return txReceipt, nil } From 53c65ceb980544a5ce15d8240eb8f582a98870a2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 10:05:12 +1000 Subject: [PATCH 245/878] updating unit tests --- tests/minipool/minipool_test.go | 12 --- tests/network/withdrawal_test.go | 122 ++----------------------------- 2 files changed, 8 insertions(+), 126 deletions(-) diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index f80f30aad..db59d1a95 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -31,11 +31,6 @@ func TestMinipoolDetails(t *testing.T) { } else if len(minipools) != 0 { t.Error("Incorrect initial minipool count") } - if unprocessedMinipools, err := minipool.GetUnprocessedMinipools(rp, nil); err != nil { - t.Error(err) - } else if len(unprocessedMinipools) != 0 { - t.Error("Incorrect initial unprocessed minipool count") - } if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if len(nodeMinipools) != 0 { @@ -92,13 +87,6 @@ func TestMinipoolDetails(t *testing.T) { t.Error("Incorrect minipool withdrawal processed status") } } - if unprocessedMinipools, err := minipool.GetUnprocessedMinipools(rp, nil); err != nil { - t.Error(err) - } else if len(unprocessedMinipools) != 1 { - t.Error("Incorrect updated unprocessed minipool count") - } else if !bytes.Equal(unprocessedMinipools[0].Address.Bytes(), mp.Address.Bytes()) { - t.Errorf("Incorrect unprocessed minipool address %s", unprocessedMinipools[0].Address.Hex()) - } if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if len(nodeMinipools) != 1 { diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go index 04a4ea983..d769a4290 100644 --- a/tests/network/withdrawal_test.go +++ b/tests/network/withdrawal_test.go @@ -6,135 +6,29 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) -func TestSetWithdrawalCredentials(t *testing.T) { +func TestSetSystemWithdrawalContractAddress(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Set withdrawal credentials - withdrawalCredentials := common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") - if _, err := network.SetWithdrawalCredentials(rp, withdrawalCredentials, ownerAccount.GetTransactor()); err != nil { + // Set SWC address + swcAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAddress, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get & check withdrawal credentials - if networkWithdrawalCredentials, err := network.GetWithdrawalCredentials(rp, nil); err != nil { + // Get & check SWC address + if networkSwcAddress, err := network.GetSystemWithdrawalContractAddress(rp, nil); err != nil { t.Error(err) - } else if !bytes.Equal(networkWithdrawalCredentials.Bytes(), withdrawalCredentials.Bytes()) { - t.Errorf("Incorrect network withdrawal credentials %s", networkWithdrawalCredentials.Hex()) - } - -} - - -func TestTransferWithdrawal(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Transfer validator balance - opts := userAccount.GetTransactor() - opts.Value = eth.EthToWei(50) - if _, err := network.TransferWithdrawal(rp, opts); err != nil { - t.Fatal(err) - } - - // Get & check withdrawal contract balance - if withdrawalBalance, err := network.GetWithdrawalBalance(rp, nil); err != nil { - t.Error(err) - } else if withdrawalBalance.Cmp(opts.Value) != 0 { - t.Errorf("Incorrect withdrawal contract balance %s", withdrawalBalance.String()) - } - -} - - -func TestProcessWithdrawal(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) - if err != nil { t.Fatal(err) } - - // Make user deposit - userDepositAmount := eth.EthToWei(16) - userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = userDepositAmount - if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Mark minipool as withdrawable - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Transfer validator balance - transferWithdrawalOpts := userAccount.GetTransactor() - transferWithdrawalOpts.Value = eth.EthToWei(32) - if _, err := network.TransferWithdrawal(rp, transferWithdrawalOpts); err != nil { t.Fatal(err) } - - // Get initial token contract ETH balances - nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - - // Process withdrawal - validatorPubkey, err := validator.GetValidatorPubkey() - if err != nil { t.Fatal(err) } - if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated token contract ETH balances - if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { - t.Error("nETH contract ETH balance did not increase after processing withdrawal") - } - if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { - t.Error("rETH contract ETH balance did not increase after processing withdrawal") - } - - // Get & check rETH collateral amount & rate - if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { - t.Fatal(err) - } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { - t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) - } - if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { - t.Fatal(err) - } else if rethCollateralRate != 1 { - t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } else if !bytes.Equal(networkSwcAddress.Bytes(), swcAddress.Bytes()) { + t.Errorf("Incorrect system withdrawal contract address %s", networkSwcAddress.Hex()) } } From 6ef3393de6b03060894818ed12d73a12122cf54f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 10:34:49 +1000 Subject: [PATCH 246/878] updating unit tests --- tests/testutils/tokens/neth/neth.go | 24 ++++++++++++------------ tests/tokens/main_test.go | 5 ++++- tests/tokens/neth_test.go | 24 +++++++++++------------- tests/tokens/reth_test.go | 6 +++--- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/tests/testutils/tokens/neth/neth.go b/tests/testutils/tokens/neth/neth.go index 8c08b5641..99e0bdcb2 100644 --- a/tests/testutils/tokens/neth/neth.go +++ b/tests/testutils/tokens/neth/neth.go @@ -15,34 +15,34 @@ import ( // Mint an amount of nETH to an account -func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { +func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) (*minipool.Minipool, error) { // Register node if not registered if nodeExists, err := node.GetNodeExists(rp, toAccount.Address, nil); err != nil { - return err + return nil, err } else if !nodeExists { - if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return err } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return nil, err } } // Create & stake minipool mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, toAccount, eth.EthToWei(32)) - if err != nil { return err } - if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return err } + if err != nil { return nil, err } + if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return nil, err } // Disable minipool withdrawal delay withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) - if err != nil { return err } - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return err } + if err != nil { return nil, err } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return nil, err } // Mark minipool as withdrawable and withdraw - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return nil, err } + if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return nil, err } // Re-enable minipool withdrawal delay - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return nil, err } - // Return - return nil + // Return created minipool + return mp, nil } diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 197164ade..1cb2d1393 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -22,6 +22,7 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account userAccount *accounts.Account + swcAccount *accounts.Account ) @@ -41,7 +42,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) + userAccount, err = accounts.GetAccount(8) + if err != nil { log.Fatal(err) } + swcAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index a94e76c25..3c66f0f16 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -12,11 +12,10 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" nethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/neth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) -// GetNETHContractETHBalance test under network.TestProcessWithdrawal +// GetNETHContractETHBalance test under minipool.TestWithdrawValidatorBalance func TestNETHBalances(t *testing.T) { @@ -28,7 +27,7 @@ func TestNETHBalances(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Get & check nETH total supply if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { @@ -56,7 +55,7 @@ func TestTransferNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } // Transfer nETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") @@ -84,17 +83,16 @@ func TestBurnNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + mp, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount) + if err != nil { t.Fatal(err) } - // Transfer validator balance - opts := userAccount.GetTransactor() - opts.Value = nethAmount - if _, err := network.TransferWithdrawal(rp, opts); err != nil { t.Fatal(err) } + // Set SWC address + if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Process validator withdrawal - validatorPubkey, err := validator.GetValidatorPubkey() - if err != nil { t.Fatal(err) } - if _, err := network.ProcessWithdrawal(rp, validatorPubkey, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Withdraw minipool validator balance + opts := swcAccount.GetTransactor() + opts.Value = nethAmount + if _, err := mp.Contract.Transfer(opts); err != nil { t.Fatal(err) } // Get initial balances balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 89699d798..9971ab8a5 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -15,7 +15,7 @@ import ( ) -// GetRETHContractETHBalance test under network.TestProcessWithdrawal +// GetRETHContractETHBalance test under minipool.TestWithdrawValidatorBalance func TestRETHBalances(t *testing.T) { @@ -148,7 +148,7 @@ func TestRETHExchangeRate(t *testing.T) { } -// GetRETHTotalCollateral test under network.TestProcessWithdrawal +// GetRETHTotalCollateral test under minipool.TestWithdrawValidatorBalance -// GetRETHCollateralRate test under network.TestProcessWithdrawal +// GetRETHCollateralRate test under minipool.TestWithdrawValidatorBalance From e4aab3cec1a72ceeb0ef455a4a2578269c137641 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 10:49:34 +1000 Subject: [PATCH 247/878] updating unit tests --- tests/config.go | 1 - tests/minipool/contract_test.go | 20 +++++++++++--------- tests/testutils/minipool/minipool.go | 4 +++- tests/testutils/validator/deposit-data.go | 6 ------ 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/tests/config.go b/tests/config.go index f702cf6e1..ae5682acf 100644 --- a/tests/config.go +++ b/tests/config.go @@ -13,7 +13,6 @@ const ( const ( ValidatorPubkey = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30e" ValidatorSignature = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e33" - WithdrawalCredentials = "00d77be6277f1cdcfce33fdcb127b95fe91e09eec04aecc521dc94866f0055f0" ) var AccountPrivateKeys = []string{ diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index c141f6386..568f5eb1e 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -158,9 +158,11 @@ func TestStake(t *testing.T) { // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey() if err != nil { t.Fatal(err) } + withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) + if err != nil { t.Fatal(err) } validatorSignature, err := validator.GetValidatorSignature() if err != nil { t.Fatal(err) } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) if err != nil { t.Fatal(err) } // Get & check initial minipool status @@ -205,11 +207,11 @@ func TestWithdraw(t *testing.T) { // Set minipool withdrawable status if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get & check initial minipool exists status - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + // Get & check initial minipool node withdrawn status + if nodeWithdrawn, err := mp.GetNodeWithdrawn(nil); err != nil { t.Error(err) - } else if !exists { - t.Error("Incorrect initial minipool exists status") + } else if nodeWithdrawn { + t.Error("Incorrect initial minipool node withdrawn status") } // Disable minipool withdrawal delay @@ -225,11 +227,11 @@ func TestWithdraw(t *testing.T) { // Re-enable minipool withdrawal delay if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get & check updated minipool exists status - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + // Get & check updated minipool node withdrawn status + if nodeWithdrawn, err := mp.GetNodeWithdrawn(nil); err != nil { t.Error(err) - } else if exists { - t.Error("Incorrect updated minipool exists status") + } else if !nodeWithdrawn { + t.Error("Incorrect updated minipool node withdrawn status") } } diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index b11e71fae..900390ed8 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -64,9 +64,11 @@ func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey() if err != nil { return err } + withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) + if err != nil { return err } validatorSignature, err := validator.GetValidatorSignature() if err != nil { return err } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, validator.GetWithdrawalCredentials(), validatorSignature) + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) if err != nil { return err } // Stake minipool & return diff --git a/tests/testutils/validator/deposit-data.go b/tests/testutils/validator/deposit-data.go index b7b8eced3..2f180374e 100644 --- a/tests/testutils/validator/deposit-data.go +++ b/tests/testutils/validator/deposit-data.go @@ -35,12 +35,6 @@ func GetValidatorSignature() (types.ValidatorSignature, error) { } -// Get the withdrawal credentials -func GetWithdrawalCredentials() common.Hash { - return common.HexToHash(tests.WithdrawalCredentials) -} - - // Get the validator deposit depositDataRoot func GetDepositDataRoot(validatorPubkey types.ValidatorPubkey, withdrawalCredentials common.Hash, validatorSignature types.ValidatorSignature) (common.Hash, error) { return ssz.HashTreeRoot(depositData{ From 797d8b641c4cc85f2f60c44ffcba50de4dc95640 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 11:22:00 +1000 Subject: [PATCH 248/878] updating minipool unit tests --- tests/minipool/contract_test.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 568f5eb1e..3907f5dbd 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -2,6 +2,7 @@ package minipool import ( "bytes" + "encoding/hex" "testing" "github.com/rocket-pool/rocketpool-go/deposit" @@ -77,6 +78,9 @@ func TestDetails(t *testing.T) { if !node.DepositAssigned { t.Error("Incorrect minipool node deposit assigned status") } + if node.Withdrawn { + t.Error("Incorrect minipool node withdrawn status") + } } if user, err := mp.GetUserDetails(nil); err != nil { t.Error(err) @@ -97,6 +101,19 @@ func TestDetails(t *testing.T) { if staking.EndBalance.Cmp(eth.EthToWei(36)) != 0 { t.Errorf("Incorrect minipool staking end balance %s", staking.EndBalance.String()) } + if staking.BalanceWithdrawn { + t.Error("Incorrect minipool validator balance withdrawn status") + } + } + if withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil); err != nil { + t.Error(err) + } else { + withdrawalPrefix := byte(1) + padding := make([]byte, 11) + expectedWithdrawalCredentials := bytes.Join([][]byte{[]byte{withdrawalPrefix}, padding, mp.Address.Bytes()}, []byte{}) + if !bytes.Equal(withdrawalCredentials.Bytes(), expectedWithdrawalCredentials) { + t.Errorf("Incorrect minipool withdrawal credentials %s", hex.EncodeToString(withdrawalCredentials.Bytes())) + } } } From ab295dfeef41472b87444bfbcfd5d3e7ca246ecd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 11:46:10 +1000 Subject: [PATCH 249/878] updating minipool unit tests --- tests/minipool/contract_test.go | 88 +++++++++++++++++++++++++++++++++ tests/minipool/main_test.go | 5 +- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 3907f5dbd..5b992b68f 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -10,6 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -326,3 +327,90 @@ func TestClose(t *testing.T) { } + +func TestWithdrawValidatorBalance(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Make user deposit + userDepositAmount := eth.EthToWei(16) + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = userDepositAmount + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Set SWC address + if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check initial minipool validator balance withdrawn status + if validatorBalanceWithdrawn, err := mp.GetValidatorBalanceWithdrawn(nil); err != nil { + t.Error(err) + } else if validatorBalanceWithdrawn { + t.Error("Incorrect initial minipool validator balance withdrawn status") + } + + // Get initial token contract ETH balances + nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Withdraw minipool validator balance + opts := swcAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + if _, err := mp.Contract.Transfer(opts); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool validator balance withdrawn status + if validatorBalanceWithdrawn, err := mp.GetValidatorBalanceWithdrawn(nil); err != nil { + t.Error(err) + } else if !validatorBalanceWithdrawn { + t.Error("Incorrect updated minipool validator balance withdrawn status") + } + + // Get & check updated token contract ETH balances + if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { + t.Error("nETH contract ETH balance did not increase after processing withdrawal") + } + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + + // Get & check rETH collateral amount & rate + if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { + t.Fatal(err) + } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { + t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) + } + if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { + t.Fatal(err) + } else if rethCollateralRate != 1 { + t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } + +} + diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 2a0b6797e..308421704 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -23,6 +23,7 @@ var ( trustedNodeAccount *accounts.Account nodeAccount *accounts.Account userAccount *accounts.Account + swcAccount *accounts.Account ) @@ -44,7 +45,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(2) if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) + userAccount, err = accounts.GetAccount(8) + if err != nil { log.Fatal(err) } + swcAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } // Run tests From 0f63128de4294d110c4797a1804388db23a7d085 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 12:16:37 +1000 Subject: [PATCH 250/878] updating node unit tests --- tests/node/staking_test.go | 145 +++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 tests/node/staking_test.go diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go new file mode 100644 index 000000000..369be4189 --- /dev/null +++ b/tests/node/staking_test.go @@ -0,0 +1,145 @@ +package node + +import ( + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +func TestStakeRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Mint RPL + rplAmount := eth.EthToWei(1000) + if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } + + // Approve RPL transfer for staking + rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") + if err != nil { t.Fatal(err) } + if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, rplAmount, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Check initial staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) + } + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial total effective RPL stake %s", totalEffectiveRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node effective RPL stake %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node minimum RPL stake %s", nodeMinimumRplStake.String()) + } + if nodeRplStakedBlock, err := node.GetNodeRPLStakedBlock(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStakedBlock != 0 { + t.Errorf("Incorrect initial node RPL staked block %d", nodeRplStakedBlock) + } + if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinipoolLimit != 0 { + t.Errorf("Incorrect initial node minipool limit %d", nodeMinipoolLimit) + } + + // Stake RPL + if _, err := node.StakeRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check updated staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated total RPL stake 1 %s", totalRplStake.String()) + } + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated total effective RPL stake 1 %s", totalEffectiveRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node RPL stake 1 %s", nodeRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node effective RPL stake 1 %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node minimum RPL stake 1 %s", nodeMinimumRplStake.String()) + } + if nodeRplStakedBlock, err := node.GetNodeRPLStakedBlock(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStakedBlock == 0 { + t.Errorf("Incorrect updated node RPL staked block 1 %d", nodeRplStakedBlock) + } + if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinipoolLimit == 0 { + t.Errorf("Incorrect updated node minipool limit 1 %d", nodeMinipoolLimit) + } + + // Make node deposit to create minipool + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := node.Deposit(rp, 0, opts); err != nil { t.Fatal(err) } + + // Check updated staking details + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated total effective RPL stake 2 %s", totalEffectiveRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node effective RPL stake 2 %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node minimum RPL stake 2 %s", nodeMinimumRplStake.String()) + } + +} + + +func TestWithdrawRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + +} + From 45ea4db6b41aadd2788253bf3ce660948a6e7b97 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 12:56:46 +1000 Subject: [PATCH 251/878] updating node unit tests --- tests/node/staking_test.go | 70 ++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 369be4189..d1dd912d5 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -5,10 +5,13 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -22,8 +25,13 @@ func TestStakeRPL(t *testing.T) { // Register node if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get RPL amount required for 2 minipools + minipoolRplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) + if err != nil { t.Fatal(err) } + rplAmount := new(big.Int) + rplAmount.Mul(minipoolRplRequired, big.NewInt(2)) + // Mint RPL - rplAmount := eth.EthToWei(1000) if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } // Approve RPL transfer for staking @@ -76,7 +84,7 @@ func TestStakeRPL(t *testing.T) { // Check updated staking details if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { t.Error(err) - } else if totalRplStake.Cmp(big.NewInt(0)) != 1 { + } else if totalRplStake.Cmp(rplAmount) != 0 { t.Errorf("Incorrect updated total RPL stake 1 %s", totalRplStake.String()) } if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { @@ -86,7 +94,7 @@ func TestStakeRPL(t *testing.T) { } if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeRplStake.Cmp(big.NewInt(0)) != 1 { + } else if nodeRplStake.Cmp(rplAmount) != 0 { t.Errorf("Incorrect updated node RPL stake 1 %s", nodeRplStake.String()) } if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { @@ -106,7 +114,7 @@ func TestStakeRPL(t *testing.T) { } if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeMinipoolLimit == 0 { + } else if nodeMinipoolLimit != 2 { t.Errorf("Incorrect updated node minipool limit 1 %d", nodeMinipoolLimit) } @@ -118,17 +126,17 @@ func TestStakeRPL(t *testing.T) { // Check updated staking details if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { t.Error(err) - } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 1 { + } else if totalEffectiveRplStake.Cmp(rplAmount) != 0 { t.Errorf("Incorrect updated total effective RPL stake 2 %s", totalEffectiveRplStake.String()) } if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 1 { + } else if nodeEffectiveRplStake.Cmp(rplAmount) != 0 { t.Errorf("Incorrect updated node effective RPL stake 2 %s", nodeEffectiveRplStake.String()) } if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 1 { + } else if nodeMinimumRplStake.Cmp(minipoolRplRequired) != 0 { t.Errorf("Incorrect updated node minimum RPL stake 2 %s", nodeMinimumRplStake.String()) } @@ -141,5 +149,53 @@ func TestWithdrawRPL(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Mint & stake RPL + rplAmount := eth.EthToWei(1000) + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } + + // Get & set rewards claim interval + rewardsClaimIntervalBlocks, err := protocol.GetRewardsClaimIntervalBlocks(rp, nil) + if err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Check initial staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) + } + + // Withdraw RPL + if _, err := node.WithdrawRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check updated staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated total RPL stake %s", totalRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node RPL stake %s", nodeRplStake.String()) + } + + // Reset rewards claim interval + if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + } From 22a349c9954c33fb374ac9e10aabb3d9725c2912 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 12:59:37 +1000 Subject: [PATCH 252/878] updating settings unit tests --- tests/settings/{ => protocol}/deposit_test.go | 2 +- tests/settings/{ => protocol}/main_test.go | 2 +- tests/settings/{ => protocol}/minipool_test.go | 2 +- tests/settings/{ => protocol}/network_test.go | 2 +- tests/settings/{ => protocol}/node_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename tests/settings/{ => protocol}/deposit_test.go (99%) rename tests/settings/{ => protocol}/main_test.go (98%) rename tests/settings/{ => protocol}/minipool_test.go (99%) rename tests/settings/{ => protocol}/network_test.go (99%) rename tests/settings/{ => protocol}/node_test.go (98%) diff --git a/tests/settings/deposit_test.go b/tests/settings/protocol/deposit_test.go similarity index 99% rename from tests/settings/deposit_test.go rename to tests/settings/protocol/deposit_test.go index 4647cb80f..a7e8c5e80 100644 --- a/tests/settings/deposit_test.go +++ b/tests/settings/protocol/deposit_test.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "testing" diff --git a/tests/settings/main_test.go b/tests/settings/protocol/main_test.go similarity index 98% rename from tests/settings/main_test.go rename to tests/settings/protocol/main_test.go index 5a9c05de0..47ea2a8dc 100644 --- a/tests/settings/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "log" diff --git a/tests/settings/minipool_test.go b/tests/settings/protocol/minipool_test.go similarity index 99% rename from tests/settings/minipool_test.go rename to tests/settings/protocol/minipool_test.go index 1491768c2..62469f2ca 100644 --- a/tests/settings/minipool_test.go +++ b/tests/settings/protocol/minipool_test.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "testing" diff --git a/tests/settings/network_test.go b/tests/settings/protocol/network_test.go similarity index 99% rename from tests/settings/network_test.go rename to tests/settings/protocol/network_test.go index 4384d698a..b2dbde9ee 100644 --- a/tests/settings/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "testing" diff --git a/tests/settings/node_test.go b/tests/settings/protocol/node_test.go similarity index 98% rename from tests/settings/node_test.go rename to tests/settings/protocol/node_test.go index 9e86067d5..8147aa822 100644 --- a/tests/settings/node_test.go +++ b/tests/settings/protocol/node_test.go @@ -1,4 +1,4 @@ -package settings +package protocol import ( "testing" From 4121361402b4e95238f5a089121ad860e4b61b4f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 14:59:37 +1000 Subject: [PATCH 253/878] updating settings unit tests --- tests/settings/protocol/network_test.go | 20 ++++++++++++++++++++ tests/settings/protocol/node_test.go | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tests/settings/protocol/network_test.go b/tests/settings/protocol/network_test.go index b2dbde9ee..755fa8b7a 100644 --- a/tests/settings/protocol/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -46,6 +46,26 @@ func TestNetworkSettings(t *testing.T) { t.Error("Incorrect network balance submission frequency value") } + // Set & get network price submissions enabled + submitPricesEnabled := false + if _, err := protocol.BootstrapSubmitPricesEnabled(rp, submitPricesEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitPricesEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitPricesEnabled { + t.Error("Incorrect network price submissions enabled value") + } + + // Set & get network price submission frequency + var submitPricesFrequency uint64 = 10 + if _, err := protocol.BootstrapSubmitPricesFrequency(rp, submitPricesFrequency, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitPricesFrequency(rp, nil); err != nil { + t.Error(err) + } else if value != submitPricesFrequency { + t.Error("Incorrect network price submission frequency value") + } + // Set & get process withdrawals enabled processWithdrawalsEnabled := false if _, err := protocol.BootstrapProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { diff --git a/tests/settings/protocol/node_test.go b/tests/settings/protocol/node_test.go index 8147aa822..f591a8fd7 100644 --- a/tests/settings/protocol/node_test.go +++ b/tests/settings/protocol/node_test.go @@ -35,5 +35,25 @@ func TestNodeSettings(t *testing.T) { t.Error("Incorrect node deposits enabled value") } + // Set & get minimum per minipool RPL stake + minimumPerMinipoolStake := 1.0 + if _, err := protocol.BootstrapMinimumPerMinipoolStake(rp, minimumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinimumPerMinipoolStake(rp, nil); err != nil { + t.Error(err) + } else if value != minimumPerMinipoolStake { + t.Error("Incorrect minimum per minipool stake value") + } + + // Set & get maximum per minipool RPL stake + maximumPerMinipoolStake := 10.0 + if _, err := protocol.BootstrapMaximumPerMinipoolStake(rp, maximumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMaximumPerMinipoolStake(rp, nil); err != nil { + t.Error(err) + } else if value != maximumPerMinipoolStake { + t.Error("Incorrect maximum per minipool stake value") + } + } From 0c3263d56f56a82c5a97b14d9d509f4ea4145532 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 15:18:48 +1000 Subject: [PATCH 254/878] updating settings unit tests --- tests/settings/protocol/auction_test.go | 90 +++++++++++++++++++++++ tests/settings/protocol/inflation_test.go | 49 ++++++++++++ tests/settings/protocol/rewards_test.go | 29 ++++++++ 3 files changed, 168 insertions(+) create mode 100644 tests/settings/protocol/auction_test.go create mode 100644 tests/settings/protocol/inflation_test.go create mode 100644 tests/settings/protocol/rewards_test.go diff --git a/tests/settings/protocol/auction_test.go b/tests/settings/protocol/auction_test.go new file mode 100644 index 000000000..334191cb6 --- /dev/null +++ b/tests/settings/protocol/auction_test.go @@ -0,0 +1,90 @@ +package protocol + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestAuctionSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get creat lots enabled + createLotEnabled := false + if _, err := protocol.BootstrapCreateLotEnabled(rp, createLotEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetCreateLotEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != createLotEnabled { + t.Error("Incorrect creat lots enabled value") + } + + // Set & get bid on lot enabled + bidOnLotEnabled := false + if _, err := protocol.BootstrapBidOnLotEnabled(rp, bidOnLotEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetBidOnLotEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != bidOnLotEnabled { + t.Error("Incorrect bid on lot enabled value") + } + + // Set & get lot minimum ETH value + lotMinimumEthValue := eth.EthToWei(1000) + if _, err := protocol.BootstrapLotMinimumEthValue(rp, lotMinimumEthValue, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotMinimumEthValue(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(lotMinimumEthValue) != 0 { + t.Error("Incorrect lot minimum ETH value value") + } + + // Set & get lot maximum ETH value + lotMaximumEthValue := eth.EthToWei(0.01) + if _, err := protocol.BootstrapLotMaximumEthValue(rp, lotMaximumEthValue, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotMaximumEthValue(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(lotMaximumEthValue) != 0 { + t.Error("Incorrect lot maximum ETH value value") + } + + // Set & get lot duration + var lotDuration uint64 = 1 + if _, err := protocol.BootstrapLotDuration(rp, lotDuration, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotDuration(rp, nil); err != nil { + t.Error(err) + } else if value != lotDuration { + t.Error("Incorrect lot duration value") + } + + // Set & get lot starting price ratio + lotStartingPriceRatio := 2.0 + if _, err := protocol.BootstrapLotStartingPriceRatio(rp, lotStartingPriceRatio, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotStartingPriceRatio(rp, nil); err != nil { + t.Error(err) + } else if value != lotStartingPriceRatio { + t.Error("Incorrect lot starting price ratio value") + } + + // Set & get lot reserve price ratio + lotReservePriceRatio := 1.9 + if _, err := protocol.BootstrapLotReservePriceRatio(rp, lotReservePriceRatio, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotReservePriceRatio(rp, nil); err != nil { + t.Error(err) + } else if value != lotReservePriceRatio { + t.Error("Incorrect lot reserve price ratio value") + } + +} + diff --git a/tests/settings/protocol/inflation_test.go b/tests/settings/protocol/inflation_test.go new file mode 100644 index 000000000..d2fad6b0d --- /dev/null +++ b/tests/settings/protocol/inflation_test.go @@ -0,0 +1,49 @@ +package protocol + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings/protocol" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestInflationSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get inflation interval rate + inflationIntervalRate := 0.5 + if _, err := protocol.BootstrapInflationIntervalRate(rp, inflationIntervalRate, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetInflationIntervalRate(rp, nil); err != nil { + t.Error(err) + } else if value != inflationIntervalRate { + t.Error("Incorrect inflation interval rate value") + } + + // Set & get inflation interval blocks + var inflationIntervalBlocks uint64 = 1 + if _, err := protocol.BootstrapInflationIntervalBlocks(rp, inflationIntervalBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetInflationIntervalBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != inflationIntervalBlocks { + t.Error("Incorrect inflation interval blocks value") + } + + // Set & get inflation start block + var inflationStartBlock uint64 = 1000000 + if _, err := protocol.BootstrapInflationStartBlock(rp, inflationStartBlock, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetInflationStartBlock(rp, nil); err != nil { + t.Error(err) + } else if value != inflationStartBlock { + t.Error("Incorrect inflation start block value") + } + +} + diff --git a/tests/settings/protocol/rewards_test.go b/tests/settings/protocol/rewards_test.go new file mode 100644 index 000000000..d40cd7493 --- /dev/null +++ b/tests/settings/protocol/rewards_test.go @@ -0,0 +1,29 @@ +package protocol + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings/protocol" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestRewardsSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get rewards claim interval blocks + var rewardsClaimIntervalBlocks uint64 = 1 + if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetRewardsClaimIntervalBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != rewardsClaimIntervalBlocks { + t.Error("Incorrect rewards claim interval blocks value") + } + +} + From 428c22f270d262d0e3866134fd664bfeaf6e4add Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 15:36:16 +1000 Subject: [PATCH 255/878] updating settings unit tests --- tests/settings/protocol/rewards_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/settings/protocol/rewards_test.go b/tests/settings/protocol/rewards_test.go index d40cd7493..3b8aea5ae 100644 --- a/tests/settings/protocol/rewards_test.go +++ b/tests/settings/protocol/rewards_test.go @@ -3,6 +3,7 @@ package protocol import ( "testing" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -15,6 +16,28 @@ func TestRewardsSettings(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Bootstrap a claimer & get claimer settings + claimerPerc := 0.1 + if _, err := protocoldao.BootstrapClaimer(rp, "rocketClaimNode", claimerPerc, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else { + if value, err := protocol.GetRewardsClaimerPerc(rp, "rocketClaimNode", nil); err != nil { + t.Error(err) + } else if value != claimerPerc { + t.Errorf("Incorrect rewards claimer percent %f", value) + } + if value, err := protocol.GetRewardsClaimerPercBlockUpdated(rp, "rocketClaimNode", nil); err != nil { + t.Error(err) + } else if value == 0 { + t.Errorf("Incorrect rewards claimer percent block updated %d", value) + } + if value, err := protocol.GetRewardsClaimersPercTotal(rp, nil); err != nil { + t.Error(err) + } else if value == 0 { + t.Errorf("Incorrect rewards claimers total percent %f", value) + } + } + // Set & get rewards claim interval blocks var rewardsClaimIntervalBlocks uint64 = 1 if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { From c2fd017fc9f7f6ac514a6cc425d40c7c0b99552d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 16:20:56 +1000 Subject: [PATCH 256/878] updating settings unit tests --- settings/trustednode/proposals.go | 30 ++++----- tests/settings/trustednode/main_test.go | 45 +++++++++++++ tests/settings/trustednode/members_test.go | 50 ++++++++++++++ tests/settings/trustednode/proposals_test.go | 69 ++++++++++++++++++++ 4 files changed, 179 insertions(+), 15 deletions(-) create mode 100644 tests/settings/trustednode/main_test.go create mode 100644 tests/settings/trustednode/members_test.go create mode 100644 tests/settings/trustednode/proposals_test.go diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 03318cc2c..53513b268 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -25,7 +25,7 @@ const ( // The cooldown period a member must wait after making a proposal before making another in blocks -func GetCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err @@ -36,16 +36,16 @@ func GetCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) } return (*value).Uint64(), nil } -func BootstrapCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } -func ProposeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } // The period a proposal can be voted on for in blocks -func GetVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err @@ -56,16 +56,16 @@ func GetVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, erro } return (*value).Uint64(), nil } -func BootstrapVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } // The delay after creation before a proposal can be voted on in blocks -func GetVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err @@ -76,16 +76,16 @@ func GetVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, } return (*value).Uint64(), nil } -func BootstrapVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } // The period during which a passed proposal can be executed in blocks -func GetExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err @@ -96,16 +96,16 @@ func GetExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } return (*value).Uint64(), nil } -func BootstrapExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } // The period during which an action can be performed on an executed proposal in blocks -func GetActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err @@ -116,10 +116,10 @@ func GetActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, er } return (*value).Uint64(), nil } -func BootstrapActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go new file mode 100644 index 000000000..28a4e7498 --- /dev/null +++ b/tests/settings/trustednode/main_test.go @@ -0,0 +1,45 @@ +package trustednode + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go new file mode 100644 index 000000000..a24a0a47f --- /dev/null +++ b/tests/settings/trustednode/members_test.go @@ -0,0 +1,50 @@ +package trustednode + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestMembersSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get quorum + quorum := 0.1 + if _, err := trustednode.BootstrapQuorum(rp, quorum, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { + t.Error(err) + } else if value != quorum { + t.Error("Incorrect quorum value") + } + + // Set & get rpl bond + rplBond := eth.EthToWei(1) + if _, err := trustednode.BootstrapRPLBond(rp, rplBond, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(rplBond) != 0 { + t.Error("Incorrect rpl bond value") + } + + // Set & get maximum unbonded minipools + var minipoolUnbondedMax uint64 = 1 + if _, err := trustednode.BootstrapMinipoolUnbondedMax(rp, minipoolUnbondedMax, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolUnbondedMax { + t.Error("Incorrect maximum unbonded minipools value") + } + +} + diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go new file mode 100644 index 000000000..64cb07e8d --- /dev/null +++ b/tests/settings/trustednode/proposals_test.go @@ -0,0 +1,69 @@ +package trustednode + +import ( + "testing" + + "github.com/rocket-pool/rocketpool-go/settings/trustednode" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +func TestProposalsSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set & get cooldown + var cooldown uint64 = 1 + if _, err := trustednode.BootstrapProposalCooldown(rp, cooldown, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { + t.Error(err) + } else if value != cooldown { + t.Error("Incorrect cooldown value") + } + + // Set & get vote blocks + var voteBlocks uint64 = 1 + if _, err := trustednode.BootstrapProposalVoteBlocks(rp, voteBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != voteBlocks { + t.Error("Incorrect vote blocks value") + } + + // Set & get vote delay blocks + var voteDelayBlocks uint64 = 1000 + if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, voteDelayBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != voteDelayBlocks { + t.Error("Incorrect vote delay blocks value") + } + + // Set & get execute blocks + var executeBlocks uint64 = 1 + if _, err := trustednode.BootstrapProposalExecuteBlocks(rp, executeBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != executeBlocks { + t.Error("Incorrect execute blocks value") + } + + // Set & get action blocks + var actionBlocks uint64 = 1 + if _, err := trustednode.BootstrapProposalActionBlocks(rp, actionBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != actionBlocks { + t.Error("Incorrect action blocks value") + } + +} + From 76445337dd84f7e5827b0fe689e1f8db136cb810 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 17:15:56 +1000 Subject: [PATCH 257/878] return new proposal ID in DAO proposal methods --- dao/trustednode/proposals.go | 58 +++++++++++++++++-------------- settings/trustednode/members.go | 6 ++-- settings/trustednode/proposals.go | 10 +++--- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 51f6a7524..1e70a9002 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -9,123 +9,129 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Submit a proposal to invite a new member to the trusted node DAO -func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) if err != nil { - return nil, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal for a member to leave the trusted node DAO -func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) if err != nil { - return nil, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode member leave proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to replace a member in the trusted node DAO -func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) if err != nil { - return nil, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to kick a member from the trusted node DAO -func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) if err != nil { - return nil, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode kick member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to update a bool trusted node DAO setting -func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to update a uint trusted node DAO setting -func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to upgrade a contract -func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) if err != nil { - return nil, err + return 0, nil, err } rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { - return nil, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + return 0, nil, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a trusted node DAO proposal -func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (*types.Receipt, error) { +// Returns the ID of the new proposal +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return 0, nil, err + } + proposalCount, err := dao.GetProposalCount(rp, nil) + if err != nil { + return 0, nil, err } txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) if err != nil { - return nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) + return 0, nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) } - return txReceipt, nil + return proposalCount + 1, txReceipt, nil } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 838de7e49..7d4c59008 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -38,7 +38,7 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } -func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } @@ -58,7 +58,7 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) } -func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } @@ -78,7 +78,7 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } -func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 53513b268..d7bdc04e4 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -39,7 +39,7 @@ func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -59,7 +59,7 @@ func GetProposalVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -79,7 +79,7 @@ func GetProposalVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -99,7 +99,7 @@ func GetProposalExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -119,7 +119,7 @@ func GetProposalActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } From 076c259dfebad4aef1ec04f0723e95bd1d94dc56 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 17:29:46 +1000 Subject: [PATCH 258/878] added EVM mining utility --- tests/testutils/evm/mining.go | 26 ++++++++++++++++++++++++++ tests/testutils/evm/snapshots.go | 7 ++----- 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 tests/testutils/evm/mining.go diff --git a/tests/testutils/evm/mining.go b/tests/testutils/evm/mining.go new file mode 100644 index 000000000..78a72c596 --- /dev/null +++ b/tests/testutils/evm/mining.go @@ -0,0 +1,26 @@ +package evm + +import ( + "github.com/ethereum/go-ethereum/rpc" + + "github.com/rocket-pool/rocketpool-go/tests" +) + + +// Mine a number of blocks +func MineBlocks(numBlocks int) error { + + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { return err } + + // Make RPC calls + for bi := 0; bi < numBlocks; bi++ { + if err := client.Call(nil, "evm_mine"); err != nil { return err } + } + + // Return + return nil + +} + diff --git a/tests/testutils/evm/snapshots.go b/tests/testutils/evm/snapshots.go index ce289d56e..3c2ceb047 100644 --- a/tests/testutils/evm/snapshots.go +++ b/tests/testutils/evm/snapshots.go @@ -36,11 +36,8 @@ func RevertSnapshot() error { client, err := rpc.Dial(tests.Eth1ProviderAddress) if err != nil { return err } - // Make RPC call - if err := client.Call(nil, "evm_revert", snapshotId); err != nil { return err } - - // Return - return nil + // Make RPC call & return + return client.Call(nil, "evm_revert", snapshotId) } From 733517ea30a136b919515714e681fd91b1f92225 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 17:40:20 +1000 Subject: [PATCH 259/878] added dao proposal test helpers --- tests/testutils/dao/proposals.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/testutils/dao/proposals.go diff --git a/tests/testutils/dao/proposals.go b/tests/testutils/dao/proposals.go new file mode 100644 index 000000000..caca68607 --- /dev/null +++ b/tests/testutils/dao/proposals.go @@ -0,0 +1,26 @@ +package dao + +import ( + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + + +// Pass and execute a proposal +func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccount *accounts.Account) error { + + // Mine blocks until proposal voting delay has passed + if err := evm.MineBlocks(1); err != nil { return err } + + // Vote on & execute proposal + if _, err := trustednode.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := trustednode.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Return + return nil + +} + From 398310a6429702f3dc40c9f76c1cc4fc77f97e30 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 15 Feb 2021 17:43:24 +1000 Subject: [PATCH 260/878] updating settings unit tests --- tests/settings/trustednode/main_test.go | 3 ++ tests/settings/trustednode/members_test.go | 52 +++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 28a4e7498..b76e2fa39 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -20,6 +20,7 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account ) @@ -37,6 +38,8 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } // Run tests os.Exit(m.Run()) diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index a24a0a47f..3a3518298 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -7,10 +7,12 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) -func TestMembersSettings(t *testing.T) { +func TestBootstrapMembersSettings(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -48,3 +50,51 @@ func TestMembersSettings(t *testing.T) { } + +func TestProposeMembersSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Set & get quorum + quorum := 0.1 + if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { + t.Error(err) + } else if value != quorum { + t.Error("Incorrect quorum value") + } + + // Set & get rpl bond + rplBond := eth.EthToWei(1) + if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(rplBond) != 0 { + t.Error("Incorrect rpl bond value") + } + + // Set & get maximum unbonded minipools + var minipoolUnbondedMax uint64 = 1 + if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolUnbondedMax { + t.Error("Incorrect maximum unbonded minipools value") + } + +} + From f2e3ddb4e2b97836bc3040c37001d2a6233aef86 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 09:24:11 +1000 Subject: [PATCH 261/878] updating settings unit tests --- tests/settings/trustednode/proposals_test.go | 86 ++++++++++++++++++-- tests/testutils/dao/proposals.go | 13 ++- 2 files changed, 89 insertions(+), 10 deletions(-) diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 64cb07e8d..030aae848 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -6,10 +6,12 @@ import ( "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) -func TestProposalsSettings(t *testing.T) { +func TestBootstrapProposalsSettings(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -26,7 +28,7 @@ func TestProposalsSettings(t *testing.T) { } // Set & get vote blocks - var voteBlocks uint64 = 1 + var voteBlocks uint64 = 10 if _, err := trustednode.BootstrapProposalVoteBlocks(rp, voteBlocks, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { @@ -35,6 +37,26 @@ func TestProposalsSettings(t *testing.T) { t.Error("Incorrect vote blocks value") } + // Set & get execute blocks + var executeBlocks uint64 = 10 + if _, err := trustednode.BootstrapProposalExecuteBlocks(rp, executeBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != executeBlocks { + t.Error("Incorrect execute blocks value") + } + + // Set & get action blocks + var actionBlocks uint64 = 10 + if _, err := trustednode.BootstrapProposalActionBlocks(rp, actionBlocks, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != actionBlocks { + t.Error("Incorrect action blocks value") + } + // Set & get vote delay blocks var voteDelayBlocks uint64 = 1000 if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, voteDelayBlocks, ownerAccount.GetTransactor()); err != nil { @@ -45,9 +67,47 @@ func TestProposalsSettings(t *testing.T) { t.Error("Incorrect vote delay blocks value") } +} + + +func TestProposeProposalsSettings(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Set & get cooldown + var cooldown uint64 = 1000000 + if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { + t.Error(err) + } else if value != cooldown { + t.Error("Incorrect cooldown value") + } + + // Set & get vote blocks + var voteBlocks uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalVoteBlocks(rp, voteBlocks, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != voteBlocks { + t.Error("Incorrect vote blocks value") + } + // Set & get execute blocks - var executeBlocks uint64 = 1 - if _, err := trustednode.BootstrapProposalExecuteBlocks(rp, executeBlocks, ownerAccount.GetTransactor()); err != nil { + var executeBlocks uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalExecuteBlocks(rp, executeBlocks, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { t.Error(err) @@ -56,8 +116,10 @@ func TestProposalsSettings(t *testing.T) { } // Set & get action blocks - var actionBlocks uint64 = 1 - if _, err := trustednode.BootstrapProposalActionBlocks(rp, actionBlocks, ownerAccount.GetTransactor()); err != nil { + var actionBlocks uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalActionBlocks(rp, actionBlocks, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { t.Error(err) @@ -65,5 +127,17 @@ func TestProposalsSettings(t *testing.T) { t.Error("Incorrect action blocks value") } + // Set & get vote delay blocks + var voteDelayBlocks uint64 = 1000 + if proposalId, _, err := trustednode.ProposeProposalVoteDelayBlocks(rp, voteDelayBlocks, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { + t.Error(err) + } else if value != voteDelayBlocks { + t.Error("Incorrect vote delay blocks value") + } + } diff --git a/tests/testutils/dao/proposals.go b/tests/testutils/dao/proposals.go index caca68607..aeee40b7a 100644 --- a/tests/testutils/dao/proposals.go +++ b/tests/testutils/dao/proposals.go @@ -1,8 +1,9 @@ package dao import ( - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -12,12 +13,16 @@ import ( // Pass and execute a proposal func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccount *accounts.Account) error { + // Get proposal voting delay + voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) + if err != nil { return err } + // Mine blocks until proposal voting delay has passed - if err := evm.MineBlocks(1); err != nil { return err } + if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { return err } // Vote on & execute proposal - if _, err := trustednode.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := trustednode.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { return err } // Return return nil From 4898a53f35ce2aba51d81fa3dcac29b62be889ec Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 09:35:11 +1000 Subject: [PATCH 262/878] minor cleanup --- settings/protocol/auction.go | 16 ++++++++-------- settings/protocol/deposit.go | 12 ++++++------ settings/protocol/inflation.go | 8 ++++---- settings/protocol/minipool.go | 8 ++++---- settings/protocol/network.go | 24 ++++++++++++------------ settings/protocol/node.go | 10 +++++----- settings/protocol/rewards.go | 4 ++-- settings/trustednode/members.go | 14 +++++++------- settings/trustednode/proposals.go | 22 +++++++++++----------- tests/settings/protocol/rewards_test.go | 12 ++++++------ tests/testutils/node/node.go | 6 +++--- 11 files changed, 68 insertions(+), 68 deletions(-) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index d11505b02..cfba1bc63 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -31,7 +31,7 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, return *value, nil } func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) + return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) } @@ -48,7 +48,7 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e return *value, nil } func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) + return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) } @@ -65,7 +65,7 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) } @@ -82,7 +82,7 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) } @@ -99,7 +99,7 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err return (*value).Uint64(), nil } func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) } @@ -116,7 +116,7 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f return eth.WeiToEth(*value), nil } func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) } @@ -133,7 +133,7 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl return eth.WeiToEth(*value), nil } func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) } diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 69580f4e3..582c3683b 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -30,7 +30,7 @@ func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, er return *value, nil } func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) + return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) } @@ -47,7 +47,7 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b return *value, nil } func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) + return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) } @@ -64,7 +64,7 @@ func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int return *value, nil } func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) } @@ -81,7 +81,7 @@ func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( return *value, nil } func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) } @@ -98,7 +98,7 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts return (*value).Uint64(), nil } func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 510c599b5..33837330b 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -31,7 +31,7 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f return eth.WeiToEth(*value), nil } func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) } @@ -48,7 +48,7 @@ func GetInflationIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) } @@ -65,7 +65,7 @@ func GetInflationStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin return (*value).Uint64(), nil } func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index bc2b62e77..b0394d854 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -116,7 +116,7 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. return *value, nil } func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) + return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) } @@ -133,7 +133,7 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u return (*value).Uint64(), nil } func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) } @@ -150,7 +150,7 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 44fdef8a9..19eb3cc55 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -31,7 +31,7 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( return eth.WeiToEth(*value), nil } func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) } @@ -48,7 +48,7 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b return *value, nil } func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) } @@ -65,7 +65,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) } @@ -82,7 +82,7 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo return *value, nil } func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) } @@ -99,7 +99,7 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u return (*value).Uint64(), nil } func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) } @@ -116,7 +116,7 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts return *value, nil } func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) } @@ -133,7 +133,7 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) } @@ -150,7 +150,7 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) } @@ -167,7 +167,7 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, return eth.WeiToEth(*value), nil } func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) } @@ -184,7 +184,7 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big return *value, nil } func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) } @@ -201,7 +201,7 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) } diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 05b22f1e9..f2ff9062b 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -31,7 +31,7 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) return *value, nil } func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) } @@ -48,7 +48,7 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool return *value, nil } func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } @@ -65,7 +65,7 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } @@ -82,7 +82,7 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 1a1f11cf5..f818f5b2c 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -73,7 +73,7 @@ func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpt return (*value).Uint64(), nil } func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocol.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 7d4c59008..11652a9ef 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -36,10 +36,10 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) return eth.WeiToEth(*value), nil } func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } @@ -56,10 +56,10 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error return *value, nil } func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) } func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } @@ -76,10 +76,10 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin return (*value).Uint64(), nil } func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index d7bdc04e4..df3f25b67 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -37,10 +37,10 @@ func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 return (*value).Uint64(), nil } func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -57,10 +57,10 @@ func GetProposalVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint return (*value).Uint64(), nil } func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -77,10 +77,10 @@ func GetProposalVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) return (*value).Uint64(), nil } func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -97,10 +97,10 @@ func GetProposalExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u return (*value).Uint64(), nil } func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -117,10 +117,10 @@ func GetProposalActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui return (*value).Uint64(), nil } func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return trustednode.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { - return trustednode.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } diff --git a/tests/settings/protocol/rewards_test.go b/tests/settings/protocol/rewards_test.go index 3b8aea5ae..2260c4dfc 100644 --- a/tests/settings/protocol/rewards_test.go +++ b/tests/settings/protocol/rewards_test.go @@ -4,7 +4,7 @@ import ( "testing" protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + protocolsettings "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -21,17 +21,17 @@ func TestRewardsSettings(t *testing.T) { if _, err := protocoldao.BootstrapClaimer(rp, "rocketClaimNode", claimerPerc, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else { - if value, err := protocol.GetRewardsClaimerPerc(rp, "rocketClaimNode", nil); err != nil { + if value, err := protocolsettings.GetRewardsClaimerPerc(rp, "rocketClaimNode", nil); err != nil { t.Error(err) } else if value != claimerPerc { t.Errorf("Incorrect rewards claimer percent %f", value) } - if value, err := protocol.GetRewardsClaimerPercBlockUpdated(rp, "rocketClaimNode", nil); err != nil { + if value, err := protocolsettings.GetRewardsClaimerPercBlockUpdated(rp, "rocketClaimNode", nil); err != nil { t.Error(err) } else if value == 0 { t.Errorf("Incorrect rewards claimer percent block updated %d", value) } - if value, err := protocol.GetRewardsClaimersPercTotal(rp, nil); err != nil { + if value, err := protocolsettings.GetRewardsClaimersPercTotal(rp, nil); err != nil { t.Error(err) } else if value == 0 { t.Errorf("Incorrect rewards claimers total percent %f", value) @@ -40,9 +40,9 @@ func TestRewardsSettings(t *testing.T) { // Set & get rewards claim interval blocks var rewardsClaimIntervalBlocks uint64 = 1 - if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { + if _, err := protocolsettings.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := protocol.GetRewardsClaimIntervalBlocks(rp, nil); err != nil { + } else if value, err := protocolsettings.GetRewardsClaimIntervalBlocks(rp, nil); err != nil { t.Error(err) } else if value != rewardsClaimIntervalBlocks { t.Error("Incorrect rewards claim interval blocks value") diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index 6c0f597b8..7f30f8917 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -3,7 +3,7 @@ package node import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" @@ -25,7 +25,7 @@ func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Accou if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { return err } // Bootstrap trusted node DAO member - if _, err := trustednode.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } + if _, err := trustednodedao.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } // Get RPL bond amount rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) @@ -40,7 +40,7 @@ func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Accou if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { return err } // Join trusted node DAO - if _, err := trustednode.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } // Increment trusted node counter & return trustedNodeIndex++ From 5e936c86bee589a47c28ef63f1752f19b8c1b1a2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 09:49:40 +1000 Subject: [PATCH 263/878] updating tokens unit tests --- tests/tokens/main_test.go | 7 +++-- tests/tokens/neth_test.go | 56 +++++++++++++++++++++++++++++++++------ tests/tokens/reth_test.go | 23 +++++++--------- 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 1cb2d1393..b721902f6 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -21,7 +21,8 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account - userAccount *accounts.Account + userAccount1 *accounts.Account + userAccount2 *accounts.Account swcAccount *accounts.Account ) @@ -42,7 +43,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(8) + userAccount1, err = accounts.GetAccount(7) + if err != nil { log.Fatal(err) } + userAccount2, err = accounts.GetAccount(8) if err != nil { log.Fatal(err) } swcAccount, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index 3c66f0f16..2f2f7435d 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -27,7 +27,7 @@ func TestNETHBalances(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } // Get & check nETH total supply if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { @@ -37,7 +37,7 @@ func TestNETHBalances(t *testing.T) { } // Get & check nETH account balance - if nethBalance, err := tokens.GetNETHBalance(rp, userAccount.Address, nil); err != nil { + if nethBalance, err := tokens.GetNETHBalance(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if nethBalance.Cmp(nethAmount) != 0 { t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) @@ -55,12 +55,52 @@ func TestTransferNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } // Transfer nETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferNETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { + if _, err := tokens.TransferNETH(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check nETH account balance + if nethBalance, err := tokens.GetNETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if nethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) + } + +} + + +func TestTransferFromNETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint nETH + nethAmount := eth.EthToWei(100) + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } + + // Approve nETH spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveNETH(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetNETHAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect nETH spender allowance %s", allowance.String()) + } + + // Transfer nETH from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromNETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { t.Fatal(err) } @@ -83,7 +123,7 @@ func TestBurnNETH(t *testing.T) { // Mint nETH nethAmount := eth.EthToWei(100) if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - mp, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount, nethAmount) + mp, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount) if err != nil { t.Fatal(err) } // Set SWC address @@ -95,19 +135,19 @@ func TestBurnNETH(t *testing.T) { if _, err := mp.Contract.Transfer(opts); err != nil { t.Fatal(err) } // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) + balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) if err != nil { t.Fatal(err) } // Burn nETH burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnNETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { + if _, err := tokens.BurnNETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) + balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) if err != nil { t.Fatal(err) } else { diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 9971ab8a5..5db0bfd01 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -16,6 +16,8 @@ import ( // GetRETHContractETHBalance test under minipool.TestWithdrawValidatorBalance +// GetRETHTotalCollateral test under minipool.TestWithdrawValidatorBalance +// GetRETHCollateralRate test under minipool.TestWithdrawValidatorBalance func TestRETHBalances(t *testing.T) { @@ -26,7 +28,7 @@ func TestRETHBalances(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } // Get & check rETH total supply if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { @@ -36,7 +38,7 @@ func TestRETHBalances(t *testing.T) { } // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, userAccount.Address, nil); err != nil { + if rethBalance, err := tokens.GetRETHBalance(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if rethBalance.Cmp(rethAmount) != 0 { t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) @@ -53,12 +55,12 @@ func TestTransferRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } // Transfer rETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount.GetTransactor()); err != nil { + if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } @@ -80,22 +82,22 @@ func TestBurnRETH(t *testing.T) { // Mint rETH rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount, rethAmount); err != nil { t.Fatal(err) } + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount.Address, nil) + balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) if err != nil { t.Fatal(err) } // Burn rETH burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnRETH(rp, burnAmount, userAccount.GetTransactor()); err != nil { + if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount.Address, nil) + balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) if err != nil { t.Fatal(err) } else { @@ -147,8 +149,3 @@ func TestRETHExchangeRate(t *testing.T) { } - -// GetRETHTotalCollateral test under minipool.TestWithdrawValidatorBalance - -// GetRETHCollateralRate test under minipool.TestWithdrawValidatorBalance - From dc48e7d48f1de06f33c500df11ec2697829bbbce Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 09:54:18 +1000 Subject: [PATCH 264/878] updating tokens unit tests --- tests/tokens/reth_test.go | 75 +++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 5db0bfd01..fe2a3aeca 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -74,7 +74,7 @@ func TestTransferRETH(t *testing.T) { } -func TestBurnRETH(t *testing.T) { +func TestTransferFromRETH(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -84,29 +84,30 @@ func TestBurnRETH(t *testing.T) { rethAmount := eth.EthToWei(100) if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { + // Approve rETH spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveRETH(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } - // Burn rETH - burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) + // Get & check spender allowance + if allowance, err := tokens.GetRETHAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH spender allowance %s", allowance.String()) } - // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { + // Transfer rETH from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromRETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { t.Fatal(err) - } else { - if balances2.RETH.Cmp(balances1.RETH) != -1 { - t.Error("rETH balance did not decrease after burning rETH") - } - if balances2.ETH.Cmp(balances1.ETH) != 1 { - t.Error("ETH balance did not increase after burning rETH") - } + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) } } @@ -149,3 +150,41 @@ func TestRETHExchangeRate(t *testing.T) { } + +func TestBurnRETH(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } + + // Get initial balances + balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Burn rETH + burnAmount := eth.EthToWei(50) + if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated balances + balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) + if err != nil { + t.Fatal(err) + } else { + if balances2.RETH.Cmp(balances1.RETH) != -1 { + t.Error("rETH balance did not decrease after burning rETH") + } + if balances2.ETH.Cmp(balances1.ETH) != 1 { + t.Error("ETH balance did not increase after burning rETH") + } + } + +} + From 780cc9ce571fdcbc8f908ce0912f01aa6f20e75b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 10:04:25 +1000 Subject: [PATCH 265/878] updating tokens unit tests --- tests/tokens/rpl_fixed_test.go | 107 +++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 tests/tokens/rpl_fixed_test.go diff --git a/tests/tokens/rpl_fixed_test.go b/tests/tokens/rpl_fixed_test.go new file mode 100644 index 000000000..bc00ff93a --- /dev/null +++ b/tests/tokens/rpl_fixed_test.go @@ -0,0 +1,107 @@ +package tokens + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +func TestFixedSupplyRPLBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } + + // Get & check fixed-supply RPL total supply + if fixedRplTotalSupply, err := tokens.GetFixedSupplyRPLTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if fixedRplTotalSupply.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL total supply %s", fixedRplTotalSupply.String()) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } + +} + + +func TestTransferFixedSupplyRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } + + // Transfer fixed-supply RPL + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferFixedSupplyRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } + +} + + +func TestTransferFromFixedSupplyRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } + + // Approve fixed-supply RPL spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveFixedSupplyRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetFixedSupplyRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL spender allowance %s", allowance.String()) + } + + // Transfer fixed-supply RPL from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromFixedSupplyRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } + +} + From 4154c2b82b9a3ea7d691811f235fbb667d7d3f46 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 10:14:04 +1000 Subject: [PATCH 266/878] updating tokens unit tests --- tests/tokens/rpl_test.go | 108 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tests/tokens/rpl_test.go diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go new file mode 100644 index 000000000..6d03d14a6 --- /dev/null +++ b/tests/tokens/rpl_test.go @@ -0,0 +1,108 @@ +package tokens + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +func TestRPLBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } + + // Get & check RPL total supply + initialTotalSupply := eth.EthToWei(18000000) + if rplTotalSupply, err := tokens.GetRPLTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if rplTotalSupply.Cmp(initialTotalSupply) != 0 { + t.Errorf("Incorrect RPL total supply %s", rplTotalSupply.String()) + } + +} + + +func TestTransferRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } + + // Transfer RPL + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } + +} + + +func TestTransferFromRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } + + // Approve RPL spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL spender allowance %s", allowance.String()) + } + + // Transfer RPL from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } + +} + From f8edecd83712bdc3f032a708b75e10f82a42c498 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 10:19:17 +1000 Subject: [PATCH 267/878] updating tokens unit tests --- tests/tokens/rpl_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index 6d03d14a6..c193803d1 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -106,3 +106,33 @@ func TestTransferFromRPL(t *testing.T) { } + +func TestSwapFixedSupplyRPLForRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint fixed-supply RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } + + // Approve fixed-supply RPL spend + rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") + if err != nil { t.Fatal(err) } + if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, rplAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } + + // Swap fixed-supply RP for RPL + if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, rplAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } + +} + From 6e15e79f62e4a0aef126d67909acd6f4a2427a12 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 10:46:47 +1000 Subject: [PATCH 268/878] updating tokens unit tests --- tests/tokens/tokens_test.go | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tests/tokens/tokens_test.go diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go new file mode 100644 index 000000000..7f9e9f5d0 --- /dev/null +++ b/tests/tokens/tokens_test.go @@ -0,0 +1,63 @@ +package tokens + +import ( + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + nethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/neth" + rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +func TestTokenBalances(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Mint nETH + nethAmount := eth.EthToWei(101) + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } + + // Mint rETH + rethAmount := eth.EthToWei(102) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } + + // Mint RPL + rplAmount := eth.EthToWei(103) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(104) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } + + // Get & check token balances + if balances, err := tokens.GetBalances(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else { + if balances.ETH.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect ETH balance %s", balances.ETH.String()) + } + if balances.NETH.Cmp(nethAmount) != 0 { + t.Errorf("Incorrect nETH balance %s", balances.NETH.String()) + } + if balances.RETH.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH balance %s", balances.RETH.String()) + } + if balances.RPL.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL balance %s", balances.RPL.String()) + } + if balances.FixedSupplyRPL.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL balance %s", balances.FixedSupplyRPL.String()) + } + } + +} + From 30a1e41b91a087283452f09ed7be88e7b12813d7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 12:09:19 +1000 Subject: [PATCH 269/878] updated proposal payload string logic --- dao/proposal-payload.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go index c7ea2916a..255ea7d26 100644 --- a/dao/proposal-payload.go +++ b/dao/proposal-payload.go @@ -1,10 +1,14 @@ package dao import ( + "encoding/hex" "fmt" "strings" "sync" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -18,31 +22,42 @@ func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload defer getProposalPayloadStringLock.Unlock() // Get proposal DAO contract ABI - abi, err := rp.GetABI(daoName) + daoContractAbi, err := rp.GetABI(daoName) if err != nil { return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) } // Get proposal payload method - method, err := abi.MethodById(payload) + method, err := daoContractAbi.MethodById(payload) if err != nil { return "", fmt.Errorf("Could not get proposal payload method: %w", err) } // Get proposal payload argument values - args, err := method.Inputs.UnpackValues(payload) + args, err := method.Inputs.UnpackValues(payload[4:]) if err != nil { return "", fmt.Errorf("Could not get proposal payload arguments: %w", err) } // Format argument values as strings argStrs := []string{} - for _, arg := range args { - argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + for ai, arg := range args { + switch method.Inputs[ai].Type.T { + case abi.AddressTy: + argStrs = append(argStrs, arg.(common.Address).Hex()) + case abi.HashTy: + argStrs = append(argStrs, arg.(common.Hash).Hex()) + case abi.FixedBytesTy: + fallthrough + case abi.BytesTy: + argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) + default: + argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + } } // Build & return payload string - return fmt.Sprintf("%s(%s)", method.Sig, strings.Join(argStrs, ",")), nil + return fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ",")), nil } From 75409bcdaa28de06de6b38e2f86f653c8f6fbb34 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 12:19:44 +1000 Subject: [PATCH 270/878] minor dao proposal getter fix --- dao/proposals.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dao/proposals.go b/dao/proposals.go index 14b938553..75387c20d 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -30,7 +31,7 @@ type ProposalDetails struct { StartBlock uint64 `json:"startBlock"` EndBlock uint64 `json:"endBlock"` ExpiryBlock uint64 `json:"expiryBlock"` - VotesRequired uint64 `json:"votesRequired"` + VotesRequired float64 `json:"votesRequired"` VotesFor uint64 `json:"votesFor"` VotesAgainst uint64 `json:"votesAgainst"` MemberVoted bool `json:"memberVoted"` @@ -260,7 +261,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind var startBlock uint64 var endBlock uint64 var expiryBlock uint64 - var votesRequired uint64 + var votesRequired float64 var votesFor uint64 var votesAgainst uint64 var isCancelled bool @@ -488,7 +489,7 @@ func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts * } return (*expiryBlock).Uint64(), nil } -func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err @@ -497,7 +498,7 @@ func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts if err := rocketDAOProposal.Call(opts, votesRequired, "getVotesRequired", big.NewInt(int64(proposalId))); err != nil { return 0, fmt.Errorf("Could not get proposal %d votes required: %w", proposalId, err) } - return (*votesRequired).Uint64(), nil + return eth.WeiToEth(*votesRequired), nil } func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) From e1c4a1f733ba874f89813e477a19f87e871cfab8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 12:37:53 +1000 Subject: [PATCH 271/878] updated trusted node settings tests --- tests/settings/trustednode/members_test.go | 3 +++ tests/settings/trustednode/proposals_test.go | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 3a3518298..8272ef1ad 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -60,6 +60,9 @@ func TestProposeMembersSettings(t *testing.T) { // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Set proposal cooldown + if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Set & get quorum quorum := 0.1 if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount.GetTransactor()); err != nil { diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 030aae848..b930576a1 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -79,8 +79,11 @@ func TestProposeProposalsSettings(t *testing.T) { // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Set proposal cooldown + if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Set & get cooldown - var cooldown uint64 = 1000000 + var cooldown uint64 = 1 if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { From 5f13a16b4f25ca879f95edf00fb2745277e87587 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 13:02:56 +1000 Subject: [PATCH 272/878] minor dao proposal getter fixes --- dao/proposals.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dao/proposals.go b/dao/proposals.go index 75387c20d..9023268e5 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -32,8 +32,8 @@ type ProposalDetails struct { EndBlock uint64 `json:"endBlock"` ExpiryBlock uint64 `json:"expiryBlock"` VotesRequired float64 `json:"votesRequired"` - VotesFor uint64 `json:"votesFor"` - VotesAgainst uint64 `json:"votesAgainst"` + VotesFor float64 `json:"votesFor"` + VotesAgainst float64 `json:"votesAgainst"` MemberVoted bool `json:"memberVoted"` MemberSupported bool `json:"memberSupported"` IsCancelled bool `json:"isCancelled"` @@ -262,8 +262,8 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind var endBlock uint64 var expiryBlock uint64 var votesRequired float64 - var votesFor uint64 - var votesAgainst uint64 + var votesFor float64 + var votesAgainst float64 var isCancelled bool var isExecuted bool var payload []byte @@ -500,7 +500,7 @@ func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts } return eth.WeiToEth(*votesRequired), nil } -func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err @@ -509,9 +509,9 @@ func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bin if err := rocketDAOProposal.Call(opts, votesFor, "getVotesFor", big.NewInt(int64(proposalId))); err != nil { return 0, fmt.Errorf("Could not get proposal %d votes for: %w", proposalId, err) } - return (*votesFor).Uint64(), nil + return eth.WeiToEth(*votesFor), nil } -func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err @@ -520,7 +520,7 @@ func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts if err := rocketDAOProposal.Call(opts, votesAgainst, "getVotesAgainst", big.NewInt(int64(proposalId))); err != nil { return 0, fmt.Errorf("Could not get proposal %d votes against: %w", proposalId, err) } - return (*votesAgainst).Uint64(), nil + return eth.WeiToEth(*votesAgainst), nil } func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) From b85f302b8812fc577c3af82d95ef6f7c3dcfb3df Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 13:08:55 +1000 Subject: [PATCH 273/878] implementing dao proposal unit tests --- tests/dao/main_test.go | 51 +++++++++++++++ tests/dao/proposals_test.go | 127 ++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 tests/dao/main_test.go create mode 100644 tests/dao/proposals_test.go diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go new file mode 100644 index 000000000..8caa8c0f3 --- /dev/null +++ b/tests/dao/main_test.go @@ -0,0 +1,51 @@ +package dao + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go new file mode 100644 index 000000000..900fcc7bf --- /dev/null +++ b/tests/dao/proposals_test.go @@ -0,0 +1,127 @@ +package dao + +import ( + "bytes" + "fmt" + "testing" + + "github.com/rocket-pool/rocketpool-go/dao" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + rptypes "github.com/rocket-pool/rocketpool-go/types" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +func TestProposalDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // The DAO to check for proposals under + proposalDaoName := "rocketDAONodeTrustedProposals" + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check initial proposal details + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(proposals) != 0 { + t.Error("Incorrect initial proposal count") + } + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 0 { + t.Error("Incorrect initial DAO proposal count") + } + + // Submit invite member proposal + proposalMessage := "invite coolguy" + proposalMemberAddress := nodeAccount.Address + proposalMemberId := "coolguy" + proposalMemberEmail := "coolguy@rocketpool.net" + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount.GetTransactor()) + if err != nil { t.Fatal(err) } + + // Mine blocks until proposal voting delay has passed + voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) + if err != nil { t.Fatal(err) } + if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { t.Fatal(err) } + + // Vote on & execute proposal + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated proposal details + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(proposals) != 1 { + t.Error("Incorrect updated proposal count") + } else { + proposal := proposals[0] + if proposal.ID != proposalId { + t.Errorf("Incorrect proposal ID %d", proposal.ID) + } + if proposal.DAO != proposalDaoName { + t.Errorf("Incorrect proposal DAO %s", proposal.DAO) + } + if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount.Address.Bytes()) { + t.Errorf("Incorrect proposal proposer address %s", proposal.ProposerAddress.Hex()) + } + if proposal.CreatedBlock == 0 { + t.Errorf("Incorrect proposal created block %d", proposal.CreatedBlock) + } + if proposal.StartBlock <= proposal.CreatedBlock { + t.Errorf("Incorrect proposal start block %d", proposal.StartBlock) + } + if proposal.EndBlock <= proposal.StartBlock { + t.Errorf("Incorrect proposal end block %d", proposal.EndBlock) + } + if proposal.ExpiryBlock <= proposal.EndBlock { + t.Errorf("Incorrect proposal expiry block %d", proposal.ExpiryBlock) + } + if proposal.VotesRequired == 0.0 { + t.Errorf("Incorrect proposal required votes %f", proposal.VotesRequired) + } + if proposal.VotesFor != 1.0 { + t.Errorf("Incorrect proposal votes for %f", proposal.VotesFor) + } + if proposal.VotesAgainst != 0.0 { + t.Errorf("Incorrect proposal votes against %f", proposal.VotesAgainst) + } + if !proposal.MemberVoted { + t.Error("Incorrect proposal member voted status") + } + if !proposal.MemberSupported { + t.Error("Incorrect proposal member supported status") + } + if proposal.IsCancelled { + t.Error("Incorrect proposal cancelled status") + } + if !proposal.IsExecuted { + t.Error("Incorrect proposal executed status") + } + if proposal.PayloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", proposal.PayloadStr) + } + if proposal.State != rptypes.Executed { + t.Errorf("Incorrect proposal state %s", proposal.State.String()) + } + } + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 1 { + t.Error("Incorrect updated DAO proposal count") + } + +} + From ab1fd3e4f3bb7a800f2a2579012e661a0dc1e8d3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 14:14:28 +1000 Subject: [PATCH 274/878] implementing trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 83 ++++++++++++++++++++++++++++++ tests/dao/trustednode/main_test.go | 48 +++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 tests/dao/trustednode/dao_test.go create mode 100644 tests/dao/trustednode/main_test.go diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go new file mode 100644 index 000000000..9c3aad655 --- /dev/null +++ b/tests/dao/trustednode/dao_test.go @@ -0,0 +1,83 @@ +package trustednode + +import ( + "bytes" + "testing" + + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tokens" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" +) + + +func TestMemberDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Get & check initial member details + if members, err := trustednodedao.GetMembers(rp, nil); err != nil { + t.Error(err) + } else if len(members) != 0 { + t.Error("Incorrect initial trusted node DAO member count") + } + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Bootstrap trusted node DAO member + memberId := "coolguy" + memberEmail := "coolguy@rocketpool.net" + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Mint RPL bond to node & allow trusted node DAO contract to spend it + rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) + if err != nil { t.Fatal(err) } + rocketDAONodeTrustedActionsAddress, err := rp.GetAddress("rocketDAONodeTrustedActions") + if err != nil { t.Fatal(err) } + if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { t.Fatal(err) } + if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Join trusted node DAO + if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated member details + if members, err := trustednodedao.GetMembers(rp, nil); err != nil { + t.Error(err) + } else if len(members) != 1 { + t.Error("Incorrect updated trusted node DAO member count") + } else { + member := members[0] + if !bytes.Equal(member.Address.Bytes(), trustedNodeAccount.Address.Bytes()) { + t.Errorf("Incorrect member address %s", member.Address.Hex()) + } + if !member.Exists { + t.Error("Incorrect member exists status") + } + if member.ID != memberId { + t.Errorf("Incorrect member ID %s", member.ID) + } + if member.Email != memberEmail { + t.Errorf("Incorrect member email %s", member.Email) + } + if member.JoinedBlock == 0 { + t.Errorf("Incorrect member joined block %d", member.JoinedBlock) + } + if member.LastProposalBlock != 0 { + t.Errorf("Incorrect member last proposal block %d", member.LastProposalBlock) + } + if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { + t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) + } + if member.UnbondedValidatorCount != 0 { + t.Errorf("Incorrect member unbonded validator count %d", member.UnbondedValidatorCount) + } + } + +} + diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go new file mode 100644 index 000000000..b76e2fa39 --- /dev/null +++ b/tests/dao/trustednode/main_test.go @@ -0,0 +1,48 @@ +package trustednode + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + From c8b3e09dbba26d687f2545b9b0336f9bbd7f67e2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 14:28:25 +1000 Subject: [PATCH 275/878] implementing trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 9c3aad655..da727369a 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -2,6 +2,7 @@ package trustednode import ( "bytes" + "math/big" "testing" trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" @@ -10,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -30,6 +32,9 @@ func TestMemberDetails(t *testing.T) { // Register node if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Bootstrap trusted node DAO member memberId := "coolguy" memberEmail := "coolguy@rocketpool.net" @@ -44,7 +49,15 @@ func TestMemberDetails(t *testing.T) { if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Join trusted node DAO - if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Submit a proposal + if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Create an unbonded minipool + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)); err != nil { t.Fatal(err) } // Get & check updated member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { @@ -68,13 +81,13 @@ func TestMemberDetails(t *testing.T) { if member.JoinedBlock == 0 { t.Errorf("Incorrect member joined block %d", member.JoinedBlock) } - if member.LastProposalBlock != 0 { + if member.LastProposalBlock == 0 { t.Errorf("Incorrect member last proposal block %d", member.LastProposalBlock) } if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) } - if member.UnbondedValidatorCount != 0 { + if member.UnbondedValidatorCount != 1 { t.Errorf("Incorrect member unbonded validator count %d", member.UnbondedValidatorCount) } } From 7a01b5e2da05dd8d93d768e1f71ed10f4f887716 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 14:33:27 +1000 Subject: [PATCH 276/878] minor cleanup --- tests/dao/proposals_test.go | 6 +++--- tests/dao/trustednode/dao_test.go | 6 +++--- tests/settings/trustednode/members_test.go | 6 +++--- tests/settings/trustednode/proposals_test.go | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 900fcc7bf..891d80392 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -25,13 +25,13 @@ func TestProposalDetails(t *testing.T) { // The DAO to check for proposals under proposalDaoName := "rocketDAONodeTrustedProposals" + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Get & check initial proposal details if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { t.Error(err) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index da727369a..3c3cecbc5 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -29,12 +29,12 @@ func TestMemberDetails(t *testing.T) { t.Error("Incorrect initial trusted node DAO member count") } - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Bootstrap trusted node DAO member memberId := "coolguy" memberEmail := "coolguy@rocketpool.net" diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 8272ef1ad..f606914b9 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -57,12 +57,12 @@ func TestProposeMembersSettings(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - // Set proposal cooldown if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Set & get quorum quorum := 0.1 if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount.GetTransactor()); err != nil { diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index b930576a1..19605d29f 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -76,12 +76,12 @@ func TestProposeProposalsSettings(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - // Set proposal cooldown if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Set & get cooldown var cooldown uint64 = 1 if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount.GetTransactor()); err != nil { From a009438f3c9d540af6e042bc91806b9e511a930a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 14:42:54 +1000 Subject: [PATCH 277/878] implementing trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 31 +++++++++++++++++++++++++++--- tests/dao/trustednode/main_test.go | 3 +++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 3c3cecbc5..c3c9087f7 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -32,8 +32,9 @@ func TestMemberDetails(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Register node + // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Bootstrap trusted node DAO member memberId := "coolguy" @@ -53,8 +54,18 @@ func TestMemberDetails(t *testing.T) { t.Fatal(err) } - // Submit a proposal - if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Submit replace member proposal + proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount.Address, nodeAccount.Address, "newguy", "newguy@rocketpool.net", trustedNodeAccount.GetTransactor()) + if err != nil { t.Fatal(err) } + + // Mine blocks until proposal voting delay has passed + voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) + if err != nil { t.Fatal(err) } + if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { t.Fatal(err) } + + // Pass & execute replace member proposal + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create an unbonded minipool if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)); err != nil { t.Fatal(err) } @@ -92,5 +103,19 @@ func TestMemberDetails(t *testing.T) { } } + // Get & check member invite executed block + if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if inviteExecutedBlock == 0 { + t.Errorf("Incorrect member invite proposal executed block %d", inviteExecutedBlock) + } + + // Get & check member replacement address + if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(replacementAddress.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect member replacement address %s", replacementAddress.Hex()) + } + } diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index b76e2fa39..bd8c21bb0 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -21,6 +21,7 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account ) @@ -40,6 +41,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } // Run tests os.Exit(m.Run()) From 4bb4191c309b84c8cca6ac4cc87fc2b41e68d21d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 15:05:15 +1000 Subject: [PATCH 278/878] implementing trusted node dao unit tests --- tests/dao/proposals_test.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 891d80392..30aa14fb5 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -61,12 +61,19 @@ func TestProposalDetails(t *testing.T) { if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Submit invite member proposal & cancel it + cancelledProposalId, _, err := trustednodedao.ProposeInviteMember(rp, "cancel this", nodeAccount.Address, "cancel", "cancel@rocketpool.net", trustedNodeAccount.GetTransactor()) + if err != nil { t.Fatal(err) } + if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check updated proposal details if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { t.Error(err) - } else if len(proposals) != 1 { + } else if len(proposals) != 2 { t.Error("Incorrect updated proposal count") } else { + + // Passed proposal proposal := proposals[0] if proposal.ID != proposalId { t.Errorf("Incorrect proposal ID %d", proposal.ID) @@ -116,10 +123,20 @@ func TestProposalDetails(t *testing.T) { if proposal.State != rptypes.Executed { t.Errorf("Incorrect proposal state %s", proposal.State.String()) } + + // Cancelled proposal + cancelledProposal := proposals[1] + if cancelledProposal.ID != cancelledProposalId { + t.Errorf("Incorrect cancelled proposal ID %d", cancelledProposal.ID) + } + if !cancelledProposal.IsCancelled { + t.Error("Incorrect cancelled proposal cancelled status") + } + } if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { t.Error(err) - } else if len(daoProposals) != 1 { + } else if len(daoProposals) != 2 { t.Error("Incorrect updated DAO proposal count") } From b3fa436bf9a9194283b401fd07c64d1dd30c30ec Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 15:17:54 +1000 Subject: [PATCH 279/878] minor cleanup --- tests/dao/trustednode/dao_test.go | 13 +++---------- tests/settings/trustednode/members_test.go | 2 +- tests/settings/trustednode/proposals_test.go | 2 +- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index c3c9087f7..be84e718a 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -10,6 +10,7 @@ import ( trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/tokens" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" @@ -54,18 +55,10 @@ func TestMemberDetails(t *testing.T) { t.Fatal(err) } - // Submit replace member proposal + // Submit, pass & execute replace member proposal proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount.Address, nodeAccount.Address, "newguy", "newguy@rocketpool.net", trustedNodeAccount.GetTransactor()) if err != nil { t.Fatal(err) } - - // Mine blocks until proposal voting delay has passed - voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) - if err != nil { t.Fatal(err) } - if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { t.Fatal(err) } - - // Pass & execute replace member proposal - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Fatal(err) } // Create an unbonded minipool if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)); err != nil { t.Fatal(err) } diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index f606914b9..64c7f9baf 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -6,8 +6,8 @@ import ( "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 19605d29f..6fd90da64 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -5,8 +5,8 @@ import ( "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) From 9aea9a6582c9386c806d2177f497dd6968610409 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 15:34:25 +1000 Subject: [PATCH 280/878] minor cleanup --- tests/dao/trustednode/dao_test.go | 12 ++++-------- tests/testutils/node/node.go | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index be84e718a..72bf1a394 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -8,12 +8,11 @@ import ( trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -42,15 +41,12 @@ func TestMemberDetails(t *testing.T) { memberEmail := "coolguy@rocketpool.net" if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Mint RPL bond to node & allow trusted node DAO contract to spend it + // Get RPL bond amount rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) if err != nil { t.Fatal(err) } - rocketDAONodeTrustedActionsAddress, err := rp.GetAddress("rocketDAONodeTrustedActions") - if err != nil { t.Fatal(err) } - if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { t.Fatal(err) } - if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Join trusted node DAO + // Mint trusted node RPL bond & join trusted node DAO + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index 7f30f8917..da8e99f43 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -27,6 +27,22 @@ func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Accou // Bootstrap trusted node DAO member if _, err := trustednodedao.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } + // Mint trusted node RPL bond + if err := MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount); err != nil { return err } + + // Join trusted node DAO + if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Increment trusted node counter & return + trustedNodeIndex++ + return nil + +} + + +// Mint trusted node DAO RPL bond to a node account and approve it for spending +func MintTrustedNodeBond(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { + // Get RPL bond amount rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) if err != nil { return err } @@ -39,11 +55,7 @@ func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Accou if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { return err } if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { return err } - // Join trusted node DAO - if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } - - // Increment trusted node counter & return - trustedNodeIndex++ + // Return return nil } From 73f7d04a669eb64f64efbdcea66fea357c5b6c10 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 15:38:29 +1000 Subject: [PATCH 281/878] implementing trusted node dao unit tests --- tests/dao/trustednode/proposals_test.go | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tests/dao/trustednode/proposals_test.go diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go new file mode 100644 index 000000000..6c95fac8d --- /dev/null +++ b/tests/dao/trustednode/proposals_test.go @@ -0,0 +1,55 @@ +package trustednode + +import ( + "testing" + + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +func TestInviteMember(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Submit, pass & execute invite member proposal + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount.GetTransactor()) + if err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect initial member exists status") + } + + // Mint trusted node RPL bond & join trusted node DAO + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, nodeAccount); err != nil { t.Fatal(err) } + if _, err := trustednodedao.Join(rp, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect updated member exists status") + } + +} + From 01f08c53cdc756ebc611de9378df0acee2beafe3 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 15:57:44 +1000 Subject: [PATCH 282/878] implementing trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 21 +++---- tests/dao/trustednode/main_test.go | 15 ++++- tests/dao/trustednode/proposals_test.go | 58 ++++++++++++++++++-- tests/settings/trustednode/members_test.go | 7 ++- tests/settings/trustednode/proposals_test.go | 11 ++-- tests/testutils/dao/proposals.go | 19 +++++-- 6 files changed, 101 insertions(+), 30 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 72bf1a394..82ed35708 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -9,6 +9,7 @@ import ( "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" @@ -33,31 +34,31 @@ func TestMemberDetails(t *testing.T) { if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Bootstrap trusted node DAO member memberId := "coolguy" memberEmail := "coolguy@rocketpool.net" - if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount1.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get RPL bond amount rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) if err != nil { t.Fatal(err) } // Mint trusted node RPL bond & join trusted node DAO - if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if _, err := trustednodedao.Join(rp, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Submit, pass & execute replace member proposal - proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount.Address, nodeAccount.Address, "newguy", "newguy@rocketpool.net", trustedNodeAccount.GetTransactor()) + proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount1.Address, nodeAccount.Address, "newguy", "newguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } // Create an unbonded minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount1, big.NewInt(0)); err != nil { t.Fatal(err) } // Get & check updated member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { @@ -66,7 +67,7 @@ func TestMemberDetails(t *testing.T) { t.Error("Incorrect updated trusted node DAO member count") } else { member := members[0] - if !bytes.Equal(member.Address.Bytes(), trustedNodeAccount.Address.Bytes()) { + if !bytes.Equal(member.Address.Bytes(), trustedNodeAccount1.Address.Bytes()) { t.Errorf("Incorrect member address %s", member.Address.Hex()) } if !member.Exists { @@ -93,14 +94,14 @@ func TestMemberDetails(t *testing.T) { } // Get & check member invite executed block - if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, trustedNodeAccount.Address, nil); err != nil { + if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if inviteExecutedBlock == 0 { t.Errorf("Incorrect member invite proposal executed block %d", inviteExecutedBlock) } // Get & check member replacement address - if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, trustedNodeAccount.Address, nil); err != nil { + if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if !bytes.Equal(replacementAddress.Bytes(), nodeAccount.Address.Bytes()) { t.Errorf("Incorrect member replacement address %s", replacementAddress.Hex()) diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index bd8c21bb0..601a15b4f 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -20,7 +20,10 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account + trustedNodeAccount4 *accounts.Account nodeAccount *accounts.Account ) @@ -39,9 +42,15 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount1, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { log.Fatal(err) } + trustedNodeAccount4, err = accounts.GetAccount(4) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(5) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 6c95fac8d..ade798b91 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -7,6 +7,7 @@ import ( "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" @@ -24,14 +25,14 @@ func TestInviteMember(t *testing.T) { // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } // Submit, pass & execute invite member proposal - proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount.GetTransactor()) + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } - // Get initial member exists status + // Get & check initial member exists status if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if exists { @@ -44,7 +45,7 @@ func TestInviteMember(t *testing.T) { t.Fatal(err) } - // Get updated member exists status + // Get & check updated member exists status if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if !exists { @@ -53,3 +54,50 @@ func TestInviteMember(t *testing.T) { } + +func TestMemberLeave(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Register nodes + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount4); err != nil { t.Fatal(err) } + + // Submit, pass & execute member leave proposal + proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{ + trustedNodeAccount1, + trustedNodeAccount2, + trustedNodeAccount3, + trustedNodeAccount4, + }); err != nil { t.Fatal(err) } + + // Get & check initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial member exists status") + } + + // Leave trusted node DAO + if _, err := trustednodedao.Leave(rp, trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated member exists status") + } + +} + diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 64c7f9baf..5f1810e4c 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -6,6 +6,7 @@ import ( "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" @@ -67,7 +68,7 @@ func TestProposeMembersSettings(t *testing.T) { quorum := 0.1 if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { t.Error(err) @@ -79,7 +80,7 @@ func TestProposeMembersSettings(t *testing.T) { rplBond := eth.EthToWei(1) if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { t.Error(err) @@ -91,7 +92,7 @@ func TestProposeMembersSettings(t *testing.T) { var minipoolUnbondedMax uint64 = 1 if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { t.Error(err) diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 6fd90da64..55a526d00 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -5,6 +5,7 @@ import ( "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" @@ -86,7 +87,7 @@ func TestProposeProposalsSettings(t *testing.T) { var cooldown uint64 = 1 if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { t.Error(err) @@ -98,7 +99,7 @@ func TestProposeProposalsSettings(t *testing.T) { var voteBlocks uint64 = 10 if proposalId, _, err := trustednode.ProposeProposalVoteBlocks(rp, voteBlocks, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { t.Error(err) @@ -110,7 +111,7 @@ func TestProposeProposalsSettings(t *testing.T) { var executeBlocks uint64 = 10 if proposalId, _, err := trustednode.ProposeProposalExecuteBlocks(rp, executeBlocks, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { t.Error(err) @@ -122,7 +123,7 @@ func TestProposeProposalsSettings(t *testing.T) { var actionBlocks uint64 = 10 if proposalId, _, err := trustednode.ProposeProposalActionBlocks(rp, actionBlocks, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { t.Error(err) @@ -134,7 +135,7 @@ func TestProposeProposalsSettings(t *testing.T) { var voteDelayBlocks uint64 = 1000 if proposalId, _, err := trustednode.ProposeProposalVoteDelayBlocks(rp, voteDelayBlocks, trustedNodeAccount.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, trustedNodeAccount); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { t.Error(err) diff --git a/tests/testutils/dao/proposals.go b/tests/testutils/dao/proposals.go index aeee40b7a..9357681a2 100644 --- a/tests/testutils/dao/proposals.go +++ b/tests/testutils/dao/proposals.go @@ -1,9 +1,11 @@ package dao import ( + "github.com/rocket-pool/rocketpool-go/dao" trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/rocketpool" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -11,7 +13,7 @@ import ( // Pass and execute a proposal -func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccount *accounts.Account) error { +func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccounts []*accounts.Account) error { // Get proposal voting delay voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) @@ -20,9 +22,18 @@ func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, truste // Mine blocks until proposal voting delay has passed if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { return err } - // Vote on & execute proposal - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { return err } + // Vote on proposal until passed + for _, account := range trustedNodeAccounts { + if state, err := dao.GetProposalState(rp, proposalId, nil); err != nil { + return err + } else if state == rptypes.Succeeded { + break; + } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, account.GetTransactor()); err != nil { return err } + } + + // Execute proposal + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccounts[0].GetTransactor()); err != nil { return err } // Return return nil From c775e2693666491be4c202cd61160c70eb1714be Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 16:04:26 +1000 Subject: [PATCH 283/878] trusted node DAO actions bugfix --- dao/trustednode/actions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index a629fa0e4..db8e0ae64 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -49,7 +49,7 @@ func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt if err != nil { return nil, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave") + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionReplace") if err != nil { return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w", err) } From 3310d9b475e463ce9d0c8ff4eaf0d3e2ce3cdeb6 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 16 Feb 2021 16:09:08 +1000 Subject: [PATCH 284/878] implementing trusted node dao unit tests --- tests/dao/trustednode/proposals_test.go | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index ade798b91..368e04d9a 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -101,3 +101,53 @@ func TestMemberLeave(t *testing.T) { } + +func TestReplaceMember(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + + // Submit, pass & execute replace member proposal + proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount1.Address, nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } + + // Get & check initial member exists statuses + if oldMemberExists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if !oldMemberExists { + t.Error("Incorrect initial old member exists status") + } + if newMemberExists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if newMemberExists { + t.Error("Incorrect initial new member exists status") + } + + // Replace position in trusted node DAO + if _, err := trustednodedao.Replace(rp, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated member exists status + if oldMemberExists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if oldMemberExists { + t.Error("Incorrect updated old member exists status") + } + if newMemberExists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !newMemberExists { + t.Error("Incorrect updated new member exists status") + } + +} + From b9a1dc052c21a0760b2b9d6516265aae53827b4a Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 09:10:37 +1000 Subject: [PATCH 285/878] implementing trusted node dao unit tests --- tests/dao/trustednode/proposals_test.go | 40 +++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 368e04d9a..ea0c426bd 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -6,6 +6,7 @@ import ( trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" @@ -71,7 +72,7 @@ func TestMemberLeave(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount4); err != nil { t.Fatal(err) } // Submit, pass & execute member leave proposal - proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()) + proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "node 1 leave", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{ trustedNodeAccount1, @@ -116,7 +117,7 @@ func TestReplaceMember(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } // Submit, pass & execute replace member proposal - proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount1.Address, nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) + proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace node 1", trustedNodeAccount1.Address, nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } @@ -151,3 +152,38 @@ func TestReplaceMember(t *testing.T) { } + +func TestKickMember(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Register nodes + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + + // Get & check initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial member exists status") + } + + // Submit, pass & execute kick member proposal + proposalId, _, err := trustednodedao.ProposeKickMember(rp, "kick node 2", trustedNodeAccount2.Address, eth.EthToWei(1000), trustedNodeAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } + + // Get & check updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated member exists status") + } + +} + From bfe25e1d64a830333b57208464434d467531ec80 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 09:20:51 +1000 Subject: [PATCH 286/878] added dao proposal payload string getter --- dao/proposals.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dao/proposals.go b/dao/proposals.go index 9023268e5..138fd8f36 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -555,6 +555,21 @@ func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } return *payload, nil } +func GetProposalPayloadStr(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { + dao, err := GetProposalDAO(rp, proposalId, opts) + if err != nil { + return "", err + } + payload, err := GetProposalPayload(rp, proposalId, opts) + if err != nil { + return "", err + } + payloadStr, err := GetProposalPayloadString(rp, dao, payload) + if err != nil { + payloadStr = "(unknown)" + } + return payloadStr, nil +} func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (rptypes.ProposalState, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { From 37735ea604dad8127fc4f4acb3cecffb25036ae1 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 09:32:13 +1000 Subject: [PATCH 287/878] implementing trusted node dao unit tests --- tests/dao/trustednode/proposals_test.go | 48 ++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index ea0c426bd..cea41f4fe 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -1,8 +1,10 @@ package trustednode import ( + "fmt" "testing" + "github.com/rocket-pool/rocketpool-go/dao" trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" @@ -29,7 +31,10 @@ func TestInviteMember(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } // Submit, pass & execute invite member proposal - proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) + proposalMemberAddress := nodeAccount.Address + proposalMemberId := "coolguy" + proposalMemberEmail := "coolguy@rocketpool.net" + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } @@ -53,6 +58,13 @@ func TestInviteMember(t *testing.T) { t.Error("Incorrect updated member exists status") } + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + } @@ -72,7 +84,8 @@ func TestMemberLeave(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount4); err != nil { t.Fatal(err) } // Submit, pass & execute member leave proposal - proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "node 1 leave", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()) + proposalMemberAddress := trustedNodeAccount1.Address + proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "node 1 leave", proposalMemberAddress, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{ trustedNodeAccount1, @@ -100,6 +113,13 @@ func TestMemberLeave(t *testing.T) { t.Error("Incorrect updated member exists status") } + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalLeave(%s)", proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + } @@ -117,7 +137,11 @@ func TestReplaceMember(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } // Submit, pass & execute replace member proposal - proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace node 1", trustedNodeAccount1.Address, nodeAccount.Address, "coolguy", "coolguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) + proposalOldMemberAddress := trustedNodeAccount1.Address + proposalNewMemberAddress := nodeAccount.Address + proposalNewMemberId := "coolguy" + proposalNewMemberEmail := "coolguy@rocketpool.net" + proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace node 1", proposalOldMemberAddress, proposalNewMemberAddress, proposalNewMemberId, proposalNewMemberEmail, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } @@ -150,6 +174,13 @@ func TestReplaceMember(t *testing.T) { t.Error("Incorrect updated new member exists status") } + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalReplace(%s,%s,%s,%s)", proposalOldMemberAddress.Hex(), proposalNewMemberId, proposalNewMemberEmail, proposalNewMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + } @@ -174,7 +205,9 @@ func TestKickMember(t *testing.T) { } // Submit, pass & execute kick member proposal - proposalId, _, err := trustednodedao.ProposeKickMember(rp, "kick node 2", trustedNodeAccount2.Address, eth.EthToWei(1000), trustedNodeAccount1.GetTransactor()) + proposalMemberAddress := trustedNodeAccount2.Address + proposalFineAmount := eth.EthToWei(1000) + proposalId, _, err := trustednodedao.ProposeKickMember(rp, "kick node 2", proposalMemberAddress, proposalFineAmount, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } @@ -185,5 +218,12 @@ func TestKickMember(t *testing.T) { t.Error("Incorrect updated member exists status") } + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalKick(%s,%s)", proposalMemberAddress.Hex(), proposalFineAmount.String()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + } From 1e514f5692f70da7de8c803ab6d95e909dc8010d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 10:17:10 +1000 Subject: [PATCH 288/878] implementing trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 31 +++++++++++++++++++++++++ tests/dao/trustednode/proposals_test.go | 8 +++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 82ed35708..a416a7797 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -5,6 +5,8 @@ import ( "math/big" "testing" + "github.com/ethereum/go-ethereum/common" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" @@ -109,3 +111,32 @@ func TestMemberDetails(t *testing.T) { } + +func TestUpgradeContract(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Upgrade contract + contractName := "rocketDepositPool" + contractNewAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + contractNewAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + if _, err := trustednodedao.BootstrapUpgrade(rp, "upgradeContract", contractName, contractNewAbi, contractNewAddress, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated contract details + if contractAddress, err := rp.GetAddress(contractName); err != nil { + t.Error(err) + } else if !bytes.Equal(contractAddress.Bytes(), contractNewAddress.Bytes()) { + t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) + } + if contractAbi, err := rp.GetABI(contractName); err != nil { + t.Error(err) + } else if _, ok := contractAbi.Methods["foo"]; !ok { + t.Errorf("Incorrect updated contract ABI") + } + +} + diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index cea41f4fe..241638ec6 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -17,7 +17,7 @@ import ( ) -func TestInviteMember(t *testing.T) { +func TestProposeInviteMember(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -68,7 +68,7 @@ func TestInviteMember(t *testing.T) { } -func TestMemberLeave(t *testing.T) { +func TestProposeMemberLeave(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -123,7 +123,7 @@ func TestMemberLeave(t *testing.T) { } -func TestReplaceMember(t *testing.T) { +func TestProposeReplaceMember(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -184,7 +184,7 @@ func TestReplaceMember(t *testing.T) { } -func TestKickMember(t *testing.T) { +func TestProposeKickMember(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } From 3f920491025d553620ce1a62da05ea15d38aa8b2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 10:45:05 +1000 Subject: [PATCH 289/878] implementing trusted node dao unit tests --- tests/dao/trustednode/proposals_test.go | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 241638ec6..db7c44491 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -1,12 +1,16 @@ package trustednode import ( + "bytes" "fmt" "testing" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao" trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -227,3 +231,48 @@ func TestProposeKickMember(t *testing.T) { } + +func TestProposeUpgradeContract(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + + // Submit, pass & execute upgrade contract proposal + proposalUpgradeType := "upgradeContract" + proposalContractName := "rocketDepositPool" + proposalContractAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + proposalContractAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + proposalId, _, err := trustednodedao.ProposeUpgradeContract(rp, "upgrade rocketDepositPool", proposalUpgradeType, proposalContractName, proposalContractAbi, proposalContractAddress, trustedNodeAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } + + // Get & check updated contract details + if contractAddress, err := rp.GetAddress(proposalContractName); err != nil { + t.Error(err) + } else if !bytes.Equal(contractAddress.Bytes(), proposalContractAddress.Bytes()) { + t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) + } + if contractAbi, err := rp.GetABI(proposalContractName); err != nil { + t.Error(err) + } else if _, ok := contractAbi.Methods["foo"]; !ok { + t.Errorf("Incorrect updated contract ABI") + } + + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if encodedAbi, err := rocketpool.EncodeAbiStr(proposalContractAbi); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalUpgrade(%s,%s,%s,%s)", proposalUpgradeType, proposalContractName, encodedAbi, proposalContractAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + +} + From d64ca3916cf33a3895d86556e5dee49ca0a02519 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 11:20:23 +1000 Subject: [PATCH 290/878] added dao proposal message --- dao/proposals.go | 19 +++++++++++++++++++ tests/dao/proposals_test.go | 3 +++ 2 files changed, 22 insertions(+) diff --git a/dao/proposals.go b/dao/proposals.go index 138fd8f36..133e8f407 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -27,6 +27,7 @@ type ProposalDetails struct { ID uint64 `json:"id"` DAO string `json:"dao"` ProposerAddress common.Address `json:"proposerAddress"` + Message string `json:"message"` CreatedBlock uint64 `json:"createdBlock"` StartBlock uint64 `json:"startBlock"` EndBlock uint64 `json:"endBlock"` @@ -257,6 +258,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind var wg errgroup.Group var dao string var proposerAddress common.Address + var message string var createdBlock uint64 var startBlock uint64 var endBlock uint64 @@ -280,6 +282,11 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind proposerAddress, err = GetProposalProposerAddress(rp, proposalId, opts) return err }) + wg.Go(func() error { + var err error + message, err = GetProposalMessage(rp, proposalId, opts) + return err + }) wg.Go(func() error { var err error createdBlock, err = GetProposalCreatedBlock(rp, proposalId, opts) @@ -352,6 +359,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind ID: proposalId, DAO: dao, ProposerAddress: proposerAddress, + Message: message, CreatedBlock: createdBlock, StartBlock: startBlock, EndBlock: endBlock, @@ -445,6 +453,17 @@ func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, op } return *proposerAddress, nil } +func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return "", err + } + message := new(string) + if err := rocketDAOProposal.Call(opts, message, "getMessage", big.NewInt(int64(proposalId))); err != nil { + return "", fmt.Errorf("Could not get proposal %d message: %w", proposalId, err) + } + return *message, nil +} func GetProposalCreatedBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 30aa14fb5..7980fa736 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -84,6 +84,9 @@ func TestProposalDetails(t *testing.T) { if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount.Address.Bytes()) { t.Errorf("Incorrect proposal proposer address %s", proposal.ProposerAddress.Hex()) } + if proposal.Message != proposalMessage { + t.Errorf("Incorrect proposal message %s", proposal.Message) + } if proposal.CreatedBlock == 0 { t.Errorf("Incorrect proposal created block %d", proposal.CreatedBlock) } From 7125b4ac554c5d1d4594a4aef049572e3a766e1e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 13:46:23 +1000 Subject: [PATCH 291/878] implementing auction unit tests --- tests/auction/auction_test.go | 85 ++++++++++++++++++++++++++++++ tests/auction/main_test.go | 51 ++++++++++++++++++ tests/testutils/auction/auction.go | 42 +++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 tests/auction/auction_test.go create mode 100644 tests/auction/main_test.go create mode 100644 tests/testutils/auction/auction.go diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go new file mode 100644 index 000000000..2e926ff71 --- /dev/null +++ b/tests/auction/auction_test.go @@ -0,0 +1,85 @@ +package auction + +import ( + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/auction" + + auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +func TestAuctionDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Get & check initial RPL balances + totalBalance1, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + allottedBalance1, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + remainingBalance1, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + if totalBalance1.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial auction contract total RPL balance %s", totalBalance1.String()) + } + if allottedBalance1.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial auction contract allotted RPL balance %s", allottedBalance1.String()) + } + if remainingBalance1.Cmp(totalBalance1) != 0 { + t.Errorf("Incorrect initial auction contract remaining RPL balance %s", remainingBalance1.String()) + } + + // Mint slashed RPL to auction contract + if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount); err != nil { + t.Fatal(err) + } + + // Get & check updated RPL balances + totalBalance2, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + allottedBalance2, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + remainingBalance2, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + if totalBalance2.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated auction contract total RPL balance 1 %s", totalBalance2.String()) + } + if allottedBalance2.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated auction contract allotted RPL balance 1 %s", allottedBalance2.String()) + } + if remainingBalance2.Cmp(totalBalance2) != 0 { + t.Errorf("Incorrect updated auction contract remaining RPL balance 1 %s", remainingBalance2.String()) + } + + // Create a new lot + if _, err := auction.CreateLot(rp, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated RPL balances + totalBalance3, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + allottedBalance3, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + remainingBalance3, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { t.Fatal(err) } + var expectedRemainingBalance big.Int + expectedRemainingBalance.Sub(totalBalance3, allottedBalance3) + if allottedBalance3.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated auction contract allotted RPL balance 2 %s", allottedBalance3.String()) + } + if remainingBalance3.Cmp(&expectedRemainingBalance) != 0 { + t.Errorf("Incorrect updated auction contract remaining RPL balance 2 %s", remainingBalance3.String()) + } + +} + diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go new file mode 100644 index 000000000..16fbc273a --- /dev/null +++ b/tests/auction/main_test.go @@ -0,0 +1,51 @@ +package auction + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + userAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + userAccount, err = accounts.GetAccount(9) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go new file mode 100644 index 000000000..831343fb5 --- /dev/null +++ b/tests/testutils/auction/auction.go @@ -0,0 +1,42 @@ +package auction + +import ( + "math/big" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +// Create an amount of slashed RPL in the auction contract +func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, userAccount *accounts.Account) error { + + // Stake a large amount of RPL against the node + if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { return err } + + // Create unbonded minipool + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)) + if err != nil { return err } + + // Deposit user ETH to minipool + opts := userAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + if _, err := deposit.Deposit(rp, opts); err != nil { return err } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, trustedNodeAccount); err != nil { return err } + + // Mark minipool as withdrawable with zero end balance + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), big.NewInt(0), trustedNodeAccount.GetTransactor()); err != nil { return err } + + // Return + return nil + +} + From 50a49559207f103a4b11a8f8045501930b1d80ba Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 14:03:04 +1000 Subject: [PATCH 292/878] return created auction lot ids --- auction/auction.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index aebdd685b..c38eec1c4 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -505,16 +505,20 @@ func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder c // Create a new lot -func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { - return nil, err + return 0, nil, err + } + lotCount, err := GetLotCount(rp, nil) + if err != nil { + return 0, nil, err } txReceipt, err := rocketAuctionManager.Transact(opts, "createLot") if err != nil { - return nil, fmt.Errorf("Could not create lot: %w", err) + return 0, nil, fmt.Errorf("Could not create lot: %w", err) } - return txReceipt, nil + return lotCount, txReceipt, nil } From ddd26715433252b959e3c9b43bbe3b70702f5c04 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 14:23:43 +1000 Subject: [PATCH 293/878] auction lot details fix --- auction/auction.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/auction/auction.go b/auction/auction.go index c38eec1c4..816787356 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -129,6 +129,7 @@ func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOp var endBlock uint64 var startPrice *big.Int var reservePrice *big.Int + var priceAtCurrentBlock *big.Int var priceByTotalBids *big.Int var currentPrice *big.Int var totalRplAmount *big.Int @@ -164,6 +165,11 @@ func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOp reservePrice, err = GetLotReservePrice(rp, lotIndex, opts) return err }) + wg.Go(func() error { + var err error + priceAtCurrentBlock, err = GetLotPriceAtCurrentBlock(rp, lotIndex, opts) + return err + }) wg.Go(func() error { var err error priceByTotalBids, err = GetLotPriceByTotalBids(rp, lotIndex, opts) @@ -218,6 +224,7 @@ func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOp EndBlock: endBlock, StartPrice: startPrice, ReservePrice: reservePrice, + PriceAtCurrentBlock: priceAtCurrentBlock, PriceByTotalBids: priceByTotalBids, CurrentPrice: currentPrice, TotalRPLAmount: totalRplAmount, From 831765f0f94233ee942518b7632eafb07670bdf7 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 14:24:04 +1000 Subject: [PATCH 294/878] implementing auction unit tests --- tests/auction/auction_test.go | 83 ++++++++++++++++++++++++++++++++++- tests/auction/main_test.go | 7 ++- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 2e926ff71..fd1b940ad 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/rocketpool-go/utils/eth" auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" @@ -39,7 +40,7 @@ func TestAuctionDetails(t *testing.T) { } // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount); err != nil { + if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } @@ -61,7 +62,7 @@ func TestAuctionDetails(t *testing.T) { } // Create a new lot - if _, err := auction.CreateLot(rp, userAccount.GetTransactor()); err != nil { + if _, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } @@ -83,3 +84,81 @@ func TestAuctionDetails(t *testing.T) { } + +func TestLotDetails(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Mint slashed RPL to auction contract + if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } + + // Get initial lot details + if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(lots) != 0 { + t.Error("Incorrect initial lot count") + } + + // Create lot + lotIndex, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + + // Place bid on lot + bidAmount := eth.EthToWei(1) + bid1Opts := userAccount1.GetTransactor() + bid1Opts.Value = bidAmount + if _, err := auction.PlaceBid(rp, lotIndex, bid1Opts); err != nil { t.Fatal(err) } + + // Place another lot on bid to close it + bid2Opts := userAccount2.GetTransactor() + bid2Opts.Value = eth.EthToWei(1000) + if _, err := auction.PlaceBid(rp, lotIndex, bid2Opts); err != nil { t.Fatal(err) } + + // Get updated lot details + if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(lots) != 1 { + t.Error("Incorrect updated lot count") + } else { + lot := lots[0] + if lot.Index != lotIndex { + t.Errorf("Incorrect lot index %d", lot.Index) + } + if !lot.Exists { + t.Error("Incorrect lot exists status") + } + if lot.StartBlock == 0 { + t.Errorf("Incorrect lot start block %d", lot.StartBlock) + } + if lot.EndBlock <= lot.StartBlock { + t.Errorf("Incorrect lot end block %d", lot.EndBlock) + } + //if lot.StartPrice + //if lot.ReservePrice + if lot.PriceAtCurrentBlock.Cmp(lot.StartPrice) == 1 || lot.PriceAtCurrentBlock.Cmp(lot.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot.PriceAtCurrentBlock.String()) + } + //if lot.PriceByTotalBids + //if lot.CurrentPrice + //if lot.TotalRPLAmount + //if lot.ClaimedRPLAmount + //if lot.RemainingRPLAmount + //if lot.TotalBidAmount + if lot.AddressBidAmount.Cmp(bidAmount) != 0 { + t.Errorf("Incorrect lot address bid amount %s", lot.AddressBidAmount.String()) + } + if !lot.Cleared { + t.Error("Incorrect lot cleared status") + } + if lot.RPLRecovered { + t.Error("Incorrect lot RPL recovered status") + } + } + +} + diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 16fbc273a..3d2434f6f 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -21,7 +21,8 @@ var ( ownerAccount *accounts.Account trustedNodeAccount *accounts.Account - userAccount *accounts.Account + userAccount1 *accounts.Account + userAccount2 *accounts.Account ) @@ -41,7 +42,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } trustedNodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) + userAccount1, err = accounts.GetAccount(8) + if err != nil { log.Fatal(err) } + userAccount2, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } // Run tests From dae4195b90b137bfb9981a9848183d265066aacd Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 14:37:12 +1000 Subject: [PATCH 295/878] implementing auction unit tests --- tests/auction/auction_test.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index fd1b940ad..64b59b525 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -143,12 +143,18 @@ func TestLotDetails(t *testing.T) { if lot.PriceAtCurrentBlock.Cmp(lot.StartPrice) == 1 || lot.PriceAtCurrentBlock.Cmp(lot.ReservePrice) == -1 { t.Errorf("Incorrect lot price at current block %s", lot.PriceAtCurrentBlock.String()) } - //if lot.PriceByTotalBids - //if lot.CurrentPrice + if lot.PriceByTotalBids.Cmp(lot.StartPrice) == 1 || lot.PriceByTotalBids.Cmp(lot.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot.PriceByTotalBids.String()) + } + if lot.CurrentPrice.Cmp(lot.StartPrice) == 1 || lot.CurrentPrice.Cmp(lot.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot.CurrentPrice.String()) + } //if lot.TotalRPLAmount //if lot.ClaimedRPLAmount //if lot.RemainingRPLAmount - //if lot.TotalBidAmount + if lot.TotalBidAmount.Cmp(bidAmount) != 1 { + t.Errorf("Incorrect lot total bid amount %s", lot.TotalBidAmount.String()) + } if lot.AddressBidAmount.Cmp(bidAmount) != 0 { t.Errorf("Incorrect lot address bid amount %s", lot.AddressBidAmount.String()) } From f6e8e15c50afe0c721f63dd266a33851ea984935 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 15:09:07 +1000 Subject: [PATCH 296/878] implementing auction unit tests --- tests/auction/auction_test.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 64b59b525..a0b6ac114 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -5,6 +5,8 @@ import ( "testing" "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" @@ -94,6 +96,12 @@ func TestLotDetails(t *testing.T) { // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Set network parameters + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Mint slashed RPL to auction contract if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } @@ -138,8 +146,12 @@ func TestLotDetails(t *testing.T) { if lot.EndBlock <= lot.StartBlock { t.Errorf("Incorrect lot end block %d", lot.EndBlock) } - //if lot.StartPrice - //if lot.ReservePrice + if lot.StartPrice.Cmp(eth.EthToWei(1)) != 0 { + t.Errorf("Incorrect lot start price %s", lot.StartPrice.String()) + } + if lot.ReservePrice.Cmp(eth.EthToWei(0.5)) != 0 { + t.Errorf("Incorrect lot reserve price %s", lot.ReservePrice.String()) + } if lot.PriceAtCurrentBlock.Cmp(lot.StartPrice) == 1 || lot.PriceAtCurrentBlock.Cmp(lot.ReservePrice) == -1 { t.Errorf("Incorrect lot price at current block %s", lot.PriceAtCurrentBlock.String()) } @@ -149,9 +161,15 @@ func TestLotDetails(t *testing.T) { if lot.CurrentPrice.Cmp(lot.StartPrice) == 1 || lot.CurrentPrice.Cmp(lot.ReservePrice) == -1 { t.Errorf("Incorrect lot price at current block %s", lot.CurrentPrice.String()) } - //if lot.TotalRPLAmount - //if lot.ClaimedRPLAmount - //if lot.RemainingRPLAmount + if lot.TotalRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot total RPL amount %s", lot.TotalRPLAmount.String()) + } + if lot.ClaimedRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot claimed RPL amount %s", lot.ClaimedRPLAmount.String()) + } + if lot.RemainingRPLAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect lot remaining RPL amount %s", lot.RemainingRPLAmount.String()) + } if lot.TotalBidAmount.Cmp(bidAmount) != 1 { t.Errorf("Incorrect lot total bid amount %s", lot.TotalBidAmount.String()) } From 4fe7ffb4b266ce2e79dd3874c491c2a04087eb6c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 15:28:17 +1000 Subject: [PATCH 297/878] implementing auction unit tests --- tests/auction/auction_test.go | 111 ++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 37 deletions(-) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index a0b6ac114..088c9dd01 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -7,6 +7,7 @@ import ( "github.com/rocket-pool/rocketpool-go/auction" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" @@ -101,6 +102,7 @@ func TestLotDetails(t *testing.T) { if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapLotDuration(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mint slashed RPL to auction contract if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } @@ -112,76 +114,111 @@ func TestLotDetails(t *testing.T) { t.Error("Incorrect initial lot count") } - // Create lot - lotIndex, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) + // Create lots + lot1Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) + if err != nil { t.Fatal(err) } + lot2Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - // Place bid on lot + // Place bid on lot 1 bidAmount := eth.EthToWei(1) bid1Opts := userAccount1.GetTransactor() bid1Opts.Value = bidAmount - if _, err := auction.PlaceBid(rp, lotIndex, bid1Opts); err != nil { t.Fatal(err) } + if _, err := auction.PlaceBid(rp, lot1Index, bid1Opts); err != nil { t.Fatal(err) } - // Place another lot on bid to close it + // Place another bid on lot 1 to clear it bid2Opts := userAccount2.GetTransactor() bid2Opts.Value = eth.EthToWei(1000) - if _, err := auction.PlaceBid(rp, lotIndex, bid2Opts); err != nil { t.Fatal(err) } + if _, err := auction.PlaceBid(rp, lot1Index, bid2Opts); err != nil { t.Fatal(err) } + + // Mine blocks until lot 2 hits reserve price & recover unclaimed RPL from it + if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + if _, err := auction.RecoverUnclaimedRPL(rp, lot2Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Get updated lot details if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { t.Error(err) - } else if len(lots) != 1 { + } else if len(lots) != 2 { t.Error("Incorrect updated lot count") } else { - lot := lots[0] - if lot.Index != lotIndex { - t.Errorf("Incorrect lot index %d", lot.Index) + lot1 := lots[0] + lot2 := lots[1] + + // Lot 1 + if lot1.Index != lot1Index { + t.Errorf("Incorrect lot index %d", lot1.Index) } - if !lot.Exists { + if !lot1.Exists { t.Error("Incorrect lot exists status") } - if lot.StartBlock == 0 { - t.Errorf("Incorrect lot start block %d", lot.StartBlock) + if lot1.StartBlock == 0 { + t.Errorf("Incorrect lot start block %d", lot1.StartBlock) } - if lot.EndBlock <= lot.StartBlock { - t.Errorf("Incorrect lot end block %d", lot.EndBlock) + if lot1.EndBlock <= lot1.StartBlock { + t.Errorf("Incorrect lot end block %d", lot1.EndBlock) } - if lot.StartPrice.Cmp(eth.EthToWei(1)) != 0 { - t.Errorf("Incorrect lot start price %s", lot.StartPrice.String()) + if lot1.StartPrice.Cmp(eth.EthToWei(1)) != 0 { + t.Errorf("Incorrect lot start price %s", lot1.StartPrice.String()) } - if lot.ReservePrice.Cmp(eth.EthToWei(0.5)) != 0 { - t.Errorf("Incorrect lot reserve price %s", lot.ReservePrice.String()) + if lot1.ReservePrice.Cmp(eth.EthToWei(0.5)) != 0 { + t.Errorf("Incorrect lot reserve price %s", lot1.ReservePrice.String()) } - if lot.PriceAtCurrentBlock.Cmp(lot.StartPrice) == 1 || lot.PriceAtCurrentBlock.Cmp(lot.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot.PriceAtCurrentBlock.String()) + if lot1.PriceAtCurrentBlock.Cmp(lot1.StartPrice) == 1 || lot1.PriceAtCurrentBlock.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.PriceAtCurrentBlock.String()) } - if lot.PriceByTotalBids.Cmp(lot.StartPrice) == 1 || lot.PriceByTotalBids.Cmp(lot.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot.PriceByTotalBids.String()) + if lot1.PriceByTotalBids.Cmp(lot1.StartPrice) == 1 || lot1.PriceByTotalBids.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.PriceByTotalBids.String()) } - if lot.CurrentPrice.Cmp(lot.StartPrice) == 1 || lot.CurrentPrice.Cmp(lot.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot.CurrentPrice.String()) + if lot1.CurrentPrice.Cmp(lot1.StartPrice) == 1 || lot1.CurrentPrice.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.CurrentPrice.String()) } - if lot.TotalRPLAmount.Cmp(eth.EthToWei(10)) != 0 { - t.Errorf("Incorrect lot total RPL amount %s", lot.TotalRPLAmount.String()) + if lot1.TotalRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot total RPL amount %s", lot1.TotalRPLAmount.String()) } - if lot.ClaimedRPLAmount.Cmp(eth.EthToWei(10)) != 0 { - t.Errorf("Incorrect lot claimed RPL amount %s", lot.ClaimedRPLAmount.String()) + if lot1.ClaimedRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot claimed RPL amount %s", lot1.ClaimedRPLAmount.String()) } - if lot.RemainingRPLAmount.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect lot remaining RPL amount %s", lot.RemainingRPLAmount.String()) + if lot1.RemainingRPLAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect lot remaining RPL amount %s", lot1.RemainingRPLAmount.String()) } - if lot.TotalBidAmount.Cmp(bidAmount) != 1 { - t.Errorf("Incorrect lot total bid amount %s", lot.TotalBidAmount.String()) + if lot1.TotalBidAmount.Cmp(bidAmount) != 1 { + t.Errorf("Incorrect lot total bid amount %s", lot1.TotalBidAmount.String()) } - if lot.AddressBidAmount.Cmp(bidAmount) != 0 { - t.Errorf("Incorrect lot address bid amount %s", lot.AddressBidAmount.String()) + if lot1.AddressBidAmount.Cmp(bidAmount) != 0 { + t.Errorf("Incorrect lot address bid amount %s", lot1.AddressBidAmount.String()) } - if !lot.Cleared { + if !lot1.Cleared { t.Error("Incorrect lot cleared status") } - if lot.RPLRecovered { + if lot1.RPLRecovered { + t.Error("Incorrect lot RPL recovered status") + } + + // Lot 2 + if lot2.Index != lot2Index { + t.Errorf("Incorrect lot index %d", lot2.Index) + } + if !lot2.RPLRecovered { t.Error("Incorrect lot RPL recovered status") } + + } + + // Get & check initial bidder RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial bidder RPL balance %s", rplBalance.String()) + } + + // Claim bid on lot 1 + if _, err := auction.ClaimBid(rp, lot1Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated bidder RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated bidder RPL balance %s", rplBalance.String()) } } From c17f45a556ddda8ba74b2ac4cb3b9e48e14fea5e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 15:32:26 +1000 Subject: [PATCH 298/878] implementing auction unit tests --- tests/auction/auction_test.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 088c9dd01..3b5876de8 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -107,7 +107,7 @@ func TestLotDetails(t *testing.T) { // Mint slashed RPL to auction contract if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } - // Get initial lot details + // Get & check initial lot details if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if len(lots) != 0 { @@ -135,7 +135,7 @@ func TestLotDetails(t *testing.T) { if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } if _, err := auction.RecoverUnclaimedRPL(rp, lot2Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } - // Get updated lot details + // Get & check updated lot details if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if len(lots) != 2 { @@ -194,6 +194,18 @@ func TestLotDetails(t *testing.T) { t.Error("Incorrect lot RPL recovered status") } + // Lot 1 prices at blocks + if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 0, nil); err != nil { + t.Error(err) + } else if priceAtBlock.Cmp(lot1.StartPrice) != 0 { + t.Errorf("Incorrect lot price at block 1 %s", priceAtBlock.String()) + } + if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 1000000, nil); err != nil { + t.Error(err) + } else if priceAtBlock.Cmp(lot1.ReservePrice) != 0 { + t.Errorf("Incorrect lot price at block 2 %s", priceAtBlock.String()) + } + // Lot 2 if lot2.Index != lot2Index { t.Errorf("Incorrect lot index %d", lot2.Index) From 91baa1f75b73087bb3bf85c086df4f3344a62e84 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 17:30:16 +1000 Subject: [PATCH 299/878] implementing rewards unit tests --- tests/rewards/main_test.go | 51 ++++++++++++++++ tests/rewards/node_test.go | 115 +++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 tests/rewards/main_test.go create mode 100644 tests/rewards/node_test.go diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go new file mode 100644 index 000000000..bdda658f5 --- /dev/null +++ b/tests/rewards/main_test.go @@ -0,0 +1,51 @@ +package rewards + +import ( + "log" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" +) + + +var ( + client *ethclient.Client + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account +) + + +func TestMain(m *testing.M) { + var err error + + // Initialize eth client + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { log.Fatal(err) } + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { log.Fatal(err) } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { log.Fatal(err) } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + + // Run tests + os.Exit(m.Run()) + +} + diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go new file mode 100644 index 000000000..d1e1e0c21 --- /dev/null +++ b/tests/rewards/node_test.go @@ -0,0 +1,115 @@ +package rewards + +import ( + "context" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" +) + + +func TestNodeRewards(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Set network parameters + if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check node claims enabled status + if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { + t.Error(err) + } else if !claimsEnabled { + t.Error("Incorrect node claims enabled status") + } + + // Get & check initial node claim possible status + if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeClaimPossible { + t.Error("Incorrect initial node claim possible status") + } + + // Mine blocks until node claims are possible + if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + + // Get & check updated node claim possible status + if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !nodeClaimPossible { + t.Error("Incorrect updated node claim possible status") + } + + // Get & check initial node claim rewards percent + if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 0 { + t.Errorf("Incorrect initial node claim rewards perc %f", rewardsPerc) + } + + // Stake RPL & create a minipool + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + + // Get & check updated node claim rewards percent + if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 1 { + t.Errorf("Incorrect updated node claim rewards perc %f", rewardsPerc) + } + + // Get & check initial node claim rewards amount + if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node claim rewards amount %s", rewardsAmount.String()) + } + + // Start RPL inflation + if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { + t.Fatal(err) + } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Mine blocks until rewards are available + if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + + // Get & check updated node claim rewards amount + if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node claim rewards amount %s", rewardsAmount.String()) + } + + // Get & check initial node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) + } + + // Claim node rewards + if _, err := rewards.ClaimNodeRewards(rp, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) + } + +} + From 01d252fd12d1cfdd321ddaff1f262108d0aab90f Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 17 Feb 2021 17:40:39 +1000 Subject: [PATCH 300/878] implementing rewards unit tests --- tests/rewards/trusted_node_test.go | 103 +++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 tests/rewards/trusted_node_test.go diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go new file mode 100644 index 000000000..d2fb0dd57 --- /dev/null +++ b/tests/rewards/trusted_node_test.go @@ -0,0 +1,103 @@ +package rewards + +import ( + "context" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" +) + + +func TestTrustedNodeRewards(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Set network parameters + if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check trusted node claims enabled status + if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { + t.Error(err) + } else if !claimsEnabled { + t.Error("Incorrect trusted node claims enabled status") + } + + // Get & check initial trusted node claim possible status + if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeClaimPossible { + t.Error("Incorrect initial trusted node claim possible status") + } + + // Mine blocks until trusted node claims are possible + if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + + // Get & check updated trusted node claim possible status + if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !nodeClaimPossible { + t.Error("Incorrect updated trusted node claim possible status") + } + + // Get & check trusted node claim rewards percent + if rewardsPerc, err := rewards.GetTrustedNodeClaimRewardsPerc(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 1 { + t.Errorf("Incorrect trusted node claim rewards perc %f", rewardsPerc) + } + + // Get & check initial trusted node claim rewards amount + if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial trusted node claim rewards amount %s", rewardsAmount.String()) + } + + // Start RPL inflation + if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { + t.Fatal(err) + } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Mine blocks until rewards are available + if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + + // Get & check updated trusted node claim rewards amount + if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated trusted node claim rewards amount %s", rewardsAmount.String()) + } + + // Get & check initial node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) + } + + // Claim node rewards + if _, err := rewards.ClaimTrustedNodeRewards(rp, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get & check updated node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) + } + +} + From eb7f3f34c077d525457a247d831fa1f6e94a9d5d Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 09:42:25 +1000 Subject: [PATCH 301/878] updating rpl token unit tests --- tests/tokens/rpl_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index c193803d1..c88a8acb8 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -1,10 +1,12 @@ package tokens import ( + "context" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -107,6 +109,44 @@ func TestTransferFromRPL(t *testing.T) { } +func TestMintInflationRPL(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Set network parameters + if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Start RPL inflation + if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { + t.Fatal(err) + } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Mine blocks until rewards are available + if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + + // Get initial total supply + rplTotalSupply1, err := tokens.GetRPLTotalSupply(rp, nil) + if err != nil { t.Fatal(err) } + + // Mint RPL from inflation + if _, err := tokens.MintInflationRPL(rp, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated total supply + rplTotalSupply2, err := tokens.GetRPLTotalSupply(rp, nil) + if err != nil { t.Fatal(err) } + if rplTotalSupply2.Cmp(rplTotalSupply1) != 1 { + t.Errorf("Incorrect updated RPL total supply %s", rplTotalSupply2.String()) + } + +} + + func TestSwapFixedSupplyRPLForRPL(t *testing.T) { // State snapshotting From 8a3e68d2f9f25345e250a571f7abfbfc6a29563e Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 09:49:43 +1000 Subject: [PATCH 302/878] updating auction unit tests --- tests/auction/auction_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 3b5876de8..b82a87ab6 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -108,6 +108,11 @@ func TestLotDetails(t *testing.T) { if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } // Get & check initial lot details + if lots, err := auction.GetLots(rp, nil); err != nil { + t.Error(err) + } else if len(lots) != 0 { + t.Error("Incorrect initial lot count") + } if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if len(lots) != 0 { @@ -136,6 +141,13 @@ func TestLotDetails(t *testing.T) { if _, err := auction.RecoverUnclaimedRPL(rp, lot2Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated lot details + if lots, err := auction.GetLots(rp, nil); err != nil { + t.Error(err) + } else if len(lots) != 2 { + t.Error("Incorrect updated lot count") + } else if lots[0].Index != lot1Index || lots[1].Index != lot2Index { + t.Error("Incorrect lot indexes") + } if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { t.Error(err) } else if len(lots) != 2 { From a0b2f66bc9dfa898fc5ab5117269db27671d2703 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 10:06:01 +1000 Subject: [PATCH 303/878] updating trusted node dao unit tests --- tests/dao/trustednode/dao_test.go | 22 ++----------------- tests/dao/trustednode/proposals_test.go | 28 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index a416a7797..c7e4d9044 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -11,8 +11,6 @@ import ( "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" @@ -54,10 +52,8 @@ func TestMemberDetails(t *testing.T) { t.Fatal(err) } - // Submit, pass & execute replace member proposal - proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace me", trustedNodeAccount1.Address, nodeAccount.Address, "newguy", "newguy@rocketpool.net", trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } + // Submit a proposal + if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Create an unbonded minipool if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount1, big.NewInt(0)); err != nil { t.Fatal(err) } @@ -95,20 +91,6 @@ func TestMemberDetails(t *testing.T) { } } - // Get & check member invite executed block - if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if inviteExecutedBlock == 0 { - t.Errorf("Incorrect member invite proposal executed block %d", inviteExecutedBlock) - } - - // Get & check member replacement address - if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(replacementAddress.Bytes(), nodeAccount.Address.Bytes()) { - t.Errorf("Incorrect member replacement address %s", replacementAddress.Hex()) - } - } diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index db7c44491..3b865792b 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -69,6 +69,13 @@ func TestProposeInviteMember(t *testing.T) { t.Errorf("Incorrect proposal payload string %s", payloadStr) } + // Get & check member invite executed block + if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, proposalMemberAddress, nil); err != nil { + t.Error(err) + } else if inviteExecutedBlock == 0 { + t.Errorf("Incorrect member invite proposal executed block %d", inviteExecutedBlock) + } + } @@ -124,6 +131,13 @@ func TestProposeMemberLeave(t *testing.T) { t.Errorf("Incorrect proposal payload string %s", payloadStr) } + // Get & check member leave executed block + if leaveExecutedBlock, err := trustednodedao.GetMemberLeaveProposalExecutedBlock(rp, proposalMemberAddress, nil); err != nil { + t.Error(err) + } else if leaveExecutedBlock == 0 { + t.Errorf("Incorrect member leave proposal executed block %d", leaveExecutedBlock) + } + } @@ -185,6 +199,20 @@ func TestProposeReplaceMember(t *testing.T) { t.Errorf("Incorrect proposal payload string %s", payloadStr) } + // Get & check member replace executed block + if replaceExecutedBlock, err := trustednodedao.GetMemberReplaceProposalExecutedBlock(rp, proposalOldMemberAddress, nil); err != nil { + t.Error(err) + } else if replaceExecutedBlock == 0 { + t.Errorf("Incorrect member replace proposal executed block %d", replaceExecutedBlock) + } + + // Get & check member replacement address + if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, proposalOldMemberAddress, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(replacementAddress.Bytes(), proposalNewMemberAddress.Bytes()) { + t.Errorf("Incorrect member replacement address %s", replacementAddress.Hex()) + } + } From e160360941b91236c5c2f0043d8e3c826a361c17 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 10:21:00 +1000 Subject: [PATCH 304/878] updating dao proposals unit tests --- tests/dao/proposals_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 7980fa736..5c7a1a858 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -33,11 +33,21 @@ func TestProposalDetails(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Get & check initial proposal details + if proposals, err := dao.GetProposals(rp, nil); err != nil { + t.Error(err) + } else if len(proposals) != 0 { + t.Error("Incorrect initial proposal count") + } if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { t.Error(err) } else if len(proposals) != 0 { t.Error("Incorrect initial proposal count") } + if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 0 { + t.Error("Incorrect initial DAO proposal count") + } if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { t.Error(err) } else if len(daoProposals) != 0 { @@ -67,6 +77,13 @@ func TestProposalDetails(t *testing.T) { if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated proposal details + if proposals, err := dao.GetProposals(rp, nil); err != nil { + t.Error(err) + } else if len(proposals) != 2 { + t.Error("Incorrect updated proposal count") + } else if proposals[0].ID != proposalId || proposals[1].ID != cancelledProposalId { + t.Error("Incorrect proposal indexes") + } if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { t.Error(err) } else if len(proposals) != 2 { @@ -137,10 +154,19 @@ func TestProposalDetails(t *testing.T) { } } + if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 2 { + t.Error("Incorrect updated DAO proposal count") + } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { + t.Error("Incorrect DAO proposal indexes") + } if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { t.Error(err) } else if len(daoProposals) != 2 { t.Error("Incorrect updated DAO proposal count") + } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { + t.Error("Incorrect DAO proposal indexes") } } From 78f3479e893854cf779ef94f05f41d92d7df6725 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 10:39:25 +1000 Subject: [PATCH 305/878] updating minipool unit tests --- tests/minipool/contract_test.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 5b992b68f..8b5c52b4f 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -53,8 +53,16 @@ func TestDetails(t *testing.T) { // Get & check minipool details if status, err := mp.GetStatusDetails(nil); err != nil { t.Error(err) - } else if status.Status != rptypes.Withdrawable { - t.Errorf("Incorrect minipool status %s", status.Status.String()) + } else { + if status.Status != rptypes.Withdrawable { + t.Errorf("Incorrect minipool status %s", status.Status.String()) + } + if status.StatusBlock == 0 { + t.Errorf("Incorrect minipool status block %d", status.StatusBlock) + } + if status.StatusTime.Unix() == 0 { + t.Errorf("Incorrect minipool status time %v", status.StatusTime) + } } if depositType, err := mp.GetDepositType(nil); err != nil { t.Error(err) @@ -92,6 +100,9 @@ func TestDetails(t *testing.T) { if !user.DepositAssigned { t.Error("Incorrect minipool user deposit assigned status") } + if user.DepositAssignedTime.Unix() == 0 { + t.Errorf("Incorrect minipool user deposit assigned time %v", user.DepositAssignedTime) + } } if staking, err := mp.GetStakingDetails(nil); err != nil { t.Error(err) From 186df7e0b63a37aa52e28010d6e104690e4b5813 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 14:17:43 +1000 Subject: [PATCH 306/878] implementing test helper script --- test.sh | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 test.sh diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..78a4dbee4 --- /dev/null +++ b/test.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash + +# Exit if a command fails +set -o errexit + + +## +# Config +## + + +# Rocket Pool settings +rp_repo_url="https://github.com/rocket-pool/rocketpool.git" +rp_repo_branch="v2.5-Tokenomics-updates" + +# Dependencies + +# Ganache settings +ganache_gas_limit="12450000" +ganache_eth_balance="1000000" +ganache_mnemonic="jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet" +ganache_port="8545" + + +## +# Helpers +## + + +# Clean up +cleanup() { + + # Remove RP repo + if [ -d "$rp_tmp_path" ]; then + rm -rf "$rp_tmp_path" + fi + + # Kill ganache instance + if [ -n "$ganache_pid" ] && ps -p "$ganache_pid" > /dev/null; then + kill -9 "$ganache_pid" + fi + +} + +# Clone Rocket Pool repo +clone_rp() { + rp_tmp_path="$(mktemp -d)" + rp_path="$rp_tmp_path/rocketpool" + git clone "$rp_repo_url" -b "$rp_repo_branch" "$rp_path" +} + +# Install Rocket Pool dependencies +install_rp_deps() { + cd "$rp_path" + rm package.json package-lock.json + npm install \ + babel-register \ + babel-polyfill \ + web3@1.2.8 \ + ganache-cli@6.12.2 \ + truffle@5.1.66 \ + truffle-contract@4.0.31 \ + @openzeppelin/contracts@3.3.0 \ + pako@1.0.11 + cd - > /dev/null +} + +# Start ganache-cli instance +start_ganache() { + cd "$rp_path" + node_modules/.bin/ganache-cli -l "$ganache_gas_limit" -e "$ganache_eth_balance" -m "$ganache_mnemonic" -p "$ganache_port" > /dev/null & + ganache_pid=$! + cd - > /dev/null +} + +# Migrate Rocket Pool contracts +migrate_rp() { + cd "$rp_path" + node_modules/.bin/truffle migrate + cd - > /dev/null +} + + +## +# Run +## + + +# Clean up before exiting +trap cleanup EXIT + +# Clone RP repo +echo "" +echo "Cloning main Rocket Pool repository..." +echo "" +clone_rp + +# Install RP deps +echo "" +echo "Installing Rocket Pool dependencies..." +echo "" +install_rp_deps + +# Start ganache +echo "" +echo "Starting ganache-cli process..." +echo "" +start_ganache + +# Migrate RP contracts +echo "" +echo "Migrating Rocket Pool contracts..." +echo "" +migrate_rp + From 09c6e00fd49fb9643d02c648f52db787228208d5 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 14:25:55 +1000 Subject: [PATCH 307/878] implementing test helper script --- test.sh | 24 +++++++++++++----------- tests/config.go | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/test.sh b/test.sh index 78a4dbee4..972cba716 100755 --- a/test.sh +++ b/test.sh @@ -14,10 +14,20 @@ rp_repo_url="https://github.com/rocket-pool/rocketpool.git" rp_repo_branch="v2.5-Tokenomics-updates" # Dependencies +rp_dependencies=( + "@openzeppelin/contracts@3.3.0" + "babel-polyfill@6.26.0" + "babel-register@6.26.0" + "ganache-cli@6.12.2" + "pako@1.0.11" + "truffle@5.1.66" + "truffle-contract@4.0.31" + "web3@1.2.8" +) # Ganache settings -ganache_gas_limit="12450000" ganache_eth_balance="1000000" +ganache_gas_limit="12450000" ganache_mnemonic="jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet" ganache_port="8545" @@ -53,22 +63,14 @@ clone_rp() { install_rp_deps() { cd "$rp_path" rm package.json package-lock.json - npm install \ - babel-register \ - babel-polyfill \ - web3@1.2.8 \ - ganache-cli@6.12.2 \ - truffle@5.1.66 \ - truffle-contract@4.0.31 \ - @openzeppelin/contracts@3.3.0 \ - pako@1.0.11 + npm install "${rp_dependencies[@]}" cd - > /dev/null } # Start ganache-cli instance start_ganache() { cd "$rp_path" - node_modules/.bin/ganache-cli -l "$ganache_gas_limit" -e "$ganache_eth_balance" -m "$ganache_mnemonic" -p "$ganache_port" > /dev/null & + node_modules/.bin/ganache-cli -e "$ganache_eth_balance" -l "$ganache_gas_limit" -m "$ganache_mnemonic" -p "$ganache_port" > /dev/null & ganache_pid=$! cd - > /dev/null } diff --git a/tests/config.go b/tests/config.go index ae5682acf..c21f3c4f2 100644 --- a/tests/config.go +++ b/tests/config.go @@ -1,8 +1,8 @@ package tests -// Contract addresses and account private keys are based on the following ganache-cli startup command: -// ganache-cli -l 12450000 -e 1000000 -m "jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet" -i 1337 +// Contract addresses and account private keys are based on the following mnemonic: +// jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet const ( From fb7d8ed44911fd8d86a04de709a34910215b33a2 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Thu, 18 Feb 2021 14:37:56 +1000 Subject: [PATCH 308/878] implementing test helper script --- test.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test.sh b/test.sh index 972cba716..207182d28 100755 --- a/test.sh +++ b/test.sh @@ -3,6 +3,17 @@ # Exit if a command fails set -o errexit +# Check commands +if ! command -v git &> /dev/null; then + echo "git command required"; exit +fi +if ! command -v npm &> /dev/null; then + echo "npm command required"; exit +fi +if ! command -v go &> /dev/null; then + echo "go command required"; exit +fi + ## # Config @@ -82,6 +93,12 @@ migrate_rp() { cd - > /dev/null } +# Run tests +run_tests() { + go clean -testcache + go test -p 1 ./... +} + ## # Run @@ -115,3 +132,9 @@ echo "Migrating Rocket Pool contracts..." echo "" migrate_rp +# Run tests +echo "" +echo "Running tests..." +echo "" +run_tests + From eb77374615ec1079d416fe352439d88aec35e19c Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 24 Feb 2021 14:13:49 +1000 Subject: [PATCH 309/878] added trusted node dao min member count getter --- dao/trustednode/dao.go | 14 ++++++++++++++ tests/dao/trustednode/dao_test.go | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 0ccef102e..56737f857 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -185,6 +185,20 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o } +// Get the minimum member count +func GetMinimumMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + minMemberCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, minMemberCount, "getMemberMinRequired"); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO minimum member count: %w", err) + } + return (*minMemberCount).Uint64(), nil +} + + // Get the member count func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index c7e4d9044..abf5554be 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -23,6 +23,13 @@ func TestMemberDetails(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Get & check minimum member count + if minMemberCount, err := trustednodedao.GetMinimumMemberCount(rp, nil); err != nil { + t.Error(err) + } else if minMemberCount == 0 { + t.Error("Incorrect trusted node DAO minimum member count") + } + // Get & check initial member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { t.Error(err) From fb20418514a4e84158fce1f3befd8112a9ad5263 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 2 Mar 2021 09:29:59 +1000 Subject: [PATCH 310/878] moved network SWC address getter/setter to protocol dao settings --- dao/protocol/dao.go | 15 ++++++++ network/withdrawal.go | 50 ------------------------- settings/protocol/network.go | 18 +++++++++ tests/minipool/contract_test.go | 2 +- tests/network/withdrawal_test.go | 35 ----------------- tests/settings/protocol/network_test.go | 12 ++++++ tests/tokens/neth_test.go | 4 +- 7 files changed, 48 insertions(+), 88 deletions(-) delete mode 100644 network/withdrawal.go delete mode 100644 tests/network/withdrawal_test.go diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 5ec96a9b3..15e36ae65 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -41,6 +42,20 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Bootstrap an address setting +func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) + if err != nil { + return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + } + return txReceipt, nil +} + + // Bootstrap a rewards claimer func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) diff --git a/network/withdrawal.go b/network/withdrawal.go deleted file mode 100644 index 1c55496fc..000000000 --- a/network/withdrawal.go +++ /dev/null @@ -1,50 +0,0 @@ -package network - -import ( - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - - "github.com/rocket-pool/rocketpool-go/rocketpool" -) - - -// Get the system withdrawal contract address -func GetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { - rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) - if err != nil { - return common.Address{}, err - } - swcAddress := new(common.Address) - if err := rocketNetworkWithdrawal.Call(opts, swcAddress, "getSystemWithdrawalContractAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get system withdrawal contract address: %w", err) - } - return *swcAddress, nil -} - - -// Set the system withdrawal contract address -func SetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, swcAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketNetworkWithdrawal, err := getRocketNetworkWithdrawal(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketNetworkWithdrawal.Transact(opts, "setSystemWithdrawalContractAddress", swcAddress) - if err != nil { - return nil, fmt.Errorf("Could not set system withdrawal contract address: %w", err) - } - return txReceipt, nil -} - - -// Get contracts -var rocketNetworkWithdrawalLock sync.Mutex -func getRocketNetworkWithdrawal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkWithdrawalLock.Lock() - defer rocketNetworkWithdrawalLock.Unlock() - return rp.GetContract("rocketNetworkWithdrawal") -} - diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 19eb3cc55..76eb36069 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" @@ -205,6 +206,23 @@ func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, } +// The eth2 system withdrawal contract address +func GetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := networkSettingsContract.Call(opts, value, "getSystemWithdrawalContractAddress"); err != nil { + return common.Address{}, fmt.Errorf("Could not get system withdrawal contract address: %w", err) + } + return *value, nil +} +func BootstrapSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, value common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + return protocoldao.BootstrapAddress(rp, NetworkSettingsContractName, "network.withdrawal.contract.address", value, opts) +} + + // Get contracts var networkSettingsContractLock sync.Mutex func getNetworkSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 8b5c52b4f..24ef65b3a 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -366,7 +366,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set SWC address - if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check initial minipool validator balance withdrawn status if validatorBalanceWithdrawn, err := mp.GetValidatorBalanceWithdrawn(nil); err != nil { diff --git a/tests/network/withdrawal_test.go b/tests/network/withdrawal_test.go deleted file mode 100644 index d769a4290..000000000 --- a/tests/network/withdrawal_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package network - -import ( - "bytes" - "testing" - - "github.com/ethereum/go-ethereum/common" - - "github.com/rocket-pool/rocketpool-go/network" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" -) - - -func TestSetSystemWithdrawalContractAddress(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set SWC address - swcAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAddress, ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check SWC address - if networkSwcAddress, err := network.GetSystemWithdrawalContractAddress(rp, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(networkSwcAddress.Bytes(), swcAddress.Bytes()) { - t.Errorf("Incorrect system withdrawal contract address %s", networkSwcAddress.Hex()) - } - -} - diff --git a/tests/settings/protocol/network_test.go b/tests/settings/protocol/network_test.go index 755fa8b7a..f62f6aa28 100644 --- a/tests/settings/protocol/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -1,8 +1,10 @@ package protocol import ( + "bytes" "testing" + "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -126,5 +128,15 @@ func TestNetworkSettings(t *testing.T) { t.Error("Incorrect target rETH collateral rate value") } + // Set & get system withdrawal contract address + swcAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAddress, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSystemWithdrawalContractAddress(rp, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(value.Bytes(), swcAddress.Bytes()) { + t.Error("Incorrect system withdrawal contract address") + } + } diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go index 2f2f7435d..c84ae7cf7 100644 --- a/tests/tokens/neth_test.go +++ b/tests/tokens/neth_test.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -127,7 +127,7 @@ func TestBurnNETH(t *testing.T) { if err != nil { t.Fatal(err) } // Set SWC address - if _, err := network.SetSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Withdraw minipool validator balance opts := swcAccount.GetTransactor() From 358bd126159462ec4438da8721d66f432f41f6ac Mon Sep 17 00:00:00 2001 From: kidkal Date: Sat, 6 Mar 2021 21:50:40 +0000 Subject: [PATCH 311/878] upgrade to geth 1.10.0 --- contracts/rocket-storage.go | 125 +++++---- go.mod | 7 +- go.sum | 487 ++++++++++++++++++++++++++++++++++++ rocketpool/contract.go | 4 +- utils/eth/transactions.go | 2 +- 5 files changed, 576 insertions(+), 49 deletions(-) diff --git a/contracts/rocket-storage.go b/contracts/rocket-storage.go index be63ed794..d2a48fdfd 100644 --- a/contracts/rocket-storage.go +++ b/contracts/rocket-storage.go @@ -27,7 +27,7 @@ var ( ) // RocketStorageABI is the input ABI used to generate the binding from. -const RocketStorageABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getInt\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"constant\":true},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_value\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_value\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"int256\",\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"setInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" +const RocketStorageABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getInt\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_value\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_value\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"int256\",\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"setInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" // RocketStorage is an auto generated Go binding around an Ethereum contract. type RocketStorage struct { @@ -137,7 +137,7 @@ func bindRocketStorage(address common.Address, caller bind.ContractCaller, trans // 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 (_RocketStorage *RocketStorageRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { +func (_RocketStorage *RocketStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { return _RocketStorage.Contract.RocketStorageCaller.contract.Call(opts, result, method, params...) } @@ -156,7 +156,7 @@ func (_RocketStorage *RocketStorageRaw) Transact(opts *bind.TransactOpts, method // 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 (_RocketStorage *RocketStorageCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { +func (_RocketStorage *RocketStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { return _RocketStorage.Contract.contract.Call(opts, result, method, params...) } @@ -175,12 +175,17 @@ func (_RocketStorage *RocketStorageTransactorRaw) Transact(opts *bind.TransactOp // // Solidity: function getAddress(bytes32 _key) view returns(address) func (_RocketStorage *RocketStorageCaller) GetAddress(opts *bind.CallOpts, _key [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getAddress", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getAddress", _key) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + } // GetAddress is a free data retrieval call binding the contract method 0x21f8a721. @@ -201,12 +206,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetAddress(_key [32]byte) (com // // Solidity: function getBool(bytes32 _key) view returns(bool) func (_RocketStorage *RocketStorageCaller) GetBool(opts *bind.CallOpts, _key [32]byte) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getBool", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getBool", _key) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + } // GetBool is a free data retrieval call binding the contract method 0x7ae1cfca. @@ -227,12 +237,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetBool(_key [32]byte) (bool, // // Solidity: function getBytes(bytes32 _key) view returns(bytes) func (_RocketStorage *RocketStorageCaller) GetBytes(opts *bind.CallOpts, _key [32]byte) ([]byte, error) { - var ( - ret0 = new([]byte) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getBytes", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getBytes", _key) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + } // GetBytes is a free data retrieval call binding the contract method 0xc031a180. @@ -253,12 +268,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetBytes(_key [32]byte) ([]byt // // Solidity: function getBytes32(bytes32 _key) view returns(bytes32) func (_RocketStorage *RocketStorageCaller) GetBytes32(opts *bind.CallOpts, _key [32]byte) ([32]byte, error) { - var ( - ret0 = new([32]byte) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getBytes32", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getBytes32", _key) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + } // GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e. @@ -279,12 +299,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetBytes32(_key [32]byte) ([32 // // Solidity: function getInt(bytes32 _key) view returns(int256) func (_RocketStorage *RocketStorageCaller) GetInt(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getInt", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getInt", _key) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + } // GetInt is a free data retrieval call binding the contract method 0xdc97d962. @@ -305,12 +330,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetInt(_key [32]byte) (*big.In // // Solidity: function getString(bytes32 _key) view returns(string) func (_RocketStorage *RocketStorageCaller) GetString(opts *bind.CallOpts, _key [32]byte) (string, error) { - var ( - ret0 = new(string) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getString", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getString", _key) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + } // GetString is a free data retrieval call binding the contract method 0x986e791a. @@ -331,12 +361,17 @@ func (_RocketStorage *RocketStorageCallerSession) GetString(_key [32]byte) (stri // // Solidity: function getUint(bytes32 _key) view returns(uint256) func (_RocketStorage *RocketStorageCaller) GetUint(opts *bind.CallOpts, _key [32]byte) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _RocketStorage.contract.Call(opts, out, "getUint", _key) - return *ret0, err + var out []interface{} + err := _RocketStorage.contract.Call(opts, &out, "getUint", _key) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + } // GetUint is a free data retrieval call binding the contract method 0xbd02d0f5. diff --git a/go.mod b/go.mod index 40df4dff2..2ee93e8c9 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,15 @@ module github.com/rocket-pool/rocketpool-go go 1.13 require ( + github.com/btcsuite/btcd v0.21.0-beta // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/ethereum/go-ethereum v1.9.15 + github.com/ethereum/go-ethereum v1.10.0 github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect github.com/minio/highwayhash v1.0.1 // indirect github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a + golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b // indirect ) diff --git a/go.sum b/go.sum index aca742d68..b536a64d1 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,24 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -12,136 +33,385 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/consensys/bavard v0.1.8-0.20210105233146-c16790d2aa8b/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/goff v0.3.10/go.mod h1:xTldOBEHmFiYS0gPXd3NsaEqZWlnmeWcRLWgD3ba3xc= +github.com/consensys/gurvy v0.3.8/go.mod h1:sN75xnsiD593XnhbhvG2PkOy194pZBzqShWF/kwuW/g= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c h1:JHHhtb9XWJrGNMcrVP6vyzO4dusgi/HnceHTgxSejUM= github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.9.15 h1:wrWl+QrtutRUJ9LZXdUqBoGoo2b1tOCYRDrAOQhCY3A= github.com/ethereum/go-ethereum v1.9.15/go.mod h1:slT8bPPRhXsyNTwHQxrOnjuTZ1sDXRajW11EkJ84QJ0= +github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= +github.com/ethereum/go-ethereum v1.10.0 h1:EBZuZYjk1DHboBJb2YkBN8xItELRY6mtZEiYJKuH0+M= +github.com/ethereum/go-ethereum v1.10.0/go.mod h1:E5e/zvdfUVr91JZ0AwjyuJM3x+no51zZJRz61orLLSk= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 h1:9VDpsWq096+oGMDTT/SgBD/VgZYf4pTF+KTPmZ+OaKM= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c h1:zqAKixg3cTcIasAMJV+EcfVbWwLpOZ7LeoWJvcuD/5Q= github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= +github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989 h1:giknQ4mEuDFmmHSrGcbargOuLHQGtywqo4mheITex54= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw= +github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031 h1:HarGZ5h9HD9LgEg1yRVMXyfiw4wlXiLiYM2oMjeA/SE= +github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kilic/bls12-381 v0.0.0-20201226121925-69dacb279461/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 h1:SMro7Z5L2ACvcKREIVJDn8LvoVTY1TY2rTlPJmDlUWc= github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible h1:+gAR1bMhuoQnZMTWFIvp7ukynULPsteLzG+siZKLtD8= github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v2.20.5+incompatible h1:tYH07UPoQt0OCQdgWWMgYHy3/a9bcxNpBIysykNIP7I= +github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE= @@ -149,49 +419,266 @@ github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8 github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= +github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 h1:QmwruyY+bKbDDL0BaglrbZABEali68eoMFhTZpCjYVA= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b h1:ggRgirZABFolTmi3sn6Ivd9SipZwLedQ5wR0aAKnFxU= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200603215123-a4a8cb9d2cbc/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 81adc1d65..e63cdf797 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -34,7 +34,9 @@ type Contract struct { // Call a contract method func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return c.Contract.Call(opts, result, method, params...) + results := make([]interface{}, 1) + results[0] = result + return c.Contract.Call(opts, &results, method, params...) } diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 33dedde72..74b9b9337 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -61,7 +61,7 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, []byte{}) // Sign transaction - signedTx, err := opts.Signer(types.HomesteadSigner{}, opts.From, tx) + signedTx, err := opts.Signer(opts.From, tx) if err != nil { return nil, err } From 25b9e975d80105159cc2e665da5966f06abec7b8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Mon, 22 Mar 2021 15:59:16 +1000 Subject: [PATCH 312/878] added trusted node dao challenge methods --- dao/trustednode/actions.go | 28 ++++++++++++++++++++++++++++ dao/trustednode/dao.go | 14 ++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index db8e0ae64..6cf20dd90 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -57,6 +57,34 @@ func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt } +// Make a challenge against a node +func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) + if err != nil { + return nil, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) + } + return txReceipt, nil +} + + +// Decide a challenge against a node +func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) + if err != nil { + return nil, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) + } + return txReceipt, nil +} + + // Get contracts var rocketDAONodeTrustedActionsLock sync.Mutex func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 56737f857..b40ff735a 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -344,6 +344,20 @@ func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common } +// Get whether a member has an active challenge against them +func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return false, err + } + isChallenged := new(bool) + if err := rocketDAONodeTrusted.Call(opts, isChallenged, "getMemberIsChallenged", memberAddress); err != nil { + return false, fmt.Errorf("Could not get trusted node DAO member %s is challenged status: %w", memberAddress.Hex(), err) + } + return *isChallenged, nil +} + + // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) From c770daed08c2818cbb27bb2aa108c1af045ea28b Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Tue, 23 Mar 2021 10:14:54 +1000 Subject: [PATCH 313/878] added sanitising for string data queried from contracts --- dao/proposal-payload.go | 3 ++- dao/proposals.go | 5 +++-- dao/trustednode/dao.go | 5 +++-- node/node.go | 3 ++- utils/strings/sanitize.go | 18 ++++++++++++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 utils/strings/sanitize.go diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go index 255ea7d26..4869286db 100644 --- a/dao/proposal-payload.go +++ b/dao/proposal-payload.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + strutils "github.com/rocket-pool/rocketpool-go/utils/strings" ) @@ -57,7 +58,7 @@ func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload } // Build & return payload string - return fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ",")), nil + return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil } diff --git a/dao/proposals.go b/dao/proposals.go index 133e8f407..92ea29fc3 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) @@ -440,7 +441,7 @@ func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Cal if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { return "", fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) } - return *daoName, nil + return strings.Sanitize(*daoName), nil } func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) @@ -462,7 +463,7 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind if err := rocketDAOProposal.Call(opts, message, "getMessage", big.NewInt(int64(proposalId))); err != nil { return "", fmt.Errorf("Could not get proposal %d message: %w", proposalId, err) } - return *message, nil + return strings.Sanitize(*message), nil } func GetProposalCreatedBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index b40ff735a..849e2a9a8 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -11,6 +11,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) @@ -248,7 +249,7 @@ func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts * if err := rocketDAONodeTrusted.Call(opts, id, "getMemberID", memberAddress); err != nil { return "", fmt.Errorf("Could not get trusted node DAO member %s ID: %w", memberAddress.Hex(), err) } - return *id, nil + return strings.Sanitize(*id), nil } func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -259,7 +260,7 @@ func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opt if err := rocketDAONodeTrusted.Call(opts, email, "getMemberEmail", memberAddress); err != nil { return "", fmt.Errorf("Could not get trusted node DAO member %s email: %w", memberAddress.Hex(), err) } - return *email, nil + return strings.Sanitize(*email), nil } func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) diff --git a/node/node.go b/node/node.go index 08d9e71da..0efed18d1 100644 --- a/node/node.go +++ b/node/node.go @@ -11,6 +11,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) @@ -219,7 +220,7 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre if err := rocketNodeManager.Call(opts, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) } - return *timezoneLocation, nil + return strings.Sanitize(*timezoneLocation), nil } diff --git a/utils/strings/sanitize.go b/utils/strings/sanitize.go new file mode 100644 index 000000000..0e3299ad1 --- /dev/null +++ b/utils/strings/sanitize.go @@ -0,0 +1,18 @@ +package strings + +import ( + "strings" + "unicode" +) + + +// Remove non-printable characters from a string +func Sanitize(str string) string { + return strings.Map(func(r rune) rune { + if unicode.IsPrint(r) { + return r + } + return -1 + }, str) +} + From fe17fb32a5f4f6e97e409856cc26f1956a6c6cc8 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Wed, 31 Mar 2021 14:10:00 +1000 Subject: [PATCH 314/878] added oracle DAO member challenge setting getters & setters --- settings/trustednode/members.go | 63 ++++++++++++++++++++++ tests/settings/trustednode/members_test.go | 36 +++++++++++++ 2 files changed, 99 insertions(+) diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 11652a9ef..90f05f563 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -20,6 +20,9 @@ const ( QuorumSettingPath = "members.quorum" RPLBondSettingPath = "members.rplbond" MinipoolUnbondedMaxSettingPath = "members.minipool.unbonded.max" + ChallengeCooldownSettingPath = "members.challenge.cooldown" + ChallengeWindowSettingPath = "members.challenge.window" + ChallengeCostSettingPath = "members.challenge.cost" ) @@ -83,6 +86,66 @@ func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *b } +// The period a member must wait for before submitting another challenge, in blocks +func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeCooldown"); err != nil { + return 0, fmt.Errorf("Could not get member challenge cooldown period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) +} + + +// The period during which a member can respond to a challenge, in blocks +func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeWindow"); err != nil { + return 0, fmt.Errorf("Could not get member challenge window period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) +} + + +// The fee for a non-member to challenge a member, in wei +func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeCost"); err != nil { + return nil, fmt.Errorf("Could not get member challenge cost: %w", err) + } + return *value, nil +} +func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCostSettingPath, value, opts) +} +func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) +} + + // Get contracts var membersSettingsContractLock sync.Mutex func getMembersSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 5f1810e4c..77c5dd147 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -100,5 +100,41 @@ func TestProposeMembersSettings(t *testing.T) { t.Error("Incorrect maximum unbonded minipools value") } + // Set & get member challenge cooldown period + var memberChallengeCooldown uint64 = 1 + if proposalId, _, err := trustednode.ProposeChallengeCooldown(rp, memberChallengeCooldown, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeCooldown(rp, nil); err != nil { + t.Error(err) + } else if value != memberChallengeCooldown { + t.Error("Incorrect member challenge cooldown value") + } + + // Set & get member challenge window period + var memberChallengeWindow uint64 = 1 + if proposalId, _, err := trustednode.ProposeChallengeWindow(rp, memberChallengeWindow, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeWindow(rp, nil); err != nil { + t.Error(err) + } else if value != memberChallengeWindow { + t.Error("Incorrect member challenge window value") + } + + // Set & get member challenge cost amount + challengeCost := eth.EthToWei(1) + if proposalId, _, err := trustednode.ProposeChallengeCost(rp, challengeCost, trustedNodeAccount.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeCost(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(challengeCost) != 0 { + t.Error("Incorrect member challenge cost value") + } + } From ee53f6c6d289047134559b62798b91963b95c1cf Mon Sep 17 00:00:00 2001 From: kidkal Date: Mon, 8 Mar 2021 22:29:49 +0000 Subject: [PATCH 315/878] add ability query gas price and limit for a contract's function --- rocketpool/contract.go | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index e63cdf797..afdef4520 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "math/big" "reflect" "github.com/ethereum/go-ethereum" @@ -13,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "golang.org/x/sync/errgroup" ) @@ -32,6 +34,15 @@ type Contract struct { } +// Response for gas prices and limits from network and from user request +type GasInfo struct { + EstGasPrice *big.Int `json:"estGasPrice"` + EstGasLimit uint64 `json:"estGasLimit"` + ReqGasPrice *big.Int `json:"reqGasPrice"` + ReqGasLimit uint64 `json:"reqGasLimit"` +} + + // Call a contract method func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { results := make([]interface{}, 1) @@ -92,6 +103,45 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { } +// Get Gas Price and Gas Limit for transaction +func (c *Contract) GetGasInfo(methodName string, opts *bind.TransactOpts, params ...interface{}) (GasInfo, error) { + + // Find user option for gas price and gas limit + response := GasInfo { + ReqGasPrice: opts.GasPrice, + ReqGasLimit: opts.GasLimit, + } + + input, err := c.ABI.Pack(methodName, params...) + if err != nil { + return response, fmt.Errorf("Could not encode input data: %w", err) + } + + // Sync + var wg errgroup.Group + + wg.Go(func() error { + estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) + if err == nil { + response.EstGasPrice = estGasPrice + } + return err + }) + + wg.Go(func() error { + estGasLimit, err := c.estimateGasLimit(opts, input) + if err == nil { + response.EstGasLimit = estGasLimit + } + return err + }) + + // Wait for data + err = wg.Wait() + return response, err +} + + // Estimate the gas limit for a contract transaction func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, error) { From 5a67f9091d6c56c8d1b5f675d4e9513cb872250c Mon Sep 17 00:00:00 2001 From: kidkal Date: Tue, 13 Apr 2021 00:31:04 +0100 Subject: [PATCH 316/878] incorporate @jcrtp's function for estimating gas on a transfer call --- rocketpool/contract.go | 100 ++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index afdef4520..9ea8e3092 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -14,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "golang.org/x/sync/errgroup" ) @@ -51,6 +50,39 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, } +// Get Gas Price and Gas Limit for transaction +func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, params ...interface{}) (GasInfo, error) { + + // set user option for gas price and gas limit + response := GasInfo { + ReqGasPrice: opts.GasPrice, + ReqGasLimit: opts.GasLimit, + } + + // Pack transaction Info + input, err := c.ABI.Pack(method, params...) + if err != nil { + return response, fmt.Errorf("Error getting transaction gas info: Could not encode input data: %w", err) + } + + // Estimate gas limit + estGasLimit, err := c.estimateGasLimit(opts, input) + if err != nil { + return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) + } + response.EstGasLimit = estGasLimit + + // Estimate gas price + estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) + if err != nil { + return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas price: %w", err) + } + response.EstGasPrice = estGasPrice + + return response, err +} + + // Transact on a contract method and wait for a receipt func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { @@ -79,6 +111,33 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in } +// Get gas price and gas limit for a transfer call +func (c *Contract) GetTransferGasInfo(opts *bind.TransactOpts) (GasInfo, error) { + + // set user option for gas price and gas limit + response := GasInfo { + ReqGasPrice: opts.GasPrice, + ReqGasLimit: opts.GasLimit, + } + + // Estimate gas limit + estGasLimit, err := c.estimateGasLimit(opts, []byte{}) + if err != nil { + return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas limit: %w", err) + } + response.EstGasLimit = estGasLimit + + // Estimate gas price + estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) + if err != nil { + return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas price: %w", err) + } + response.EstGasPrice = estGasPrice + + return response, nil +} + + // Transfer ETH to a contract and wait for a receipt func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { @@ -103,45 +162,6 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { } -// Get Gas Price and Gas Limit for transaction -func (c *Contract) GetGasInfo(methodName string, opts *bind.TransactOpts, params ...interface{}) (GasInfo, error) { - - // Find user option for gas price and gas limit - response := GasInfo { - ReqGasPrice: opts.GasPrice, - ReqGasLimit: opts.GasLimit, - } - - input, err := c.ABI.Pack(methodName, params...) - if err != nil { - return response, fmt.Errorf("Could not encode input data: %w", err) - } - - // Sync - var wg errgroup.Group - - wg.Go(func() error { - estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) - if err == nil { - response.EstGasPrice = estGasPrice - } - return err - }) - - wg.Go(func() error { - estGasLimit, err := c.estimateGasLimit(opts, input) - if err == nil { - response.EstGasLimit = estGasLimit - } - return err - }) - - // Wait for data - err = wg.Wait() - return response, err -} - - // Estimate the gas limit for a contract transaction func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, error) { From 26cbfba6078f091904626292dadbbfc9a29f49d8 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 13 Apr 2021 02:49:00 -0400 Subject: [PATCH 317/878] TX commands now return the hash of the TX instead of blocking until the TX is mined - will add waiters for everything next --- auction/auction.go | 58 ++++++++------- dao/protocol/dao.go | 56 +++++++-------- dao/trustednode/actions.go | 62 ++++++++-------- dao/trustednode/dao.go | 60 ++++++++-------- dao/trustednode/proposals.go | 102 +++++++++++++-------------- deposit/deposit.go | 33 +++++---- minipool/minipool-contract.go | 66 +++++++++-------- minipool/status.go | 26 ++++--- network/balances.go | 25 ++++--- network/prices.go | 23 +++--- node/deposit.go | 23 +++--- node/node.go | 59 +++++++++------- node/staking.go | 34 +++++---- rewards/node.go | 16 ++--- rewards/rewards.go | 22 +++--- rewards/trusted-node.go | 16 ++--- rocketpool/contract.go | 54 ++++++++------ settings/protocol/auction.go | 31 ++++---- settings/protocol/deposit.go | 25 ++++--- settings/protocol/inflation.go | 23 +++--- settings/protocol/minipool.go | 21 +++--- settings/protocol/network.go | 42 ++++++----- settings/protocol/node.go | 25 ++++--- settings/protocol/rewards.go | 19 +++-- settings/trustednode/members.go | 41 ++++++----- settings/trustednode/proposals.go | 35 +++++---- tests/testutils/minipool/minipool.go | 29 ++++---- tokens/neth.go | 37 +++++----- tokens/reth.go | 39 +++++----- tokens/rpl-fixed.go | 25 +++---- tokens/rpl.go | 47 ++++++------ tokens/tokens.go | 40 +++++------ 32 files changed, 593 insertions(+), 621 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 816787356..19d5d48ff 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -1,19 +1,17 @@ package auction import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Settings const LotDetailsBatchSize = 10 @@ -512,62 +510,62 @@ func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder c // Create a new lot -func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } lotCount, err := GetLotCount(rp, nil) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } - txReceipt, err := rocketAuctionManager.Transact(opts, "createLot") + hash, err := rocketAuctionManager.Transact(opts, "createLot") if err != nil { - return 0, nil, fmt.Errorf("Could not create lot: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not create lot: %w", err) } - return lotCount, txReceipt, nil + return lotCount, hash, nil } // Place a bid on a lot -func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) + hash, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) if err != nil { - return nil, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) } - return txReceipt, nil + return hash, nil } // Claim RPL from a lot that was bid on -func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) + hash, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) if err != nil { - return nil, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) } - return txReceipt, nil + return hash, nil } // Recover unclaimed RPL from a lot -func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) + hash, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) if err != nil { - return nil, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) } - return txReceipt, nil + return hash, nil } diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 15e36ae65..3a03153bc 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -1,72 +1,70 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Bootstrap a bool setting -func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return txReceipt, nil + return hash, nil } // Bootstrap a uint256 setting -func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return txReceipt, nil + return hash, nil } // Bootstrap an address setting -func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return txReceipt, nil + return hash, nil } // Bootstrap a rewards claimer -func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) if err != nil { - return nil, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) } - return txReceipt, nil + return hash, nil } diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index 6cf20dd90..34a303e97 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -1,87 +1,85 @@ package trustednode import ( - "fmt" - "sync" + "fmt" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Join the trusted node DAO // Requires an executed invite proposal -func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") if err != nil { - return nil, fmt.Errorf("Could not join the trusted node DAO: %w", err) + return common.Hash{}, fmt.Errorf("Could not join the trusted node DAO: %w", err) } - return txReceipt, nil + return hash, nil } // Leave the trusted node DAO // Requires an executed leave proposal -func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) if err != nil { - return nil, fmt.Errorf("Could not leave the trusted node DAO: %w", err) + return common.Hash{}, fmt.Errorf("Could not leave the trusted node DAO: %w", err) } - return txReceipt, nil + return hash, nil } // Replace node's position in the trusted node DAO with another node // Requires an executed replace proposal -func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionReplace") + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionReplace") if err != nil { - return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w", err) + return common.Hash{}, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w", err) } - return txReceipt, nil + return hash, nil } // Make a challenge against a node -func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) if err != nil { - return nil, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) } - return txReceipt, nil + return hash, nil } // Decide a challenge against a node -func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) if err != nil { - return nil, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) } - return txReceipt, nil + return hash, nil } diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 849e2a9a8..93e16fc2d 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -1,20 +1,18 @@ package trustednode import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) - // Settings const ( MemberAddressBatchSize = 50 @@ -360,62 +358,62 @@ func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Addre // Bootstrap a bool setting -func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) } - return txReceipt, nil + return hash, nil } // Bootstrap a uint256 setting -func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) if err != nil { - return nil, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) } - return txReceipt, nil + return hash, nil } // Bootstrap a DAO member -func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, email, nodeAddress) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, email, nodeAddress) if err != nil { - return nil, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) } - return txReceipt, nil + return hash, nil } // Bootstrap a contract upgrade -func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) if err != nil { - return nil, err + return common.Hash{}, err } rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { - return nil, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) + return common.Hash{}, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) } - return txReceipt, nil + return hash, nil } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 1e70a9002..d5750e460 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -1,116 +1,114 @@ package trustednode import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/dao" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Submit a proposal to invite a new member to the trusted node DAO -func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) if err != nil { - return 0, nil, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal for a member to leave the trusted node DAO -func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) if err != nil { - return 0, nil, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to replace a member in the trusted node DAO -func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) if err != nil { - return 0, nil, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to kick a member from the trusted node DAO -func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) if err != nil { - return 0, nil, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to update a bool trusted node DAO setting -func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) if err != nil { - return 0, nil, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to update a uint trusted node DAO setting -func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) if err != nil { - return 0, nil, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } // Submit a proposal to upgrade a contract -func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { - return 0, nil, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -118,62 +116,62 @@ func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, con // Submit a trusted node DAO proposal // Returns the ID of the new proposal -func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } proposalCount, err := dao.GetProposalCount(rp, nil) if err != nil { - return 0, nil, err + return 0, common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) if err != nil { - return 0, nil, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) + return 0, common.Hash{}, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) } - return proposalCount + 1, txReceipt, nil + return proposalCount + 1, hash, nil } // Cancel a submitted proposal -func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) if err != nil { - return nil, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) } - return txReceipt, nil + return hash, nil } // Vote on a submitted proposal -func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) if err != nil { - return nil, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) } - return txReceipt, nil + return hash, nil } // Execute a submitted proposal -func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) if err != nil { - return nil, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) } - return txReceipt, nil + return hash, nil } diff --git a/deposit/deposit.go b/deposit/deposit.go index b84456a7a..c76ac4b87 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -1,17 +1,16 @@ package deposit import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Get the deposit pool balance func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketDepositPool, err := getRocketDepositPool(rp) @@ -41,30 +40,30 @@ func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, // Make a deposit -func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDepositPool.Transact(opts, "deposit") + hash, err := rocketDepositPool.Transact(opts, "deposit") if err != nil { - return nil, fmt.Errorf("Could not deposit: %w", err) + return common.Hash{}, fmt.Errorf("Could not deposit: %w", err) } - return txReceipt, nil + return hash, nil } // Assign deposits -func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketDepositPool.Transact(opts, "assignDeposits") + hash, err := rocketDepositPool.Transact(opts, "assignDeposits") if err != nil { - return nil, fmt.Errorf("Could not assign deposits: %w", err) + return common.Hash{}, fmt.Errorf("Could not assign deposits: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 2862b3f84..9b4288ef7 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,22 +1,20 @@ package minipool import ( - "fmt" - "math/big" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Minipool detail types type StatusDetails struct { Status rptypes.MinipoolStatus `json:"status"` @@ -380,52 +378,52 @@ func (mp *Minipool) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, // Refund node ETH from the minipool -func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "refund") +func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "refund") if err != nil { - return nil, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) } - return txReceipt, nil + return hash, nil } // Progress the prelaunch minipool to staking -func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) +func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { - return nil, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) } - return txReceipt, nil + return hash, nil } // Withdraw node balances & rewards from the withdrawable minipool and close it -func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "withdraw") +func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "withdraw") if err != nil { - return nil, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) } - return txReceipt, nil + return hash, nil } // Dissolve the initialized or prelaunch minipool -func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "dissolve") +func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "dissolve") if err != nil { - return nil, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) } - return txReceipt, nil + return hash, nil } // Withdraw node balances from the dissolved minipool and close it -func (mp *Minipool) Close(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "close") +func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "close") if err != nil { - return nil, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) } - return txReceipt, nil + return hash, nil } diff --git a/minipool/status.go b/minipool/status.go index 80722137b..3e8086c6b 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -1,19 +1,17 @@ package minipool import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) @@ -29,16 +27,16 @@ func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, use // Submit a minipool withdrawable event -func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) + hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) if err != nil { - return nil, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) + return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/network/balances.go b/network/balances.go index f3b0d3a85..e4d8ffba6 100644 --- a/network/balances.go +++ b/network/balances.go @@ -1,18 +1,17 @@ package network import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Get the block number which network balances are current for func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) @@ -84,16 +83,16 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa // Submit network balances for an epoch -func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + hash, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) if err != nil { - return nil, fmt.Errorf("Could not submit network balances: %w", err) + return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/network/prices.go b/network/prices.go index 5465f7024..3509eaee7 100644 --- a/network/prices.go +++ b/network/prices.go @@ -1,17 +1,16 @@ package network import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Get the block number which network prices are current for func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) @@ -41,16 +40,16 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro // Submit network prices for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) if err != nil { - return nil, fmt.Errorf("Could not submit network prices: %w", err) + return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/node/deposit.go b/node/deposit.go index 3bb385e20..f43ad302c 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -1,28 +1,27 @@ package node import ( - "fmt" - "sync" + "fmt" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Make a node deposit -func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee)) + hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee)) if err != nil { - return nil, fmt.Errorf("Could not make node deposit: %w", err) + return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/node/node.go b/node/node.go index 0efed18d1..b216c6e3a 100644 --- a/node/node.go +++ b/node/node.go @@ -1,20 +1,19 @@ package node import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) - // Settings const ( NodeAddressBatchSize = 50 @@ -225,44 +224,54 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre // Register a node -func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { +func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) + hash, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) if err != nil { - return nil, fmt.Errorf("Could not register node: %w", err) + return common.Hash{}, fmt.Errorf("Could not register node: %w", err) } - return txReceipt, nil + return hash, nil } // Set a node's withdrawal address -func SetWithdrawalAddress(rp *rocketpool.RocketPool, withdrawalAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func SetWithdrawalAddress(rp *rocketpool.RocketPool, withdrawalAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", withdrawalAddress) + hash, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", withdrawalAddress) if err != nil { - return nil, fmt.Errorf("Could not set node withdrawal address: %w", err) + return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) } - return txReceipt, nil + return hash, nil } // Set a node's timezone location -func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { +func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) + hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { - return nil, fmt.Errorf("Could not set node timezone location: %w", err) + return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) + } + return hash, nil +} + + +// Wait for a transaction to get mined +func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err } - return txReceipt, nil + return rocketNodeManager.WaitForTransaction(hash) } diff --git a/node/staking.go b/node/staking.go index e6e69d01a..334ef0066 100644 --- a/node/staking.go +++ b/node/staking.go @@ -1,18 +1,16 @@ package node import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Get the total RPL staked in the network func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) @@ -112,30 +110,30 @@ func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, // Stake RPL -func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) + hash, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) if err != nil { - return nil, fmt.Errorf("Could not stake RPL: %w", err) + return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) } - return txReceipt, nil + return hash, nil } // Withdraw staked RPL -func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + hash, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) if err != nil { - return nil, fmt.Errorf("Could not withdraw staked RPL: %w", err) + return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/rewards/node.go b/rewards/node.go index a8f1ef96c..cf9a6c75b 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -1,17 +1,15 @@ package rewards import ( - "math/big" - "sync" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Get whether node reward claims are enabled func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketClaimNode, err := getRocketClaimNode(rp) @@ -53,10 +51,10 @@ func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common. // Claim node rewards -func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketClaimNode, err := getRocketClaimNode(rp) if err != nil { - return nil, err + return common.Hash{}, err } return claim(rocketClaimNode, "node", opts) } diff --git a/rewards/rewards.go b/rewards/rewards.go index 33bd94956..4ebc2584d 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -1,18 +1,16 @@ package rewards import ( - "fmt" - "math/big" + "fmt" + "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Get whether a claims contract is enabled func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { enabled := new(bool) @@ -56,11 +54,11 @@ func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName strin // Claim rewards -func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := claimsContract.Transact(opts, "claim") +func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := claimsContract.Transact(opts, "claim") if err != nil { - return nil, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) + return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) } - return txReceipt, nil + return hash, nil } diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 1a4027baa..03b547c16 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -1,17 +1,15 @@ package rewards import ( - "math/big" - "sync" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Get whether trusted node reward claims are enabled func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) @@ -53,10 +51,10 @@ func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress // Claim trusted node rewards -func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) if err != nil { - return nil, err + return common.Hash{}, err } return claim(rocketClaimTrustedNode, "trusted node", opts) } diff --git a/rocketpool/contract.go b/rocketpool/contract.go index e63cdf797..7c5fe12d8 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -1,21 +1,20 @@ package rocketpool import ( - "bytes" - "context" - "errors" - "fmt" - "reflect" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" + "bytes" + "context" + "errors" + "fmt" + "reflect" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) - // Transaction settings const ( GasLimitPadding = 100000 @@ -41,17 +40,17 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, // Transact on a contract method and wait for a receipt -func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Receipt, error) { +func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (common.Hash, error) { // Estimate gas limit if opts.GasLimit == 0 { input, err := c.ABI.Pack(method, params...) if err != nil { - return nil, fmt.Errorf("Could not encode input data: %w", err) + return common.Hash{}, fmt.Errorf("Could not encode input data: %w", err) } gasLimit, err := c.estimateGasLimit(opts, input) if err != nil { - return nil, err + return common.Hash{}, err } opts.GasLimit = gasLimit } @@ -59,29 +58,42 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { - return nil, err + return common.Hash{}, err } - // Get & return transaction receipt - return c.getTransactionReceipt(tx) + return tx.Hash(), nil } // Transfer ETH to a contract and wait for a receipt -func (c *Contract) Transfer(opts *bind.TransactOpts) (*types.Receipt, error) { +func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { // Estimate gas limit if opts.GasLimit == 0 { gasLimit, err := c.estimateGasLimit(opts, []byte{}) if err != nil { - return nil, err + return common.Hash{}, err } opts.GasLimit = gasLimit } // Send transaction tx, err := c.Contract.Transfer(opts) + if err != nil { + return common.Hash{}, err + } + + return tx.Hash(), nil + +} + + +// Block until a transaction is mined, then return the receipt +func (c *Contract) WaitForTransaction(hash common.Hash) (*types.Receipt, error) { + + // Get the transaction from its hash + tx, _, err := c.Client.TransactionByHash(context.Background(), hash) if err != nil { return nil, err } diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index cfba1bc63..3f147b2e5 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -1,19 +1,18 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const AuctionSettingsContractName = "rocketDAOProtocolSettingsAuction" @@ -30,7 +29,7 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, } return *value, nil } -func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) } @@ -47,7 +46,7 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e } return *value, nil } -func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) } @@ -64,7 +63,7 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) } @@ -81,7 +80,7 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) } @@ -98,7 +97,7 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } return (*value).Uint64(), nil } -func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) } @@ -115,7 +114,7 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } -func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) } @@ -132,7 +131,7 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl } return eth.WeiToEth(*value), nil } -func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) } diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 582c3683b..7c4dbcc0a 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -1,18 +1,17 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Config const DepositSettingsContractName = "rocketDAOProtocolSettingsDeposit" @@ -29,7 +28,7 @@ func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, er } return *value, nil } -func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) } @@ -46,7 +45,7 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } -func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) } @@ -63,7 +62,7 @@ func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int } return *value, nil } -func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) } @@ -80,7 +79,7 @@ func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return *value, nil } -func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) } @@ -97,7 +96,7 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } return (*value).Uint64(), nil } -func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 33837330b..8cef9b635 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -1,19 +1,18 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const InflationSettingsContractName = "rocketDAOProtocolSettingsInflation" @@ -30,7 +29,7 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } -func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) } @@ -47,7 +46,7 @@ func GetInflationIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) } @@ -64,7 +63,7 @@ func GetInflationStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } return (*value).Uint64(), nil } -func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index b0394d854..075d17269 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -1,18 +1,17 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Config const MinipoolSettingsContractName = "rocketDAOProtocolSettingsMinipool" @@ -115,7 +114,7 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. } return *value, nil } -func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) } @@ -132,7 +131,7 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) } @@ -149,7 +148,7 @@ func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 76eb36069..eba335b43 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -1,20 +1,18 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const NetworkSettingsContractName = "rocketDAOProtocolSettingsNetwork" @@ -31,7 +29,7 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } -func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) } @@ -48,7 +46,7 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } -func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) } @@ -65,7 +63,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) } @@ -82,7 +80,7 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } return *value, nil } -func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) } @@ -99,7 +97,7 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) } @@ -116,7 +114,7 @@ func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts } return *value, nil } -func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) } @@ -133,7 +131,7 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) } @@ -150,7 +148,7 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) } @@ -167,7 +165,7 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) } @@ -184,7 +182,7 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) } @@ -201,7 +199,7 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) } @@ -218,7 +216,7 @@ func GetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, opts *bind.Ca } return *value, nil } -func BootstrapSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, value common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapAddress(rp, NetworkSettingsContractName, "network.withdrawal.contract.address", value, opts) } diff --git a/settings/protocol/node.go b/settings/protocol/node.go index f2ff9062b..75bff7fd6 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -1,19 +1,18 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const NodeSettingsContractName = "rocketDAOProtocolSettingsNode" @@ -30,7 +29,7 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return *value, nil } -func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) } @@ -47,7 +46,7 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool } return *value, nil } -func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } @@ -64,7 +63,7 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } @@ -81,7 +80,7 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index f818f5b2c..508ec7c39 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -1,19 +1,18 @@ package protocol import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const RewardsSettingsContractName = "rocketDAOProtocolSettingsRewards" @@ -72,7 +71,7 @@ func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpt } return (*value).Uint64(), nil } -func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 90f05f563..cfa6c8a11 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -1,19 +1,18 @@ package trustednode import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Config const ( MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" @@ -38,10 +37,10 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) } return eth.WeiToEth(*value), nil } -func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } -func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } @@ -58,10 +57,10 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error } return *value, nil } -func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) } -func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } @@ -78,10 +77,10 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } return (*value).Uint64(), nil } -func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } -func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } @@ -98,10 +97,10 @@ func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint6 } return (*value).Uint64(), nil } -func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } -func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -118,10 +117,10 @@ func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, } return (*value).Uint64(), nil } -func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } -func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } @@ -138,10 +137,10 @@ func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } return *value, nil } -func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } -func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index df3f25b67..0b87e5691 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -1,18 +1,17 @@ package trustednode import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Config const ( ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" @@ -36,10 +35,10 @@ func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } return (*value).Uint64(), nil } -func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -56,10 +55,10 @@ func GetProposalVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } return (*value).Uint64(), nil } -func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -76,10 +75,10 @@ func GetProposalVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -96,10 +95,10 @@ func GetProposalExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } @@ -116,10 +115,10 @@ func GetProposalActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } return (*value).Uint64(), nil } -func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { +func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, *types.Receipt, error) { +func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 900390ed8..e802d059c 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -1,24 +1,23 @@ package minipool import ( - "errors" - "math/big" + "errors" + "math/big" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) - // Minipool created event type minipoolCreated struct { Minipool common.Address @@ -38,7 +37,9 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun // Make node deposit opts := nodeAccount.GetTransactor() opts.Value = depositAmount - txReceipt, err := node.Deposit(rp, 0, opts) + hash, err := node.Deposit(rp, 0, opts) + if err != nil { return nil, err } + txReceipt, err := node.WaitForTransaction(rp, hash) if err != nil { return nil, err } // Get minipool manager contract diff --git a/tokens/neth.go b/tokens/neth.go index 1a8cf0759..e7d320ca6 100644 --- a/tokens/neth.go +++ b/tokens/neth.go @@ -1,23 +1,20 @@ package tokens import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // // Core ERC-20 functions // - // Get nETH total supply func GetNETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) @@ -49,30 +46,30 @@ func GetNETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, // Transfer nETH -func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transfer(rocketTokenNETH, "nETH", to, amount, opts) } // Approve a nETH spender -func ApproveNETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ApproveNETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return approve(rocketTokenNETH, "nETH", spender, amount, opts) } // Transfer nETH from a sender -func TransferFromNETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferFromNETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transferFrom(rocketTokenNETH, "nETH", from, to, amount, opts) } @@ -94,16 +91,16 @@ func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Burn nETH for ETH -func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenNETH, err := getRocketTokenNETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketTokenNETH.Transact(opts, "burn", amount) + hash, err := rocketTokenNETH.Transact(opts, "burn", amount) if err != nil { - return nil, fmt.Errorf("Could not burn nETH: %w", err) + return common.Hash{}, fmt.Errorf("Could not burn nETH: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/tokens/reth.go b/tokens/reth.go index ee431cd30..a232ea6b0 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -1,24 +1,21 @@ package tokens import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // // Core ERC-20 functions // - // Get rETH total supply func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -50,30 +47,30 @@ func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, // Transfer rETH -func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transfer(rocketTokenRETH, "rETH", to, amount, opts) } // Approve a rETH spender -func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return approve(rocketTokenRETH, "rETH", spender, amount, opts) } // Transfer rETH from a sender -func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) } @@ -165,16 +162,16 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa // Burn rETH for ETH -func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketTokenRETH.Transact(opts, "burn", amount) + hash, err := rocketTokenRETH.Transact(opts, "burn", amount) if err != nil { - return nil, fmt.Errorf("Could not burn rETH: %w", err) + return common.Hash{}, fmt.Errorf("Could not burn rETH: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go index 48c95dd20..6e777dddd 100644 --- a/tokens/rpl-fixed.go +++ b/tokens/rpl-fixed.go @@ -1,22 +1,19 @@ package tokens import ( - "math/big" - "sync" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // // Core ERC-20 functions // - // Get fixed-supply RPL total supply func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) @@ -48,30 +45,30 @@ func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common // Transfer fixed-supply RPL -func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transfer(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) } // Approve an fixed-supply RPL spender -func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) if err != nil { - return nil, err + return common.Hash{}, err } return approve(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) } // Transfer fixed-supply RPL from a sender -func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transferFrom(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) } diff --git a/tokens/rpl.go b/tokens/rpl.go index fcbf13d96..f3520e607 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -1,23 +1,20 @@ package tokens import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // // Core ERC-20 functions // - // Get RPL total supply func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -49,30 +46,30 @@ func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, o // Transfer RPL -func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transfer(rocketTokenRPL, "RPL", to, amount, opts) } // Approve an RPL spender -func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { - return nil, err + return common.Hash{}, err } return approve(rocketTokenRPL, "RPL", spender, amount, opts) } // Transfer RPL from a sender -func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { - return nil, err + return common.Hash{}, err } return transferFrom(rocketTokenRPL, "RPL", from, to, amount, opts) } @@ -84,30 +81,30 @@ func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount // Mint new RPL tokens from inflation -func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { +func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") + hash, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") if err != nil { - return nil, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) + return common.Hash{}, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) } - return txReceipt, nil + return hash, nil } // Swap fixed-supply RPL for new RPL tokens -func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { +func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { - return nil, err + return common.Hash{}, err } - txReceipt, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) + hash, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) if err != nil { - return nil, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) + return common.Hash{}, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) } - return txReceipt, nil + return hash, nil } diff --git a/tokens/tokens.go b/tokens/tokens.go index b84c74838..f64c40d5a 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -1,19 +1,17 @@ package tokens import ( - "context" - "fmt" - "math/big" + "context" + "fmt" + "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) - // Token balances type Balances struct { ETH *big.Int `json:"eth"` @@ -122,31 +120,31 @@ func allowance(tokenContract *rocketpool.Contract, tokenName string, owner, spen // Transfer tokens to an address -func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := tokenContract.Transact(opts, "transfer", to, amount) +func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := tokenContract.Transact(opts, "transfer", to, amount) if err != nil { - return nil, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) } - return txReceipt, nil + return hash, nil } // Approve a token allowance for a spender -func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := tokenContract.Transact(opts, "approve", spender, amount) +func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := tokenContract.Transact(opts, "approve", spender, amount) if err != nil { - return nil, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) } - return txReceipt, nil + return hash, nil } // Transfer tokens from a sender to an address -func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) +func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) if err != nil { - return nil, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) } - return txReceipt, nil + return hash, nil } From 509181241bf7519994910709c10c149881025f96 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 16 Apr 2021 11:49:08 +1000 Subject: [PATCH 318/878] added validator pubkey & signature type decoding hex string length validation --- types/beacon.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/types/beacon.go b/types/beacon.go index ebec99712..ec4d55544 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -1,6 +1,8 @@ package types import ( + "fmt" + "encoding/hex" "encoding/json" ) @@ -31,6 +33,9 @@ func (v ValidatorPubkey) String() string { } func HexToValidatorPubkey(value string) (ValidatorPubkey, error) { pubkey := make([]byte, ValidatorPubkeyLength) + if len(value) != hex.EncodedLen(ValidatorPubkeyLength) { + return ValidatorPubkey{}, fmt.Errorf("Invalid validator public key hex string %s: invalid length %d", value, len(value)) + } if _, err := hex.Decode(pubkey, []byte(value)); err != nil { return ValidatorPubkey{}, err } @@ -76,6 +81,9 @@ func (v ValidatorSignature) String() string { } func HexToValidatorSignature(value string) (ValidatorSignature, error) { signature := make([]byte, ValidatorSignatureLength) + if len(value) != hex.EncodedLen(ValidatorSignatureLength) { + return ValidatorSignature{}, fmt.Errorf("Invalid validator signature hex string %s: invalid length %d", value, len(value)) + } if _, err := hex.Decode(signature, []byte(value)); err != nil { return ValidatorSignature{}, err } From 6b67d69363afbb74175ad7512e756921e15dd137 Mon Sep 17 00:00:00 2001 From: Jake Pospischil Date: Fri, 16 Apr 2021 11:53:36 +1000 Subject: [PATCH 319/878] added handler for unhandled error --- rocketpool/abi.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rocketpool/abi.go b/rocketpool/abi.go index 62667c5ee..fd25405f1 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -49,7 +49,9 @@ func EncodeAbiStr(abiStr string) (string, error) { if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) } - zlibWriter.Flush() + if err := zlibWriter.Flush(); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } // base64 encode & return return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()), nil From d26325a5ea9df50703af048aa5518bd380b9a7cb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Apr 2021 22:53:14 -0400 Subject: [PATCH 320/878] Added waiters to all of the contracts --- auction/auction.go | 11 +++++++ dao/trustednode/proposals.go | 11 +++++++ deposit/deposit.go | 11 +++++++ minipool/minipool.go | 28 ++++++++++++------ rocketpool/rocketpool.go | 25 ++++++++-------- tests/utils/eth/transactions_test.go | 22 ++++++++------ utils/eth/transactions.go | 44 ++++++++++++++++++---------- 7 files changed, 105 insertions(+), 47 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 19d5d48ff..9d1809fa0 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -569,6 +570,16 @@ func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. } +// Wait for a transaction to get mined +func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + return rocketAuctionManager.WaitForTransaction(hash) +} + + // Get contracts var rocketAuctionManagerLock sync.Mutex func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index d5750e460..7aa2d461b 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -175,6 +176,16 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr } +// Wait for a transaction to get mined +func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return nil, err + } + return rocketDAONodeTrustedProposals.WaitForTransaction(hash) +} + + // Get contracts var rocketDAONodeTrustedProposalsLock sync.Mutex func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/deposit/deposit.go b/deposit/deposit.go index c76ac4b87..0d33d4a62 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -67,6 +68,16 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common. } +// Wait for a transaction to get mined +func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + return rocketDepositPool.WaitForTransaction(hash) +} + + // Get contracts var rocketDepositPoolLock sync.Mutex func getRocketDepositPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/minipool/minipool.go b/minipool/minipool.go index 00f36011e..a990ce752 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -1,19 +1,19 @@ package minipool import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" ) - // Settings const ( MinipoolAddressBatchSize = 50 @@ -460,6 +460,16 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } +// Wait for a transaction to get mined +func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return nil, err + } + return rocketMinipoolManager.WaitForTransaction(hash) +} + + // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 7d8c0c3a2..5e0aad125 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -1,21 +1,20 @@ package rocketpool import ( - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/contracts" + "fmt" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/contracts" ) - // Cache settings const CacheTTL = 300 // 5 minutes diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index 9aa1d395f..d8fa6ef88 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -1,17 +1,17 @@ package eth import ( - "context" - "testing" + "context" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -36,7 +36,11 @@ func TestSendTransaction(t *testing.T) { // Send transaction opts := userAccount.GetTransactor() opts.Value = sendAmount - if _, err := eth.SendTransaction(client, toAddress, opts); err != nil { + hash, err := eth.SendTransaction(client, toAddress, opts) + if err != nil { + t.Fatal(err) + } + if _, err := eth.WaitForSendTransaction(client, hash); err != nil { t.Fatal(err) } diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 74b9b9337..cd52039d1 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -1,20 +1,19 @@ package eth import ( - "context" - "errors" - "math/big" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" + "context" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) - // Send a transaction to an address -func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce @@ -22,7 +21,7 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b if opts.Nonce == nil { nonce, err = client.PendingNonceAt(context.Background(), opts.From) if err != nil { - return nil, err + return common.Hash{}, err } } else { nonce = opts.Nonce.Uint64() @@ -39,7 +38,7 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b if gasPrice == nil { gasPrice, err = client.SuggestGasPrice(context.Background()) if err != nil { - return nil, err + return common.Hash{}, err } } @@ -53,7 +52,7 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b Value: value, }) if err != nil { - return nil, err + return common.Hash{}, err } } @@ -63,16 +62,29 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b // Sign transaction signedTx, err := opts.Signer(opts.From, tx) if err != nil { - return nil, err + return common.Hash{}, err } // Send transaction if err = client.SendTransaction(context.Background(), signedTx); err != nil { + return common.Hash{}, err + } + + return signedTx.Hash(), nil + +} + + +func WaitForSendTransaction(client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { + + // Get the tx by its hash + tx, _, err := client.TransactionByHash(context.Background(), hash) + if err != nil { return nil, err } // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), client, signedTx) + txReceipt, err := bind.WaitMined(context.Background(), client, tx) if err != nil { return nil, err } From 0b7710f5b17102a2a36ae194c261c65b725a29c9 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 09:30:18 +1000 Subject: [PATCH 321/878] Add .idea directory to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..723ef36f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file From f9bc4662ee4419686582d7015857abacd8e3a9c3 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 09:30:55 +1000 Subject: [PATCH 322/878] Point tests at latest contract and add missing dependency --- test.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test.sh b/test.sh index 207182d28..57c409605 100755 --- a/test.sh +++ b/test.sh @@ -22,7 +22,7 @@ fi # Rocket Pool settings rp_repo_url="https://github.com/rocket-pool/rocketpool.git" -rp_repo_branch="v2.5-Tokenomics-updates" +rp_repo_branch="rp3.0-updates" # Dependencies rp_dependencies=( @@ -33,6 +33,7 @@ rp_dependencies=( "pako@1.0.11" "truffle@5.1.66" "truffle-contract@4.0.31" + "@truffle/hdwallet-provider@^1.2.3" "web3@1.2.8" ) From 72ec53da9e29ddb3d601bf2c5afafdef227b29ae Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 09:32:03 +1000 Subject: [PATCH 323/878] Remove replace member DAO action --- dao/trustednode/actions.go | 15 ----- tests/dao/trustednode/proposals_test.go | 75 ------------------------- 2 files changed, 90 deletions(-) diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index 6cf20dd90..4984579be 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -42,21 +42,6 @@ func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts } -// Replace node's position in the trusted node DAO with another node -// Requires an executed replace proposal -func Replace(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketDAONodeTrustedActions.Transact(opts, "actionReplace") - if err != nil { - return nil, fmt.Errorf("Could not replace node's position in the trusted node DAO: %w", err) - } - return txReceipt, nil -} - - // Make a challenge against a node func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 3b865792b..dd4012bb1 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -141,81 +141,6 @@ func TestProposeMemberLeave(t *testing.T) { } -func TestProposeReplaceMember(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - - // Submit, pass & execute replace member proposal - proposalOldMemberAddress := trustedNodeAccount1.Address - proposalNewMemberAddress := nodeAccount.Address - proposalNewMemberId := "coolguy" - proposalNewMemberEmail := "coolguy@rocketpool.net" - proposalId, _, err := trustednodedao.ProposeReplaceMember(rp, "replace node 1", proposalOldMemberAddress, proposalNewMemberAddress, proposalNewMemberId, proposalNewMemberEmail, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } - - // Get & check initial member exists statuses - if oldMemberExists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if !oldMemberExists { - t.Error("Incorrect initial old member exists status") - } - if newMemberExists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if newMemberExists { - t.Error("Incorrect initial new member exists status") - } - - // Replace position in trusted node DAO - if _, err := trustednodedao.Replace(rp, trustedNodeAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated member exists status - if oldMemberExists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if oldMemberExists { - t.Error("Incorrect updated old member exists status") - } - if newMemberExists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !newMemberExists { - t.Error("Incorrect updated new member exists status") - } - - // Get & check proposal payload string - if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { - t.Error(err) - } else if payloadStr != fmt.Sprintf("proposalReplace(%s,%s,%s,%s)", proposalOldMemberAddress.Hex(), proposalNewMemberId, proposalNewMemberEmail, proposalNewMemberAddress.Hex()) { - t.Errorf("Incorrect proposal payload string %s", payloadStr) - } - - // Get & check member replace executed block - if replaceExecutedBlock, err := trustednodedao.GetMemberReplaceProposalExecutedBlock(rp, proposalOldMemberAddress, nil); err != nil { - t.Error(err) - } else if replaceExecutedBlock == 0 { - t.Errorf("Incorrect member replace proposal executed block %d", replaceExecutedBlock) - } - - // Get & check member replacement address - if replacementAddress, err := trustednodedao.GetMemberReplacementAddress(rp, proposalOldMemberAddress, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(replacementAddress.Bytes(), proposalNewMemberAddress.Bytes()) { - t.Errorf("Incorrect member replacement address %s", replacementAddress.Hex()) - } - -} - - func TestProposeKickMember(t *testing.T) { // State snapshotting From 83a8ee661368ffced9b645fb6c6cc171f7eb5a1a Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 09:49:42 +1000 Subject: [PATCH 324/878] Update setWithdrawalAddress test and add confirmWithdrawalAddress test --- node/node.go | 16 ++++++++++++++-- tests/node/main_test.go | 3 +++ tests/node/node_test.go | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/node/node.go b/node/node.go index 0efed18d1..df2f3c61e 100644 --- a/node/node.go +++ b/node/node.go @@ -239,18 +239,30 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind // Set a node's withdrawal address -func SetWithdrawalAddress(rp *rocketpool.RocketPool, withdrawalAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { +func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (*types.Receipt, error) { rocketNodeManager, err := getRocketNodeManager(rp) if err != nil { return nil, err } - txReceipt, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", withdrawalAddress) + txReceipt, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) if err != nil { return nil, fmt.Errorf("Could not set node withdrawal address: %w", err) } return txReceipt, nil } +// Set a node's withdrawal address +func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err + } + txReceipt, err := rocketNodeManager.Transact(opts, "confirmWithdrawalAddress", nodeAddress) + if err != nil { + return nil, fmt.Errorf("Could not confirm node withdrawal address: %w", err) + } + return txReceipt, nil +} // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (*types.Receipt, error) { diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 34f51a13a..660e823c0 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -21,6 +21,7 @@ var ( ownerAccount *accounts.Account nodeAccount *accounts.Account + withdrawalAccount *accounts.Account ) @@ -40,6 +41,8 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } nodeAccount, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } + withdrawalAccount, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } // Run tests os.Exit(m.Run()) diff --git a/tests/node/node_test.go b/tests/node/node_test.go index 411af22c4..be1ba06cb 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -75,7 +75,39 @@ func TestSetWithdrawalAddress(t *testing.T) { // Set withdrawal address withdrawalAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := node.SetWithdrawalAddress(rp, withdrawalAddress, nodeAccount.GetTransactor()); err != nil { + if _, err := node.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, true, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node withdrawal address + if nodeWithdrawalAddress, err := node.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) + } + +} + + +func TestSetWithdrawalAddressConfirmation(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set withdrawal address + withdrawalAddress := withdrawalAccount.Address + if _, err := node.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, false, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Confirm withdrawal address + if _, err := node.ConfirmWithdrawalAddress(rp, nodeAccount.Address, withdrawalAccount.GetTransactor()); err != nil { t.Fatal(err) } From 9b6166105dd9a4ecf2d727237a3250725d2351b4 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 10:02:01 +1000 Subject: [PATCH 325/878] Remove nETH related methods and tests --- minipool/minipool-contract.go | 40 ------ settings/protocol/minipool.go | 17 --- settings/protocol/network.go | 17 --- tests/minipool/contract_test.go | 82 ------------ tests/settings/protocol/minipool_test.go | 11 -- tests/settings/protocol/network_test.go | 12 -- tests/testutils/tokens/neth/neth.go | 48 ------- tests/tokens/neth_test.go | 163 ----------------------- tests/tokens/tokens_test.go | 10 -- tokens/neth.go | 122 ----------------- tokens/tokens.go | 8 -- 11 files changed, 530 deletions(-) delete mode 100644 tests/testutils/tokens/neth/neth.go delete mode 100644 tests/tokens/neth_test.go delete mode 100644 tokens/neth.go diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 2862b3f84..597a05065 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -29,7 +29,6 @@ type NodeDetails struct { DepositBalance *big.Int `json:"depositBalance"` RefundBalance *big.Int `json:"refundBalance"` DepositAssigned bool `json:"depositAssigned"` - Withdrawn bool `json:"withdrawn"` } type UserDetails struct { DepositBalance *big.Int `json:"depositBalance"` @@ -39,7 +38,6 @@ type UserDetails struct { type StakingDetails struct { StartBalance *big.Int `json:"startBalance"` EndBalance *big.Int `json:"endBalance"` - BalanceWithdrawn bool `json:"balanceWithdrawn"` } @@ -151,7 +149,6 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { var depositBalance *big.Int var refundBalance *big.Int var depositAssigned bool - var withdrawn bool // Load data wg.Go(func() error { @@ -179,11 +176,6 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { depositAssigned, err = mp.GetNodeDepositAssigned(opts) return err }) - wg.Go(func() error { - var err error - withdrawn, err = mp.GetNodeWithdrawn(opts) - return err - }) // Wait for data if err := wg.Wait(); err != nil { @@ -197,7 +189,6 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { DepositBalance: depositBalance, RefundBalance: refundBalance, DepositAssigned: depositAssigned, - Withdrawn: withdrawn, }, nil } @@ -236,14 +227,6 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { } return *nodeDepositAssigned, nil } -func (mp *Minipool) GetNodeWithdrawn(opts *bind.CallOpts) (bool, error) { - nodeWithdrawn := new(bool) - if err := mp.Contract.Call(opts, nodeWithdrawn, "getNodeWithdrawn"); err != nil { - return false, fmt.Errorf("Could not get minipool %s node withdrawn status: %w", mp.Address.Hex(), err) - } - return *nodeWithdrawn, nil -} - // Get user deposit details func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { @@ -314,7 +297,6 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro var wg errgroup.Group var startBalance *big.Int var endBalance *big.Int - var balanceWithdrawn bool // Load data wg.Go(func() error { @@ -327,11 +309,6 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro endBalance, err = mp.GetStakingEndBalance(opts) return err }) - wg.Go(func() error { - var err error - balanceWithdrawn, err = mp.GetValidatorBalanceWithdrawn(opts) - return err - }) // Wait for data if err := wg.Wait(); err != nil { @@ -342,7 +319,6 @@ func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, erro return StakingDetails{ StartBalance: startBalance, EndBalance: endBalance, - BalanceWithdrawn: balanceWithdrawn, }, nil } @@ -360,13 +336,6 @@ func (mp *Minipool) GetStakingEndBalance(opts *bind.CallOpts) (*big.Int, error) } return *stakingEndBalance, nil } -func (mp *Minipool) GetValidatorBalanceWithdrawn(opts *bind.CallOpts) (bool, error) { - validatorBalanceWithdrawn := new(bool) - if err := mp.Contract.Call(opts, validatorBalanceWithdrawn, "getValidatorBalanceWithdrawn"); err != nil { - return false, fmt.Errorf("Could not get minipool %s validator balance withdrawn status: %w", mp.Address.Hex(), err) - } - return *validatorBalanceWithdrawn, nil -} // Get withdrawal credentials @@ -399,15 +368,6 @@ func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSign } -// Withdraw node balances & rewards from the withdrawable minipool and close it -func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (*types.Receipt, error) { - txReceipt, err := mp.Contract.Transact(opts, "withdraw") - if err != nil { - return nil, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) - } - return txReceipt, nil -} - // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index b0394d854..43485f424 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -137,23 +137,6 @@ func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opt } -// Withdrawal delay in blocks before withdrawable minipools can be closed -func GetMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getWithdrawalDelay"); err != nil { - return 0, fmt.Errorf("Could not get minipool withdrawal delay: %w", err) - } - return (*value).Uint64(), nil -} -func BootstrapMinipoolWithdrawalDelay(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.withdrawal.delay", big.NewInt(int64(value)), opts) -} - - // Get contracts var minipoolSettingsContractLock sync.Mutex func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 76eb36069..a54c78f2f 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -6,7 +6,6 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" @@ -206,22 +205,6 @@ func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, } -// The eth2 system withdrawal contract address -func GetSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return common.Address{}, err - } - value := new(common.Address) - if err := networkSettingsContract.Call(opts, value, "getSystemWithdrawalContractAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get system withdrawal contract address: %w", err) - } - return *value, nil -} -func BootstrapSystemWithdrawalContractAddress(rp *rocketpool.RocketPool, value common.Address, opts *bind.TransactOpts) (*types.Receipt, error) { - return protocoldao.BootstrapAddress(rp, NetworkSettingsContractName, "network.withdrawal.contract.address", value, opts) -} - // Get contracts var networkSettingsContractLock sync.Mutex diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 24ef65b3a..7cccf351d 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -9,7 +9,6 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -87,9 +86,6 @@ func TestDetails(t *testing.T) { if !node.DepositAssigned { t.Error("Incorrect minipool node deposit assigned status") } - if node.Withdrawn { - t.Error("Incorrect minipool node withdrawn status") - } } if user, err := mp.GetUserDetails(nil); err != nil { t.Error(err) @@ -113,9 +109,6 @@ func TestDetails(t *testing.T) { if staking.EndBalance.Cmp(eth.EthToWei(36)) != 0 { t.Errorf("Incorrect minipool staking end balance %s", staking.EndBalance.String()) } - if staking.BalanceWithdrawn { - t.Error("Incorrect minipool validator balance withdrawn status") - } } if withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil); err != nil { t.Error(err) @@ -216,55 +209,6 @@ func TestStake(t *testing.T) { } -func TestWithdraw(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) - if err != nil { t.Fatal(err) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check initial minipool node withdrawn status - if nodeWithdrawn, err := mp.GetNodeWithdrawn(nil); err != nil { - t.Error(err) - } else if nodeWithdrawn { - t.Error("Incorrect initial minipool node withdrawn status") - } - - // Disable minipool withdrawal delay - withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) - if err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Withdraw minipool - if _, err := mp.Withdraw(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Re-enable minipool withdrawal delay - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated minipool node withdrawn status - if nodeWithdrawn, err := mp.GetNodeWithdrawn(nil); err != nil { - t.Error(err) - } else if !nodeWithdrawn { - t.Error("Incorrect updated minipool node withdrawn status") - } - -} - func TestDissolve(t *testing.T) { @@ -365,21 +309,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { // Set minipool withdrawable status if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Set SWC address - if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check initial minipool validator balance withdrawn status - if validatorBalanceWithdrawn, err := mp.GetValidatorBalanceWithdrawn(nil); err != nil { - t.Error(err) - } else if validatorBalanceWithdrawn { - t.Error("Incorrect initial minipool validator balance withdrawn status") - } - // Get initial token contract ETH balances - nethContractBalance1, err := tokens.GetNETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) if err != nil { t.Fatal(err) @@ -392,19 +322,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Fatal(err) } - // Get & check updated minipool validator balance withdrawn status - if validatorBalanceWithdrawn, err := mp.GetValidatorBalanceWithdrawn(nil); err != nil { - t.Error(err) - } else if !validatorBalanceWithdrawn { - t.Error("Incorrect updated minipool validator balance withdrawn status") - } - // Get & check updated token contract ETH balances - if nethContractBalance2, err := tokens.GetNETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if nethContractBalance2.Cmp(nethContractBalance1) != 1 { - t.Error("nETH contract ETH balance did not increase after processing withdrawal") - } if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { t.Fatal(err) } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { diff --git a/tests/settings/protocol/minipool_test.go b/tests/settings/protocol/minipool_test.go index 62469f2ca..1a5fe4a6a 100644 --- a/tests/settings/protocol/minipool_test.go +++ b/tests/settings/protocol/minipool_test.go @@ -75,16 +75,5 @@ func TestMinipoolSettings(t *testing.T) { } else if value != minipoolLaunchTimeout { t.Error("Incorrect minipool launch timeout value") } - - // Set & get minipool withdrawal delay - var minipoolWithdrawalDelay uint64 = 5 - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, minipoolWithdrawalDelay, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinipoolWithdrawalDelay(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolWithdrawalDelay { - t.Error("Incorrect minipool withdrawal delay value") - } - } diff --git a/tests/settings/protocol/network_test.go b/tests/settings/protocol/network_test.go index f62f6aa28..755fa8b7a 100644 --- a/tests/settings/protocol/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -1,10 +1,8 @@ package protocol import ( - "bytes" "testing" - "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -128,15 +126,5 @@ func TestNetworkSettings(t *testing.T) { t.Error("Incorrect target rETH collateral rate value") } - // Set & get system withdrawal contract address - swcAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAddress, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetSystemWithdrawalContractAddress(rp, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(value.Bytes(), swcAddress.Bytes()) { - t.Error("Incorrect system withdrawal contract address") - } - } diff --git a/tests/testutils/tokens/neth/neth.go b/tests/testutils/tokens/neth/neth.go deleted file mode 100644 index 99e0bdcb2..000000000 --- a/tests/testutils/tokens/neth/neth.go +++ /dev/null @@ -1,48 +0,0 @@ -package tokens - -import ( - "math/big" - - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" -) - - -// Mint an amount of nETH to an account -func MintNETH(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) (*minipool.Minipool, error) { - - // Register node if not registered - if nodeExists, err := node.GetNodeExists(rp, toAccount.Address, nil); err != nil { - return nil, err - } else if !nodeExists { - if _, err := node.RegisterNode(rp, "Australia/Brisbane", toAccount.GetTransactor()); err != nil { return nil, err } - } - - // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, toAccount, eth.EthToWei(32)) - if err != nil { return nil, err } - if err := minipoolutils.StakeMinipool(rp, mp, toAccount); err != nil { return nil, err } - - // Disable minipool withdrawal delay - withdrawalDelay, err := protocol.GetMinipoolWithdrawalDelay(rp, nil) - if err != nil { return nil, err } - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, 0, ownerAccount.GetTransactor()); err != nil { return nil, err } - - // Mark minipool as withdrawable and withdraw - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), amount, trustedNodeAccount.GetTransactor()); err != nil { return nil, err } - if _, err := mp.Withdraw(toAccount.GetTransactor()); err != nil { return nil, err } - - // Re-enable minipool withdrawal delay - if _, err := protocol.BootstrapMinipoolWithdrawalDelay(rp, withdrawalDelay, ownerAccount.GetTransactor()); err != nil { return nil, err } - - // Return created minipool - return mp, nil - -} - diff --git a/tests/tokens/neth_test.go b/tests/tokens/neth_test.go deleted file mode 100644 index c84ae7cf7..000000000 --- a/tests/tokens/neth_test.go +++ /dev/null @@ -1,163 +0,0 @@ -package tokens - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - nethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/neth" -) - - -// GetNETHContractETHBalance test under minipool.TestWithdrawValidatorBalance - - -func TestNETHBalances(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint nETH - nethAmount := eth.EthToWei(100) - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } - - // Get & check nETH total supply - if nethTotalSupply, err := tokens.GetNETHTotalSupply(rp, nil); err != nil { - t.Error(err) - } else if nethTotalSupply.Cmp(nethAmount) != 0 { - t.Errorf("Incorrect nETH total supply %s", nethTotalSupply.String()) - } - - // Get & check nETH account balance - if nethBalance, err := tokens.GetNETHBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if nethBalance.Cmp(nethAmount) != 0 { - t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) - } - -} - - -func TestTransferNETH(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint nETH - nethAmount := eth.EthToWei(100) - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } - - // Transfer nETH - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferNETH(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check nETH account balance - if nethBalance, err := tokens.GetNETHBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if nethBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) - } - -} - - -func TestTransferFromNETH(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint nETH - nethAmount := eth.EthToWei(100) - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } - - // Approve nETH spender - sendAmount := eth.EthToWei(50) - if _, err := tokens.ApproveNETH(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check spender allowance - if allowance, err := tokens.GetNETHAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { - t.Error(err) - } else if allowance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect nETH spender allowance %s", allowance.String()) - } - - // Transfer nETH from account - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := tokens.TransferFromNETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check nETH account balance - if nethBalance, err := tokens.GetNETHBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if nethBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect nETH account balance %s", nethBalance.String()) - } - -} - - -func TestBurnNETH(t *testing.T) { - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint nETH - nethAmount := eth.EthToWei(100) - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - mp, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount) - if err != nil { t.Fatal(err) } - - // Set SWC address - if _, err := protocol.BootstrapSystemWithdrawalContractAddress(rp, swcAccount.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Withdraw minipool validator balance - opts := swcAccount.GetTransactor() - opts.Value = nethAmount - if _, err := mp.Contract.Transfer(opts); err != nil { t.Fatal(err) } - - // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Burn nETH - burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnNETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { - t.Fatal(err) - } else { - if balances2.NETH.Cmp(balances1.NETH) != -1 { - t.Error("nETH balance did not decrease after burning nETH") - } - if balances2.ETH.Cmp(balances1.ETH) != 1 { - t.Error("ETH balance did not increase after burning nETH") - } - } - -} - diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index 7f9e9f5d0..e96d5b606 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -8,8 +8,6 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - nethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/neth" rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -21,11 +19,6 @@ func TestTokenBalances(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Mint nETH - nethAmount := eth.EthToWei(101) - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - if _, err := nethutils.MintNETH(rp, ownerAccount, trustedNodeAccount, userAccount1, nethAmount); err != nil { t.Fatal(err) } - // Mint rETH rethAmount := eth.EthToWei(102) if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } @@ -45,9 +38,6 @@ func TestTokenBalances(t *testing.T) { if balances.ETH.Cmp(big.NewInt(0)) != 1 { t.Errorf("Incorrect ETH balance %s", balances.ETH.String()) } - if balances.NETH.Cmp(nethAmount) != 0 { - t.Errorf("Incorrect nETH balance %s", balances.NETH.String()) - } if balances.RETH.Cmp(rethAmount) != 0 { t.Errorf("Incorrect rETH balance %s", balances.RETH.String()) } diff --git a/tokens/neth.go b/tokens/neth.go deleted file mode 100644 index 1a8cf0759..000000000 --- a/tokens/neth.go +++ /dev/null @@ -1,122 +0,0 @@ -package tokens - -import ( - "fmt" - "math/big" - "sync" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - - "github.com/rocket-pool/rocketpool-go/rocketpool" -) - - -// -// Core ERC-20 functions -// - - -// Get nETH total supply -func GetNETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return totalSupply(rocketTokenNETH, "nETH", opts) -} - - -// Get nETH balance -func GetNETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return balanceOf(rocketTokenNETH, "nETH", address, opts) -} - - -// Get nETH allowance -func GetNETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return allowance(rocketTokenNETH, "nETH", owner, spender, opts) -} - - -// Transfer nETH -func TransferNETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return transfer(rocketTokenNETH, "nETH", to, amount, opts) -} - - -// Approve a nETH spender -func ApproveNETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return approve(rocketTokenNETH, "nETH", spender, amount, opts) -} - - -// Transfer nETH from a sender -func TransferFromNETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return transferFrom(rocketTokenNETH, "nETH", from, to, amount, opts) -} - - -// -// nETH functions -// - - -// Get the nETH contract ETH balance -func GetNETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - return contractETHBalance(rp, rocketTokenNETH, opts) -} - - -// Burn nETH for ETH -func BurnNETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Receipt, error) { - rocketTokenNETH, err := getRocketTokenNETH(rp) - if err != nil { - return nil, err - } - txReceipt, err := rocketTokenNETH.Transact(opts, "burn", amount) - if err != nil { - return nil, fmt.Errorf("Could not burn nETH: %w", err) - } - return txReceipt, nil -} - - -// -// Contracts -// - - -// Get contracts -var rocketTokenNETHLock sync.Mutex -func getRocketTokenNETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketTokenNETHLock.Lock() - defer rocketTokenNETHLock.Unlock() - return rp.GetContract("rocketTokenNETH") -} - diff --git a/tokens/tokens.go b/tokens/tokens.go index b84c74838..523d605ed 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -17,7 +17,6 @@ import ( // Token balances type Balances struct { ETH *big.Int `json:"eth"` - NETH *big.Int `json:"neth"` RETH *big.Int `json:"reth"` RPL *big.Int `json:"rpl"` FixedSupplyRPL *big.Int `json:"fixedSupplyRpl"` @@ -34,7 +33,6 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Data var wg errgroup.Group var ethBalance *big.Int - var nethBalance *big.Int var rethBalance *big.Int var rplBalance *big.Int var fixedSupplyRplBalance *big.Int @@ -45,11 +43,6 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C ethBalance, err = rp.Client.BalanceAt(context.Background(), address, blockNumber) return err }) - wg.Go(func() error { - var err error - nethBalance, err = GetNETHBalance(rp, address, opts) - return err - }) wg.Go(func() error { var err error rethBalance, err = GetRETHBalance(rp, address, opts) @@ -74,7 +67,6 @@ func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Return return Balances{ ETH: ethBalance, - NETH: nethBalance, RETH: rethBalance, RPL: rplBalance, FixedSupplyRPL: fixedSupplyRplBalance, From 261001331c325e5461c761cf8ce4cde575477220 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 10:58:56 +1000 Subject: [PATCH 326/878] Update minipool payout method --- minipool/minipool-contract.go | 10 ++++++++++ tests/minipool/contract_test.go | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 597a05065..4d6420084 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -358,6 +358,16 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { } +// Payout withdrawn ETH +func (mp *Minipool) Payout(opts *bind.TransactOpts) (*types.Receipt, error) { + txReceipt, err := mp.Contract.Transact(opts, "payout", true) + if err != nil { + return nil, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + } + return txReceipt, nil +} + + // Progress the prelaunch minipool to staking func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 7cccf351d..2d2e718e1 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -322,6 +322,11 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Fatal(err) } + // Call payout method + if _, err := mp.Payout(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + // Get & check updated token contract ETH balances if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { t.Fatal(err) From 2b8dc4aa4eac058e8cf9dfc1b79d872b918ed76b Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 11:04:18 +1000 Subject: [PATCH 327/878] Typo in error message --- minipool/minipool-contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 4d6420084..5ff14445a 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -362,7 +362,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { func (mp *Minipool) Payout(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := mp.Contract.Transact(opts, "payout", true) if err != nil { - return nil, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("Could not payout minipool %s: %w", mp.Address.Hex(), err) } return txReceipt, nil } From a8b55c0bef3908016ea3e9555ad74598f804b0c8 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 13:13:39 +1000 Subject: [PATCH 328/878] Add check that node operator's ETH balance increased after payout --- tests/minipool/contract_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 2d2e718e1..a4d14a050 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -322,11 +322,24 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Fatal(err) } + // Get node balances before payout + nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + // Call payout method if _, err := mp.Payout(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check updated node ETH balances + if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { + t.Fatal(err) + } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { + t.Error("node ETH balance did not increase after processing withdrawal") + } + // Get & check updated token contract ETH balances if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { t.Fatal(err) From 295c63e16b611c604b44d6f0466088ead4590365 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 13:51:33 +1000 Subject: [PATCH 329/878] Add confirm flag to Payout method --- minipool/minipool-contract.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 5ff14445a..669b66d75 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -228,6 +228,7 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { return *nodeDepositAssigned, nil } + // Get user deposit details func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { @@ -359,7 +360,10 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (*types.Receipt, error) { // Payout withdrawn ETH -func (mp *Minipool) Payout(opts *bind.TransactOpts) (*types.Receipt, error) { +func (mp *Minipool) Payout(confirm bool, opts *bind.TransactOpts) (*types.Receipt, error) { + if !confirm { + return nil, fmt.Errorf("Could not payout minipool %s: confirmation flag must be set to true", mp.Address.Hex()) + } txReceipt, err := mp.Contract.Transact(opts, "payout", true) if err != nil { return nil, fmt.Errorf("Could not payout minipool %s: %w", mp.Address.Hex(), err) @@ -378,7 +382,6 @@ func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSign } - // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (*types.Receipt, error) { txReceipt, err := mp.Contract.Transact(opts, "dissolve") From 99a450fee22ad0ab7c3ae24a028cebd4bf1952d8 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Apr 2021 13:52:17 +1000 Subject: [PATCH 330/878] Add confirm flag to test --- tests/minipool/contract_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index a4d14a050..013bf2088 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -329,7 +329,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { } // Call payout method - if _, err := mp.Payout(nodeAccount.GetTransactor()); err != nil { + if _, err := mp.Payout(true, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } From 0542bd5d8c33562d32a856f96dd6b112607dac3b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 28 Apr 2021 00:10:23 -0400 Subject: [PATCH 331/878] Refactored the TX info system so there's only one wait method now --- auction/auction.go | 11 --------- dao/trustednode/proposals.go | 11 --------- deposit/deposit.go | 11 --------- minipool/minipool.go | 11 --------- node/node.go | 11 --------- rocketpool/contract.go | 15 ------------ tests/testutils/minipool/minipool.go | 3 ++- tests/utils/eth/transactions_test.go | 3 ++- utils/eth/transactions.go | 26 -------------------- utils/wait.go | 36 ++++++++++++++++++++++++++++ 10 files changed, 40 insertions(+), 98 deletions(-) create mode 100644 utils/wait.go diff --git a/auction/auction.go b/auction/auction.go index 9d1809fa0..19d5d48ff 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -570,16 +569,6 @@ func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. } -// Wait for a transaction to get mined -func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - return rocketAuctionManager.WaitForTransaction(hash) -} - - // Get contracts var rocketAuctionManagerLock sync.Mutex func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 7aa2d461b..d5750e460 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -176,16 +175,6 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr } -// Wait for a transaction to get mined -func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return nil, err - } - return rocketDAONodeTrustedProposals.WaitForTransaction(hash) -} - - // Get contracts var rocketDAONodeTrustedProposalsLock sync.Mutex func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/deposit/deposit.go b/deposit/deposit.go index 0d33d4a62..c76ac4b87 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -68,16 +67,6 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common. } -// Wait for a transaction to get mined -func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return nil, err - } - return rocketDepositPool.WaitForTransaction(hash) -} - - // Get contracts var rocketDepositPoolLock sync.Mutex func getRocketDepositPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/minipool/minipool.go b/minipool/minipool.go index a990ce752..64a221e83 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -460,16 +459,6 @@ func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress c } -// Wait for a transaction to get mined -func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return nil, err - } - return rocketMinipoolManager.WaitForTransaction(hash) -} - - // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/node/node.go b/node/node.go index b216c6e3a..083e4ed3a 100644 --- a/node/node.go +++ b/node/node.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -265,16 +264,6 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } -// Wait for a transaction to get mined -func WaitForTransaction(rp *rocketpool.RocketPool, hash common.Hash) (*types.Receipt, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return nil, err - } - return rocketNodeManager.WaitForTransaction(hash) -} - - // Get contracts var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 7c5fe12d8..258bc861d 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -89,21 +89,6 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { } -// Block until a transaction is mined, then return the receipt -func (c *Contract) WaitForTransaction(hash common.Hash) (*types.Receipt, error) { - - // Get the transaction from its hash - tx, _, err := c.Client.TransactionByHash(context.Background(), hash) - if err != nil { - return nil, err - } - - // Get & return transaction receipt - return c.getTransactionReceipt(tx) - -} - - // Estimate the gas limit for a contract transaction func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, error) { diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index e802d059c..d0e18b223 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -39,7 +40,7 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun opts.Value = depositAmount hash, err := node.Deposit(rp, 0, opts) if err != nil { return nil, err } - txReceipt, err := node.WaitForTransaction(rp, hash) + txReceipt, err := utils.WaitForTransaction(rp.Client, hash) if err != nil { return nil, err } // Get minipool manager contract diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index d8fa6ef88..b5e6cb9c5 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/utils" ) @@ -40,7 +41,7 @@ func TestSendTransaction(t *testing.T) { if err != nil { t.Fatal(err) } - if _, err := eth.WaitForSendTransaction(client, hash); err != nil { + if _, err := utils.WaitForTransaction(client, hash); err != nil { t.Fatal(err) } diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index cd52039d1..69ca2e78f 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -2,7 +2,6 @@ package eth import ( "context" - "errors" "math/big" "github.com/ethereum/go-ethereum" @@ -74,28 +73,3 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b } - -func WaitForSendTransaction(client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { - - // Get the tx by its hash - tx, _, err := client.TransactionByHash(context.Background(), hash) - if err != nil { - return nil, err - } - - // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), client, tx) - if err != nil { - return nil, err - } - - // Check transaction status - if txReceipt.Status == 0 { - return txReceipt, errors.New("Transaction failed with status 0") - } - - // Return - return txReceipt, nil - -} - diff --git a/utils/wait.go b/utils/wait.go new file mode 100644 index 000000000..1ac20b788 --- /dev/null +++ b/utils/wait.go @@ -0,0 +1,36 @@ +package utils + +import ( + "context" + "errors" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" +) + +// Wait for a transaction to get mined +func WaitForTransaction(client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { + + // Get the transaction from its hash + tx, _, err := client.TransactionByHash(context.Background(), hash) + if err != nil { + return nil, err + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), client, tx) + if err != nil { + return nil, err + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil +} + From fcc6e4ec40a03f0b20c971aca7c8ce354655ebc1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 3 May 2021 23:33:43 -0400 Subject: [PATCH 332/878] Added gas estimators for all of the transactions --- auction/auction.go | 40 ++++++++++ dao/protocol/dao.go | 40 ++++++++++ dao/trustednode/actions.go | 40 ++++++++++ dao/trustednode/dao.go | 44 +++++++++++ dao/trustednode/proposals.go | 142 ++++++++++++++++++++++++++++++++++ deposit/deposit.go | 20 +++++ minipool/minipool-contract.go | 38 ++++++++- minipool/status.go | 10 +++ network/balances.go | 10 +++ network/prices.go | 10 +++ node/deposit.go | 10 +++ node/node.go | 40 ++++++++++ node/staking.go | 20 +++++ rewards/node.go | 10 +++ rewards/rewards.go | 6 ++ rewards/trusted-node.go | 10 +++ tokens/reth.go | 40 ++++++++++ tokens/rpl-fixed.go | 30 +++++++ tokens/rpl.go | 50 ++++++++++++ tokens/tokens.go | 18 +++++ 20 files changed, 627 insertions(+), 1 deletion(-) diff --git a/auction/auction.go b/auction/auction.go index 19d5d48ff..d3daea283 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -509,6 +509,16 @@ func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder c } +// Estimate the gas of CreateLot +func EstimateCreateLotGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "createLot") +} + + // Create a new lot func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) @@ -527,6 +537,16 @@ func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, comm } +// Estimate the gas of PlaceBid +func EstimatePlaceBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "placeBid", big.NewInt(int64(lotIndex))) +} + + // Place a bid on a lot func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) @@ -541,6 +561,16 @@ func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt } +// Estimate the gas of ClaimBid +func EstimateClaimBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "claimBid", big.NewInt(int64(lotIndex))) +} + + // Claim RPL from a lot that was bid on func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) @@ -555,6 +585,16 @@ func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt } +// Estimate the gas of RecoverUnclaimedRPL +func EstimateRecoverUnclaimedRPLGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) +} + + // Recover unclaimed RPL from a lot func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketAuctionManager, err := getRocketAuctionManager(rp) diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 3a03153bc..1abbf8494 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -12,6 +12,16 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Estimate the gas of BootstrapBool +func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) +} + + // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) @@ -26,6 +36,16 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Estimate the gas of BootstrapUint +func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) +} + + // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) @@ -40,6 +60,16 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Estimate the gas of BootstrapAddress +func EstimateBootstrapAddressGas(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingAddress", contractName, settingPath, value) +} + + // Bootstrap an address setting func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) @@ -54,6 +84,16 @@ func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath strin } +// Estimate the gas of BootstrapClaimer +func EstimateBootstrapClaimerGas(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) +} + + // Bootstrap a rewards claimer func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocol, err := getRocketDAOProtocol(rp) diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index f69659419..74aef9236 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -10,6 +10,16 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Estimate the gas of Join +func EstimateJoinGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionJoin") +} + + // Join the trusted node DAO // Requires an executed invite proposal func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { @@ -25,6 +35,16 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, erro } +// Estimate the gas of Leave +func EstimateLeaveGas(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionLeave", rplBondRefundAddress) +} + + // Leave the trusted node DAO // Requires an executed leave proposal func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { @@ -40,6 +60,16 @@ func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts } +// Estimate the gas of MakeChallenge +func EstimateMakeChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeMake", memberAddress) +} + + // Make a challenge against a node func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) @@ -54,6 +84,16 @@ func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts } +// Estimate the gas of DecideChallenge +func EstimateDecideChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeDecide", memberAddress) +} + + // Decide a challenge against a node func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 93e16fc2d..852be62b8 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -357,6 +357,16 @@ func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Addre } +// Estimate the gas of BootstrapBool +func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) +} + + // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -371,6 +381,16 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Estimate the gas of BootstrapUint +func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) +} + + // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -385,6 +405,16 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, } +// Estimate the gas of BootstrapMember +func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, email, nodeAddress) +} + + // Bootstrap a DAO member func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -399,6 +429,20 @@ func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress co } +// Estimate the gas of BootstrapUpgrade +func EstimateBootstrapUpgradeGas(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return rocketpool.GasInfo{}, err + } + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) +} + + // Bootstrap a contract upgrade func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index d5750e460..c817c948e 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -12,6 +12,20 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Estimate the gas of ProposeInviteMember +func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to invite a new member to the trusted node DAO func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -26,6 +40,20 @@ func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAdd } +// Estimate the gas of ProposeMemberLeave +func EstimateProposeMemberLeaveGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal for a member to leave the trusted node DAO func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -40,6 +68,20 @@ func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress } +// Estimate the gas of ProposeReplaceMember +func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to replace a member in the trusted node DAO func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -54,6 +96,20 @@ func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddre } +// Estimate the gas of ProposeKickMember +func EstimateProposeKickMemberGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to kick a member from the trusted node DAO func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -68,6 +124,20 @@ func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress } +// Estimate the gas of ProposeSetBool +func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to update a bool trusted node DAO setting func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -82,6 +152,20 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat } +// Estimate the gas of ProposeSetUint +func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to update a uint trusted node DAO setting func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -96,6 +180,24 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat } +// Estimate the gas of ProposeUpgradeContract +func EstimateProposeUpgradeContractGas(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return rocketpool.GasInfo{}, err + } + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + + // Submit a proposal to upgrade a contract func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) @@ -114,6 +216,16 @@ func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, con } +// Estimate the gas of a proposal submission +func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "propose", message, payload) +} + + // Submit a trusted node DAO proposal // Returns the ID of the new proposal func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { @@ -133,6 +245,16 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o } +// Estimate the gas of CancelProposal +func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) +} + + // Cancel a submitted proposal func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -147,6 +269,16 @@ func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tra } +// Estimate the gas of VoteOnProposal +func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) +} + + // Vote on a submitted proposal func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) @@ -161,6 +293,16 @@ func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, } +// Estimate the gas of ExecuteProposal +func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) +} + + // Execute a submitted proposal func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) diff --git a/deposit/deposit.go b/deposit/deposit.go index c76ac4b87..41b1de9e4 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -39,6 +39,16 @@ func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } +// Estimate the gas of Deposit +func EstimateDepositGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "deposit") +} + + // Make a deposit func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp) @@ -53,6 +63,16 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, e } +// Estimate the gas of AssignDeposits +func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits") +} + + // Assign deposits func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 44259ee47..46b3097d5 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -347,6 +347,12 @@ func (mp *Minipool) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, } +// Estimate the gas of Refund +func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "refund") +} + + // Refund node ETH from the minipool func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { hash, err := mp.Contract.Transact(opts, "refund") @@ -357,12 +363,18 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { } +// Estimate the gas of Payout +func (mp *Minipool) EstimatePayoutGas(confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "payout", confirm) +} + + // Payout withdrawn ETH func (mp *Minipool) Payout(confirm bool, opts *bind.TransactOpts) (common.Hash, error) { if !confirm { return common.Hash{}, fmt.Errorf("Could not payout minipool %s: confirmation flag must be set to true", mp.Address.Hex()) } - hash, err := mp.Contract.Transact(opts, "payout", true) + hash, err := mp.Contract.Transact(opts, "payout", confirm) if err != nil { return common.Hash{}, fmt.Errorf("Could not payout minipool %s: %w", mp.Address.Hex(), err) } @@ -370,6 +382,12 @@ func (mp *Minipool) Payout(confirm bool, opts *bind.TransactOpts) (common.Hash, } +// Estimate the gas of Stake +func (mp *Minipool) EstimateStakeGas(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) +} + + // Progress the prelaunch minipool to staking func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { hash, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) @@ -380,6 +398,12 @@ func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSign } +// Estimate the gas of Withdraw +func (mp *Minipool) EstimateWithdrawGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "withdraw") +} + + // Withdraw node balances & rewards from the withdrawable minipool and close it func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (common.Hash, error) { hash, err := mp.Contract.Transact(opts, "withdraw") @@ -390,6 +414,12 @@ func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (common.Hash, error) { } +// Estimate the gas of Dissolve +func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "dissolve") +} + + // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { hash, err := mp.Contract.Transact(opts, "dissolve") @@ -400,6 +430,12 @@ func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { } +// Estimate the gas of Close +func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "close") +} + + // Withdraw node balances from the dissolved minipool and close it func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { hash, err := mp.Contract.Transact(opts, "close") diff --git a/minipool/status.go b/minipool/status.go index 3e8086c6b..c654a1667 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -26,6 +26,16 @@ func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, use } +// Estimate the gas of SubmitMinipoolWithdrawable +func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketMinipoolStatus.GetTransactionGasInfo(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) +} + + // Submit a minipool withdrawable event func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) diff --git a/network/balances.go b/network/balances.go index e4d8ffba6..6d08e357b 100644 --- a/network/balances.go +++ b/network/balances.go @@ -82,6 +82,16 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } +// Estimate the gas of SubmitBalances +func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) +} + + // Submit network balances for an epoch func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp) diff --git a/network/prices.go b/network/prices.go index 3509eaee7..25d2a26b8 100644 --- a/network/prices.go +++ b/network/prices.go @@ -39,6 +39,16 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } +// Estimate the gas of Deposit +func EstimateDepositGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) +} + + // Submit network prices for an epoch func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) diff --git a/node/deposit.go b/node/deposit.go index f43ad302c..1ac16e8e8 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -11,6 +11,16 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Estimate the gas of Deposit +func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee)) +} + + // Make a node deposit func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp) diff --git a/node/node.go b/node/node.go index 1121043b0..4e033bc97 100644 --- a/node/node.go +++ b/node/node.go @@ -222,6 +222,16 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre } +// Estimate the gas of RegisterNode +func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "registerNode", timezoneLocation) +} + + // Register a node func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -236,6 +246,16 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } +// Estimate the gas of SetWithdrawalAddress +func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) +} + + // Set a node's withdrawal address func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -250,6 +270,16 @@ func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, } +// Estimate the gas of ConfirmWithdrawalAddress +func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "confirmWithdrawalAddress", nodeAddress) +} + + // Set a node's withdrawal address func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -264,6 +294,16 @@ func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Addr } +// Estimate the gas of SetTimezoneLocation +func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) +} + + // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeManager, err := getRocketNodeManager(rp) diff --git a/node/staking.go b/node/staking.go index 334ef0066..43cea93bf 100644 --- a/node/staking.go +++ b/node/staking.go @@ -109,6 +109,16 @@ func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, } +// Estimate the gas of Stake +func EstimateStakeGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "stakeRPL", rplAmount) +} + + // Stake RPL func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) @@ -123,6 +133,16 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact } +// Estimate the gas of WithdrawRPL +func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", rplAmount) +} + + // Withdraw staked RPL func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) diff --git a/rewards/node.go b/rewards/node.go index cf9a6c75b..6de2426c9 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -50,6 +50,16 @@ func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common. } +// Estimate the gas of ClaimNodeRewards +func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateClaimGas(rocketClaimNode, opts) +} + + // Claim node rewards func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketClaimNode, err := getRocketClaimNode(rp) diff --git a/rewards/rewards.go b/rewards/rewards.go index 4ebc2584d..48edcec6e 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -53,6 +53,12 @@ func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName strin } +// Estimate the gas of claim +func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return claimsContract.GetTransactionGasInfo(opts, "claim") +} + + // Claim rewards func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { hash, err := claimsContract.Transact(opts, "claim") diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 03b547c16..edf2466d5 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -50,6 +50,16 @@ func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress } +// Estimate the gas of ClaimTrustedNodeRewards +func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateClaimGas(rocketClaimTrustedNode, opts) +} + + // Claim trusted node rewards func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) diff --git a/tokens/reth.go b/tokens/reth.go index a232ea6b0..2a9125e10 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -46,6 +46,16 @@ func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, } +// Estimate the gas of TransferRETH +func EstimateTransferRETHGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenRETH, "rETH", to, amount, opts) +} + + // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -56,6 +66,16 @@ func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, } +// Estimate the gas of ApproveRETH +func EstimateApproveRETHGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenRETH, "rETH", spender, amount, opts) +} + + // Approve a rETH spender func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -66,6 +86,16 @@ func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big. } +// Estimate the gas of TransferFromRETH +func EstimateTransferFromRETHGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenRETH, "rETH", from, to, amount, opts) +} + + // Transfer rETH from a sender func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) @@ -161,6 +191,16 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } +// Estimate the gas of BurnRETH +func EstimateBurnRETHGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRETH.GetTransactionGasInfo(opts, "burn", amount) +} + + // Burn rETH for ETH func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRETH, err := getRocketTokenRETH(rp) diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go index 6e777dddd..203910dd7 100644 --- a/tokens/rpl-fixed.go +++ b/tokens/rpl-fixed.go @@ -44,6 +44,16 @@ func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common } +// Estimate the gas of TransferFixedSupplyRPL +func EstimateTransferFixedSupplyRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) +} + + // Transfer fixed-supply RPL func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) @@ -54,6 +64,16 @@ func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount } +// Estimate the gas of ApproveFixedSupplyRPL +func EstimateApproveFixedSupplyRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) +} + + // Approve an fixed-supply RPL spender func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) @@ -64,6 +84,16 @@ func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, am } +// Estimate the gas of TransferFromFixedSupplyRPL +func EstimateTransferFromFixedSupplyRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) +} + + // Transfer fixed-supply RPL from a sender func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) diff --git a/tokens/rpl.go b/tokens/rpl.go index f3520e607..eeb0fe7ee 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -45,6 +45,16 @@ func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, o } +// Estimate the gas of TransferRPL +func EstimateTransferRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenRPL, "RPL", to, amount, opts) +} + + // Transfer RPL func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -55,6 +65,16 @@ func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, } +// Estimate the gas of ApproveRPL +func EstimateApproveRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenRPL, "RPL", spender, amount, opts) +} + + // Approve an RPL spender func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -65,6 +85,16 @@ func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.I } +// Estimate the gas of TransferFromRPL +func EstimateTransferFromRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenRPL, "RPL", from, to, amount, opts) +} + + // Transfer RPL from a sender func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -80,6 +110,16 @@ func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount // +// Estimate the gas of MintInflationRPL +func EstimateMintInflationRPLGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRPL.GetTransactionGasInfo(opts, "inflationMintTokens") +} + + // Mint new RPL tokens from inflation func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) @@ -94,6 +134,16 @@ func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } +// Estimate the gas of SwapFixedSupplyRPLForRPL +func EstimateSwapFixedSupplyRPLForRPLtGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRPL.GetTransactionGasInfo(opts, "swapTokens", amount) +} + + // Swap fixed-supply RPL for new RPL tokens func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) diff --git a/tokens/tokens.go b/tokens/tokens.go index e912348c7..82ffc56fe 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -111,6 +111,12 @@ func allowance(tokenContract *rocketpool.Contract, tokenName string, owner, spen } +// Estimate the gas of transfer +func estimateTransferGas(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return tokenContract.GetTransactionGasInfo(opts, "transfer", to, amount) +} + + // Transfer tokens to an address func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { hash, err := tokenContract.Transact(opts, "transfer", to, amount) @@ -121,6 +127,12 @@ func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Ad } +// Estimate the gas of approve +func estimateApproveGas(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return tokenContract.GetTransactionGasInfo(opts, "approve", spender, amount) +} + + // Approve a token allowance for a spender func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { hash, err := tokenContract.Transact(opts, "approve", spender, amount) @@ -131,6 +143,12 @@ func approve(tokenContract *rocketpool.Contract, tokenName string, spender commo } +// Estimate the gas of transferFrom +func estimateTransferFromGas(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return tokenContract.GetTransactionGasInfo(opts, "transferFrom", from, to, amount) +} + + // Transfer tokens from a sender to an address func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { hash, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) From 3ba5c9711d810bbc965e7c1a6010a65e8d2efce5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 4 May 2021 00:38:40 -0400 Subject: [PATCH 333/878] Added a gas estimator for sending ETH itself --- utils/eth/transactions.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 69ca2e78f..b4946cb0e 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -9,8 +9,47 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Estimate the gas of SendTransaction +func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + + // User-defined settings + response := rocketpool.GasInfo { + ReqGasPrice: opts.GasPrice, + ReqGasLimit: opts.GasLimit, + } + + // Set default value + value := opts.Value + if value == nil { + value = big.NewInt(0) + } + + // Get suggested gas price + gasPrice, err := client.SuggestGasPrice(context.Background()) + if err != nil { + return rocketpool.GasInfo{}, err + } + response.EstGasPrice = gasPrice + + // Estimate gas limit + gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: &toAddress, + GasPrice: gasPrice, + Value: value, + }) + if err != nil { + return rocketpool.GasInfo{}, err + } + response.EstGasLimit = gasLimit + + return response, err +} + + // Send a transaction to an address func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { var err error From 832bf5a259bab2e93e18153cd4c6c97d018074f7 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 5 May 2021 01:04:53 -0400 Subject: [PATCH 334/878] Typo fix --- tokens/rpl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokens/rpl.go b/tokens/rpl.go index eeb0fe7ee..567f1858b 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -135,7 +135,7 @@ func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo // Estimate the gas of SwapFixedSupplyRPLForRPL -func EstimateSwapFixedSupplyRPLForRPLtGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSwapFixedSupplyRPLForRPLGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketTokenRPL, err := getRocketTokenRPL(rp) if err != nil { return rocketpool.GasInfo{}, err From fcf25901f065b9eb2c9a89b234c00442571cafb0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 5 May 2021 22:48:32 -0400 Subject: [PATCH 335/878] Added gas estimators to the ODAO settings functions --- settings/trustednode/members.go | 18 ++++++++++++++++++ settings/trustednode/proposals.go | 15 +++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index cfa6c8a11..64d80d8ff 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -43,6 +43,9 @@ func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.Transa func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } +func EstimateProposeQuorumGas(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) +} // RPL bond required for a member @@ -63,6 +66,9 @@ func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.Tran func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } +func EstimateProposeRPLBondGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) +} // The maximum number of unbonded minipools a member can run @@ -83,6 +89,9 @@ func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeMinipoolUnbondedMaxGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) +} // The period a member must wait for before submitting another challenge, in blocks @@ -103,6 +112,9 @@ func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *b func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeChallengeCooldownGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) +} // The period during which a member can respond to a challenge, in blocks @@ -123,6 +135,9 @@ func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bin func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeChallengeWindowGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) +} // The fee for a non-member to challenge a member, in wei @@ -143,6 +158,9 @@ func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bin func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } +func EstimateProposeChallengeCostGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) +} // Get contracts diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 0b87e5691..18eaccf82 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -41,6 +41,9 @@ func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bi func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeProposalCooldownGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) +} // The period a proposal can be voted on for in blocks @@ -61,6 +64,9 @@ func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts * func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeProposalVoteBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) +} // The delay after creation before a proposal can be voted on in blocks @@ -81,6 +87,9 @@ func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, o func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeProposalVoteDelayBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) +} // The period during which a passed proposal can be executed in blocks @@ -101,6 +110,9 @@ func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opt func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeProposalExecuteBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) +} // The period during which an action can be performed on an executed proposal in blocks @@ -121,6 +133,9 @@ func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) } +func EstimateProposeProposalActionBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) +} // Get contracts From a0ed5ca12883a6d08448ab564f4d49203c792399 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 9 May 2021 23:02:10 -0400 Subject: [PATCH 336/878] Changed the gas estimator to use a multiplier instead of a flat pad --- rocketpool/contract.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index e7f132bbd..b4e194569 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -1,24 +1,24 @@ package rocketpool import ( - "bytes" - "context" - "errors" - "fmt" - "math/big" - "reflect" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" + "bytes" + "context" + "errors" + "fmt" + "math/big" + "reflect" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) // Transaction settings const ( - GasLimitPadding = 100000 + GasLimitMultiplier float64 = 1.5 MaxGasLimit = 12000000 ) @@ -175,7 +175,7 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint } // Pad and return gas limit - gasLimit += GasLimitPadding + gasLimit = uint64(float64(gasLimit) * GasLimitMultiplier) if gasLimit > MaxGasLimit { gasLimit = MaxGasLimit } return gasLimit, nil From 9e182fa0d1816c6f3aaaec22c302e71cae75bf38 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 10 May 2021 00:19:16 -0400 Subject: [PATCH 337/878] Added email validation --- dao/trustednode/dao.go | 13 +++++++++++-- dao/trustednode/proposals.go | 25 +++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 852be62b8..7baf06e4a 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -3,6 +3,7 @@ package trustednode import ( "fmt" "math/big" + "net/mail" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -411,7 +412,11 @@ func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, email string, nod if err != nil { return rocketpool.GasInfo{}, err } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, email, nodeAddress) + address, err := mail.ParseAddress(email) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, address.Address, nodeAddress) } @@ -421,7 +426,11 @@ func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress co if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, email, nodeAddress) + address, err := mail.ParseAddress(email) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, address.Address, nodeAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index c817c948e..16eed20fa 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -3,6 +3,7 @@ package trustednode import ( "fmt" "math/big" + "net/mail" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -18,7 +19,11 @@ func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, n if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) + emailAddress, err := mail.ParseAddress(newMemberEmail) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, emailAddress.Address, newMemberAddress) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } @@ -32,7 +37,11 @@ func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAdd if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberEmail, newMemberAddress) + emailAddress, err := mail.ParseAddress(newMemberEmail) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, emailAddress.Address, newMemberAddress) if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } @@ -74,7 +83,11 @@ func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) + emailAddress, err := mail.ParseAddress(newMemberEmail) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, emailAddress.Address, newMemberAddress) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } @@ -88,7 +101,11 @@ func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddre if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberEmail, newMemberAddress) + emailAddress, err := mail.ParseAddress(newMemberEmail) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, emailAddress.Address, newMemberAddress) if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } From e31351964248ab61274e991d90e2a3ac2fe61f0f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 13 May 2021 00:41:58 -0400 Subject: [PATCH 338/878] Updated inflation and reward functions with timing instead of blocks --- node/staking.go | 12 +++---- settings/protocol/inflation.go | 20 +++++------ settings/protocol/rewards.go | 18 +++++----- tests/node/staking_test.go | 42 +++++++++++------------ tests/rewards/node_test.go | 34 +++++++++--------- tests/rewards/trusted_node_test.go | 24 +++++++------ tests/settings/protocol/inflation_test.go | 30 ++++++++-------- tests/settings/protocol/rewards_test.go | 24 ++++++------- tests/tokens/rpl_test.go | 22 ++++++------ 9 files changed, 117 insertions(+), 109 deletions(-) diff --git a/node/staking.go b/node/staking.go index 43cea93bf..f6713fcb2 100644 --- a/node/staking.go +++ b/node/staking.go @@ -81,17 +81,17 @@ func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } -// Get the block a node last staked RPL at -func GetNodeRPLStakedBlock(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { +// Get the time a node last staked RPL +func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) if err != nil { return 0, err } - nodeRplStakedBlock := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeRplStakedBlock, "getNodeRPLStakedBlock", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node RPL staked block: %w", err) + nodeRplStakedTime := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) } - return (*nodeRplStakedBlock).Uint64(), nil + return (*nodeRplStakedTime).Uint64(), nil } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 8cef9b635..abf019019 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -34,36 +34,36 @@ func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, op } -// RPL inflation interval in blocks -func GetInflationIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// RPL inflation interval time +func GetInflationIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { inflationSettingsContract, err := getInflationSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalBlocks"); err != nil { + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalTime"); err != nil { return 0, fmt.Errorf("Could not get inflation interval: %w", err) } return (*value).Uint64(), nil } -func BootstrapInflationIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.blocks", big.NewInt(int64(value)), opts) +func BootstrapInflationIntervalTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.time", big.NewInt(int64(value)), opts) } -// RPL inflation start block -func GetInflationStartBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// RPL inflation start time +func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { inflationSettingsContract, err := getInflationSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartBlock"); err != nil { - return 0, fmt.Errorf("Could not get inflation start block: %w", err) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartTime"); err != nil { + return 0, fmt.Errorf("Could not get inflation start time: %w", err) } return (*value).Uint64(), nil } -func BootstrapInflationStartBlock(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { +func BootstrapInflationStartTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) } diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 508ec7c39..a0e06f299 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -31,15 +31,15 @@ func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts } -// The block that a claimer's share was last updated at -func GetRewardsClaimerPercBlockUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { +// The time that a claimer's share was last updated +func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercBlockUpdated", contractName); err != nil { - return 0, fmt.Errorf("Could not get rewards claimer updated block: %w", err) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercTimeUpdated", contractName); err != nil { + return 0, fmt.Errorf("Could not get rewards claimer updated time: %w", err) } return (*value).Uint64(), nil } @@ -59,20 +59,20 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) } -// Rewards claim interval in blocks -func GetRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// Rewards claim interval time +func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalBlocks"); err != nil { + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalTime"); err != nil { return 0, fmt.Errorf("Could not get rewards claim interval: %w", err) } return (*value).Uint64(), nil } -func BootstrapRewardsClaimIntervalBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.blocks", big.NewInt(int64(value)), opts) +func BootstrapRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.time", big.NewInt(int64(value)), opts) } diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index d1dd912d5..7819556ef 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -1,18 +1,18 @@ package node import ( - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -65,10 +65,10 @@ func TestStakeRPL(t *testing.T) { } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { t.Errorf("Incorrect initial node minimum RPL stake %s", nodeMinimumRplStake.String()) } - if nodeRplStakedBlock, err := node.GetNodeRPLStakedBlock(rp, nodeAccount.Address, nil); err != nil { + if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeRplStakedBlock != 0 { - t.Errorf("Incorrect initial node RPL staked block %d", nodeRplStakedBlock) + } else if nodeRplStakedTime != 0 { + t.Errorf("Incorrect initial node RPL staked time %d", nodeRplStakedTime) } if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { t.Error(err) @@ -107,10 +107,10 @@ func TestStakeRPL(t *testing.T) { } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { t.Errorf("Incorrect updated node minimum RPL stake 1 %s", nodeMinimumRplStake.String()) } - if nodeRplStakedBlock, err := node.GetNodeRPLStakedBlock(rp, nodeAccount.Address, nil); err != nil { + if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { t.Error(err) - } else if nodeRplStakedBlock == 0 { - t.Errorf("Incorrect updated node RPL staked block 1 %d", nodeRplStakedBlock) + } else if nodeRplStakedTime == 0 { + t.Errorf("Incorrect updated node RPL staked time 1 %d", nodeRplStakedTime) } if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { t.Error(err) @@ -161,9 +161,9 @@ func TestWithdrawRPL(t *testing.T) { if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } // Get & set rewards claim interval - rewardsClaimIntervalBlocks, err := protocol.GetRewardsClaimIntervalBlocks(rp, nil) + rewardsClaimIntervalTime, err := protocol.GetRewardsClaimIntervalTime(rp, nil) if err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Check initial staking details if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { @@ -195,7 +195,7 @@ func TestWithdrawRPL(t *testing.T) { } // Reset rewards claim interval - if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } } diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index d1e1e0c21..b8f9885dd 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -1,23 +1,25 @@ package rewards import ( - "context" - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "context" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" ) func TestNodeRewards(t *testing.T) { + var secondsPerBlock uint64 = 12 + // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) @@ -26,8 +28,8 @@ func TestNodeRewards(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check node claims enabled status if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { @@ -44,7 +46,7 @@ func TestNodeRewards(t *testing.T) { } // Mine blocks until node claims are possible - if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } // Get & check updated node claim possible status if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { @@ -80,7 +82,7 @@ func TestNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index d2fb0dd57..2b0910b07 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -1,21 +1,23 @@ package rewards import ( - "context" - "math/big" - "testing" + "context" + "math/big" + "testing" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) func TestTrustedNodeRewards(t *testing.T) { + var secondsPerBlock uint64 = 12 + // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) @@ -24,8 +26,8 @@ func TestTrustedNodeRewards(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check trusted node claims enabled status if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { @@ -68,7 +70,7 @@ func TestTrustedNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/settings/protocol/inflation_test.go b/tests/settings/protocol/inflation_test.go index d2fad6b0d..59fee7d33 100644 --- a/tests/settings/protocol/inflation_test.go +++ b/tests/settings/protocol/inflation_test.go @@ -1,16 +1,18 @@ package protocol import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) func TestInflationSettings(t *testing.T) { + var secondsPerBlock uint64 = 12 + // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) @@ -25,24 +27,24 @@ func TestInflationSettings(t *testing.T) { t.Error("Incorrect inflation interval rate value") } - // Set & get inflation interval blocks - var inflationIntervalBlocks uint64 = 1 - if _, err := protocol.BootstrapInflationIntervalBlocks(rp, inflationIntervalBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get inflation interval time + var inflationIntervalTime uint64 = 1 * secondsPerBlock + if _, err := protocol.BootstrapInflationIntervalTime(rp, inflationIntervalTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := protocol.GetInflationIntervalBlocks(rp, nil); err != nil { + } else if value, err := protocol.GetInflationIntervalTime(rp, nil); err != nil { t.Error(err) - } else if value != inflationIntervalBlocks { - t.Error("Incorrect inflation interval blocks value") + } else if value != inflationIntervalTime { + t.Error("Incorrect inflation interval time value") } // Set & get inflation start block - var inflationStartBlock uint64 = 1000000 - if _, err := protocol.BootstrapInflationStartBlock(rp, inflationStartBlock, ownerAccount.GetTransactor()); err != nil { + var inflationStartTime uint64 = 1000000 * secondsPerBlock + if _, err := protocol.BootstrapInflationStartTime(rp, inflationStartTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := protocol.GetInflationStartBlock(rp, nil); err != nil { + } else if value, err := protocol.GetInflationStartTime(rp, nil); err != nil { t.Error(err) - } else if value != inflationStartBlock { - t.Error("Incorrect inflation start block value") + } else if value != inflationStartTime { + t.Error("Incorrect inflation start time value") } } diff --git a/tests/settings/protocol/rewards_test.go b/tests/settings/protocol/rewards_test.go index 2260c4dfc..2f3a8293a 100644 --- a/tests/settings/protocol/rewards_test.go +++ b/tests/settings/protocol/rewards_test.go @@ -1,12 +1,12 @@ package protocol import ( - "testing" + "testing" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - protocolsettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" + protocolsettings "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -26,10 +26,10 @@ func TestRewardsSettings(t *testing.T) { } else if value != claimerPerc { t.Errorf("Incorrect rewards claimer percent %f", value) } - if value, err := protocolsettings.GetRewardsClaimerPercBlockUpdated(rp, "rocketClaimNode", nil); err != nil { + if value, err := protocolsettings.GetRewardsClaimerPercTimeUpdated(rp, "rocketClaimNode", nil); err != nil { t.Error(err) } else if value == 0 { - t.Errorf("Incorrect rewards claimer percent block updated %d", value) + t.Errorf("Incorrect rewards claimer percent time updated %d", value) } if value, err := protocolsettings.GetRewardsClaimersPercTotal(rp, nil); err != nil { t.Error(err) @@ -38,14 +38,14 @@ func TestRewardsSettings(t *testing.T) { } } - // Set & get rewards claim interval blocks - var rewardsClaimIntervalBlocks uint64 = 1 - if _, err := protocolsettings.BootstrapRewardsClaimIntervalBlocks(rp, rewardsClaimIntervalBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get rewards claim interval time + var rewardsClaimIntervalTime uint64 = 1 + if _, err := protocolsettings.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := protocolsettings.GetRewardsClaimIntervalBlocks(rp, nil); err != nil { + } else if value, err := protocolsettings.GetRewardsClaimIntervalTime(rp, nil); err != nil { t.Error(err) - } else if value != rewardsClaimIntervalBlocks { - t.Error("Incorrect rewards claim interval blocks value") + } else if value != rewardsClaimIntervalTime { + t.Error("Incorrect rewards claim interval time value") } } diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index c88a8acb8..9b2445caa 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -1,17 +1,17 @@ package tokens import ( - "context" - "testing" + "context" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -111,17 +111,19 @@ func TestTransferFromRPL(t *testing.T) { func TestMintInflationRPL(t *testing.T) { + var secondsPerBlock uint64 = 12 + // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set network parameters - if _, err := protocol.BootstrapInflationIntervalBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartBlock(rp, header.Number.Uint64() + 2, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } From a6a1634d9d2d71991a27613e0d798454cff2dae0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 13 May 2021 00:56:45 -0400 Subject: [PATCH 339/878] Added time advancing to the unit tests --- tests/rewards/node_test.go | 4 +++- tests/rewards/trusted_node_test.go | 2 ++ tests/testutils/evm/mining.go | 21 ++++++++++++++++++--- tests/tokens/rpl_test.go | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index b8f9885dd..1ab1c2e46 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -46,7 +46,8 @@ func TestNodeRewards(t *testing.T) { } // Mine blocks until node claims are possible - if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(5 * secondsPerBlock); err != nil { t.Fatal(err) } // Get & check updated node claim possible status if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { @@ -88,6 +89,7 @@ func TestNodeRewards(t *testing.T) { // Mine blocks until rewards are available if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } // Get & check updated node claim rewards amount if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index 2b0910b07..be087792d 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -45,6 +45,7 @@ func TestTrustedNodeRewards(t *testing.T) { // Mine blocks until trusted node claims are possible if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(5 * secondsPerBlock); err != nil { t.Fatal(err) } // Get & check updated trusted node claim possible status if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { @@ -76,6 +77,7 @@ func TestTrustedNodeRewards(t *testing.T) { // Mine blocks until rewards are available if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } // Get & check updated trusted node claim rewards amount if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { diff --git a/tests/testutils/evm/mining.go b/tests/testutils/evm/mining.go index 78a72c596..e205482e3 100644 --- a/tests/testutils/evm/mining.go +++ b/tests/testutils/evm/mining.go @@ -1,12 +1,11 @@ package evm import ( - "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/rpc" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) - // Mine a number of blocks func MineBlocks(numBlocks int) error { @@ -24,3 +23,19 @@ func MineBlocks(numBlocks int) error { } + +// Fast forward to some number of seconds +func IncreaseTime(time uint64) error { + + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { return err } + + // Make RPC calls + if err := client.Call(nil, "evm_increaseTime", time); err != nil { return err } + + // Return + return nil + +} + diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index 9b2445caa..c397558d7 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -129,6 +129,7 @@ func TestMintInflationRPL(t *testing.T) { // Mine blocks until rewards are available if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } // Get initial total supply rplTotalSupply1, err := tokens.GetRPLTotalSupply(rp, nil) From a8a504f52a58160a658930f3051d6fe23544bd09 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Mon, 17 May 2021 16:55:26 +1000 Subject: [PATCH 340/878] Fix time-based tests and speed up block-based delays --- settings/protocol/inflation.go | 17 -------- tests/dao/proposals_test.go | 1 + tests/dao/trustednode/proposals_test.go | 4 ++ tests/rewards/node_test.go | 43 ++++++++++---------- tests/rewards/trusted_node_test.go | 38 ++++++++--------- tests/settings/protocol/inflation_test.go | 17 ++------ tests/settings/trustednode/members_test.go | 1 + tests/settings/trustednode/proposals_test.go | 1 + tests/testutils/evm/mining.go | 1 + tests/tokens/rpl_test.go | 31 ++++++-------- 10 files changed, 62 insertions(+), 92 deletions(-) diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index abf019019..9687e7b08 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -34,23 +34,6 @@ func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, op } -// RPL inflation interval time -func GetInflationIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - inflationSettingsContract, err := getInflationSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get inflation interval: %w", err) - } - return (*value).Uint64(), nil -} -func BootstrapInflationIntervalTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.time", big.NewInt(int64(value)), opts) -} - - // RPL inflation start time func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { inflationSettingsContract, err := getInflationSettingsContract(rp) diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 5c7a1a858..543ae028d 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -27,6 +27,7 @@ func TestProposalDetails(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index dd4012bb1..1a41e38a1 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -29,6 +29,7 @@ func TestProposeInviteMember(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -87,6 +88,7 @@ func TestProposeMemberLeave(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } @@ -149,6 +151,7 @@ func TestProposeKickMember(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } @@ -193,6 +196,7 @@ func TestProposeUpgradeContract(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 1ab1c2e46..1025d2080 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -1,35 +1,34 @@ package rewards import ( - "context" - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "context" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "math/big" + "testing" ) func TestNodeRewards(t *testing.T) { - var secondsPerBlock uint64 = 12 - // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Constants + oneDay := uint64(24 * 60 * 60) + rewardInterval := oneDay + // Register node if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardInterval, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check node claims enabled status if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { @@ -45,9 +44,8 @@ func TestNodeRewards(t *testing.T) { t.Error("Incorrect initial node claim possible status") } - // Mine blocks until node claims are possible - if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(5 * secondsPerBlock); err != nil { t.Fatal(err) } + // Increase time until node claims are possible + if err := evm.IncreaseTime(rewardInterval); err != nil { t.Fatal(err) } // Get & check updated node claim possible status if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { @@ -83,13 +81,14 @@ func TestNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + oneDay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mine blocks until rewards are available - if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(oneDay + oneDay); err != nil { + t.Fatal(err) + } // Get & check updated node claim rewards amount if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index be087792d..210de3ea1 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -1,33 +1,33 @@ package rewards import ( - "context" - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "context" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) func TestTrustedNodeRewards(t *testing.T) { - var secondsPerBlock uint64 = 12 - // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Constants + oneDay := uint64(24 * 60 * 60) + rewardInterval := oneDay + // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardInterval, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check trusted node claims enabled status if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { @@ -43,9 +43,8 @@ func TestTrustedNodeRewards(t *testing.T) { t.Error("Incorrect initial trusted node claim possible status") } - // Mine blocks until trusted node claims are possible - if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(5 * secondsPerBlock); err != nil { t.Fatal(err) } + // Increase time until node claims are possible + if err := evm.IncreaseTime(rewardInterval); err != nil { t.Fatal(err) } // Get & check updated trusted node claim possible status if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { @@ -71,13 +70,12 @@ func TestTrustedNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + oneDay, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mine blocks until rewards are available - if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(oneDay + oneDay); err != nil { t.Fatal(err) } // Get & check updated trusted node claim rewards amount if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { diff --git a/tests/settings/protocol/inflation_test.go b/tests/settings/protocol/inflation_test.go index 59fee7d33..df30e8b0e 100644 --- a/tests/settings/protocol/inflation_test.go +++ b/tests/settings/protocol/inflation_test.go @@ -2,8 +2,9 @@ package protocol import ( "testing" + "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -11,8 +12,6 @@ import ( func TestInflationSettings(t *testing.T) { - var secondsPerBlock uint64 = 12 - // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) @@ -27,18 +26,8 @@ func TestInflationSettings(t *testing.T) { t.Error("Incorrect inflation interval rate value") } - // Set & get inflation interval time - var inflationIntervalTime uint64 = 1 * secondsPerBlock - if _, err := protocol.BootstrapInflationIntervalTime(rp, inflationIntervalTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetInflationIntervalTime(rp, nil); err != nil { - t.Error(err) - } else if value != inflationIntervalTime { - t.Error("Incorrect inflation interval time value") - } - // Set & get inflation start block - var inflationStartTime uint64 = 1000000 * secondsPerBlock + inflationStartTime := uint64(time.Now().Unix()) + 3600 if _, err := protocol.BootstrapInflationStartTime(rp, inflationStartTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetInflationStartTime(rp, nil); err != nil { diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 77c5dd147..8dbde2e01 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -60,6 +60,7 @@ func TestProposeMembersSettings(t *testing.T) { // Set proposal cooldown if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 55a526d00..2f518ad0a 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -79,6 +79,7 @@ func TestProposeProposalsSettings(t *testing.T) { // Set proposal cooldown if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/testutils/evm/mining.go b/tests/testutils/evm/mining.go index e205482e3..998d5fd5b 100644 --- a/tests/testutils/evm/mining.go +++ b/tests/testutils/evm/mining.go @@ -33,6 +33,7 @@ func IncreaseTime(time uint64) error { // Make RPC calls if err := client.Call(nil, "evm_increaseTime", time); err != nil { return err } + if err := MineBlocks(1); err != nil { return err } // Return return nil diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index c397558d7..390edb877 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -1,17 +1,17 @@ package tokens import ( - "context" - "testing" + "testing" + "time" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -111,25 +111,18 @@ func TestTransferFromRPL(t *testing.T) { func TestMintInflationRPL(t *testing.T) { - var secondsPerBlock uint64 = 12 - // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - // Set network parameters - if _, err := protocol.BootstrapInflationIntervalTime(rp, 5 * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Constants + oneDay := uint64(24 * 60 * 60) // Start RPL inflation - if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { - t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, (header.Number.Uint64() + 2) * secondsPerBlock, ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } + if _, err := protocol.BootstrapInflationStartTime(rp, uint64(time.Now().Unix() + 3600), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mine blocks until rewards are available - if err := evm.MineBlocks(10); err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(10 * secondsPerBlock); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(3600 + oneDay); err != nil { t.Fatal(err) } // Get initial total supply rplTotalSupply1, err := tokens.GetRPLTotalSupply(rp, nil) From 479d5c1a0c5fe4fb3db7661d03a4c0dfc51feffd Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Wed, 19 May 2021 00:33:24 +0000 Subject: [PATCH 341/878] Set up CI with Azure Pipelines --- azure-pipelines.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..7bdd04d2f --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,35 @@ +# Go +# Build your Go project. +# Add steps that test, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/go + +trigger: + branches: + include: + - '*' + - refs/tags/* + +pool: + vmImage: ubuntu-latest + +- task: DownloadSecureFile@1 + name: githubPEM + displayName: 'Download Github PEM' + inputs: + secureFile: 'rp-azure-pipeline-github.pem' +- bash: | + eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") + TOKEN=$(curl -s -X POST \ + -H "Authorization: Bearer $PUSH_JWT" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ + | jq -r '.token') + git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME + git fetch github + git push github HEAD:$(Build.SourceBranch) --verbose + git push github HEAD:$(Build.SourceBranch) --tags --verbose + displayName: 'Push to Github' + env: + GITHUB_PEM_PATH: $(githubPEM.secureFilePath) + GITHUB_APP_ID: $(GITHUB_APP_ID) + GITHUB_APP_INSTALLATION_ID: $(GITHUB_APP_INSTALLATION_ID) From c8179ce8d45efc49198df0c458a301ec2768e5c8 Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Wed, 19 May 2021 02:31:23 +0000 Subject: [PATCH 342/878] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7bdd04d2f..a3e472b42 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,6 +12,7 @@ trigger: pool: vmImage: ubuntu-latest +steps: - task: DownloadSecureFile@1 name: githubPEM displayName: 'Download Github PEM' From 6962e1597d9dba6658d57354d051933580134d99 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 21 May 2021 00:03:55 -0400 Subject: [PATCH 343/878] Updated the go lib to reflect the smart contract changes --- network/prices.go | 26 ++++++++++++++++++++------ node/staking.go | 14 ++++++++++++++ tests/auction/auction_test.go | 26 +++++++++++++------------- tests/network/prices_test.go | 13 +++++++------ 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/network/prices.go b/network/prices.go index 25d2a26b8..45f08bb49 100644 --- a/network/prices.go +++ b/network/prices.go @@ -39,23 +39,23 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } -// Estimate the gas of Deposit -func EstimateDepositGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +// Estimate the gas of SubmitPrices +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, effectiveRplStake *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) } -// Submit network prices for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +// Submit network prices and total effective RPL stake for an epoch +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRplStake *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) } @@ -63,6 +63,20 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, op } +// Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus +func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return false, err + } + isInConsensus := new(bool) + if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { + return false, fmt.Errorf("Could not get consensus status: %w", err) + } + return *isInConsensus, nil +} + + // Get contracts var rocketNetworkPricesLock sync.Mutex func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/node/staking.go b/node/staking.go index f6713fcb2..eec159024 100644 --- a/node/staking.go +++ b/node/staking.go @@ -157,6 +157,20 @@ func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Trans } +// Calculate total effective RPL stake +func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, rplPrice *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { + return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil +} + + // Get contracts var rocketNodeStakingLock sync.Mutex func getRocketNodeStaking(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index b82a87ab6..9c6b5d6da 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -1,18 +1,18 @@ package auction import ( - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -98,7 +98,7 @@ func TestLotDetails(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Set network parameters - if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/network/prices_test.go b/tests/network/prices_test.go index 94832e358..03342d3a8 100644 --- a/tests/network/prices_test.go +++ b/tests/network/prices_test.go @@ -1,13 +1,13 @@ package network import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -23,7 +23,8 @@ func TestSubmitPrices(t *testing.T) { // Submit prices var pricesBlock uint64 = 100 rplPrice := eth.EthToWei(1000) - if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, trustedNodeAccount.GetTransactor()); err != nil { + effectiveRplStake := eth.EthToWei(24000) + if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, effectiveRplStake, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } From db986850041912ed799c8226349e42a418a66112 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 24 May 2021 16:05:11 -0400 Subject: [PATCH 344/878] Fixed a typo --- network/prices.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/network/prices.go b/network/prices.go index 25d2a26b8..a6d413e5f 100644 --- a/network/prices.go +++ b/network/prices.go @@ -39,8 +39,8 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } -// Estimate the gas of Deposit -func EstimateDepositGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +// Estimate the gas of SubmitPrices +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return rocketpool.GasInfo{}, err From 6e725010c976257eebf41ac21e32c51c6ecbe2b3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 25 May 2021 22:55:35 -0400 Subject: [PATCH 345/878] Added timezone validation --- node/node.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/node/node.go b/node/node.go index 4e033bc97..a49c281bf 100644 --- a/node/node.go +++ b/node/node.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -300,6 +301,10 @@ func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation if err != nil { return rocketpool.GasInfo{}, err } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not parse timezone [%s]: %w", timezoneLocation, err) + } return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) } @@ -310,6 +315,10 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt if err != nil { return common.Hash{}, err } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not parse timezone [%s]: %w", timezoneLocation, err) + } hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) From 590a6d003f7633732233dff86757950aed173bc9 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 2 Jun 2021 16:11:08 +1000 Subject: [PATCH 346/878] Handle or ignore unhandled errors --- rocketpool/abi.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rocketpool/abi.go b/rocketpool/abi.go index fd25405f1..d9456ee78 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -5,7 +5,6 @@ import ( "compress/zlib" "encoding/base64" "fmt" - "github.com/ethereum/go-ethereum/accounts/abi" ) @@ -25,7 +24,9 @@ func DecodeAbi(abiEncoded string) (*abi.ABI, error) { if err != nil { return nil, fmt.Errorf("Could not decompress zlib data: %w", err) } - defer zlibReader.Close() + defer func() { + _ = zlibReader.Close() + }() // Parse ABI abiParsed, err := abi.JSON(zlibReader) @@ -45,13 +46,15 @@ func EncodeAbiStr(abiStr string) (string, error) { // zlib compress var abiCompressed bytes.Buffer zlibWriter := zlib.NewWriter(&abiCompressed) - defer zlibWriter.Close() if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) } if err := zlibWriter.Flush(); err != nil { return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) } + if err := zlibWriter.Close(); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } // base64 encode & return return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()), nil From c636b2be75e5f6ae1d57a6a5816514a801f7b5fc Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Wed, 2 Jun 2021 06:19:05 +0000 Subject: [PATCH 347/878] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a3e472b42..6d44bed00 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -28,7 +28,7 @@ steps: git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME git fetch github git push github HEAD:$(Build.SourceBranch) --verbose - git push github HEAD:$(Build.SourceBranch) --tags --verbose + git push github HEAD:$(Build.SourceBranch) --tags -f --verbose displayName: 'Push to Github' env: GITHUB_PEM_PATH: $(githubPEM.secureFilePath) From 1344918670dde7d027b53637d2cf57380777435c Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Wed, 2 Jun 2021 06:22:05 +0000 Subject: [PATCH 348/878] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6d44bed00..a3e472b42 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -28,7 +28,7 @@ steps: git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME git fetch github git push github HEAD:$(Build.SourceBranch) --verbose - git push github HEAD:$(Build.SourceBranch) --tags -f --verbose + git push github HEAD:$(Build.SourceBranch) --tags --verbose displayName: 'Push to Github' env: GITHUB_PEM_PATH: $(githubPEM.secureFilePath) From b81ac68f19493c850a6af3b36313d61456e9b0df Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 7 Jun 2021 23:37:37 -0400 Subject: [PATCH 349/878] Changed emails to arbitrary strings, fixed a bunch of unit tests --- dao/trustednode/dao.go | 37 ++++++-------- dao/trustednode/proposals.go | 38 +++++---------- tests/auction/auction_test.go | 14 ++++-- tests/auction/main_test.go | 26 ++++++---- tests/dao/main_test.go | 28 ++++++----- tests/dao/proposals_test.go | 51 +++++++++++--------- tests/dao/trustednode/dao_test.go | 38 ++++++++++----- tests/dao/trustednode/proposals_test.go | 41 +++++++++------- tests/settings/trustednode/main_test.go | 26 ++++++---- tests/settings/trustednode/members_test.go | 42 ++++++++-------- tests/settings/trustednode/proposals_test.go | 36 +++++++------- tests/testutils/auction/auction.go | 20 ++++---- 12 files changed, 212 insertions(+), 185 deletions(-) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 7baf06e4a..49b4f926f 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -3,7 +3,6 @@ package trustednode import ( "fmt" "math/big" - "net/mail" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -26,7 +25,7 @@ type MemberDetails struct { Address common.Address `json:"address"` Exists bool `json:"exists"` ID string `json:"id"` - Email string `json:"email"` + Url string `json:"url"` JoinedBlock uint64 `json:"joinedBlock"` LastProposalBlock uint64 `json:"lastProposalBlock"` RPLBondAmount *big.Int `json:"rplBondAmount"` @@ -122,7 +121,7 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o var wg errgroup.Group var exists bool var id string - var email string + var url string var joinedBlock uint64 var lastProposalBlock uint64 var rplBondAmount *big.Int @@ -141,7 +140,7 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o }) wg.Go(func() error { var err error - email, err = GetMemberEmail(rp, memberAddress, opts) + url, err = GetMemberUrl(rp, memberAddress, opts) return err }) wg.Go(func() error { @@ -175,7 +174,7 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o Address: memberAddress, Exists: exists, ID: id, - Email: email, + Url: url, JoinedBlock: joinedBlock, LastProposalBlock: lastProposalBlock, RPLBondAmount: rplBondAmount, @@ -250,16 +249,16 @@ func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts * } return strings.Sanitize(*id), nil } -func GetMemberEmail(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { +func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return "", err } - email := new(string) - if err := rocketDAONodeTrusted.Call(opts, email, "getMemberEmail", memberAddress); err != nil { - return "", fmt.Errorf("Could not get trusted node DAO member %s email: %w", memberAddress.Hex(), err) + url := new(string) + if err := rocketDAONodeTrusted.Call(opts, url, "getMemberUrl", memberAddress); err != nil { + return "", fmt.Errorf("Could not get trusted node DAO member %s URL: %w", memberAddress.Hex(), err) } - return strings.Sanitize(*email), nil + return strings.Sanitize(*url), nil } func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -407,30 +406,24 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, // Estimate the gas of BootstrapMember -func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return rocketpool.GasInfo{}, err } - address, err := mail.ParseAddress(email) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, address.Address, nodeAddress) + url = strings.Sanitize(url) + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, url, nodeAddress) } // Bootstrap a DAO member -func BootstrapMember(rp *rocketpool.RocketPool, id, email string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func BootstrapMember(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return common.Hash{}, err } - address, err := mail.ParseAddress(email) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, address.Address, nodeAddress) + url = strings.Sanitize(url) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 16eed20fa..c6a98f2f6 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -3,7 +3,6 @@ package trustednode import ( "fmt" "math/big" - "net/mail" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -11,19 +10,17 @@ import ( "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) // Estimate the gas of ProposeInviteMember -func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return rocketpool.GasInfo{}, err } - emailAddress, err := mail.ParseAddress(newMemberEmail) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, emailAddress.Address, newMemberAddress) + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } @@ -32,16 +29,13 @@ func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, n // Submit a proposal to invite a new member to the trusted node DAO -func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return 0, common.Hash{}, err } - emailAddress, err := mail.ParseAddress(newMemberEmail) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, emailAddress.Address, newMemberAddress) + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) } @@ -78,16 +72,13 @@ func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress // Estimate the gas of ProposeReplaceMember -func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return rocketpool.GasInfo{}, err } - emailAddress, err := mail.ParseAddress(newMemberEmail) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, emailAddress.Address, newMemberAddress) + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } @@ -96,16 +87,13 @@ func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, // Submit a proposal to replace a member in the trusted node DAO -func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberEmail string, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) if err != nil { return 0, common.Hash{}, err } - emailAddress, err := mail.ParseAddress(newMemberEmail) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, emailAddress.Address, newMemberAddress) + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) } diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 9c6b5d6da..9160f45c9 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -23,7 +23,9 @@ func TestAuctionDetails(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Get & check initial RPL balances totalBalance1, err := auction.GetTotalRPLBalance(rp, nil) @@ -43,7 +45,7 @@ func TestAuctionDetails(t *testing.T) { } // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { + if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } @@ -95,17 +97,19 @@ func TestLotDetails(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Set network parameters - if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotDuration(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount, userAccount1); err != nil { t.Fatal(err) } + if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } // Get & check initial lot details if lots, err := auction.GetLots(rp, nil); err != nil { diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 3d2434f6f..3271afee6 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -1,17 +1,17 @@ package auction import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -20,7 +20,9 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account userAccount1 *accounts.Account userAccount2 *accounts.Account ) @@ -40,7 +42,11 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + trustedNodeAccount3, err = accounts.GetAccount(3) if err != nil { log.Fatal(err) } userAccount1, err = accounts.GetAccount(8) if err != nil { log.Fatal(err) } diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 8caa8c0f3..645450c99 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -1,17 +1,17 @@ package dao import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -20,7 +20,9 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account nodeAccount *accounts.Account ) @@ -39,9 +41,13 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount1, err = accounts.GetAccount(1) if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { log.Fatal(err) } + nodeAccount, err = accounts.GetAccount(4) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 543ae028d..29e5d5a3c 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -1,18 +1,18 @@ package dao import ( - "bytes" - "fmt" - "testing" - - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "bytes" + "fmt" + "testing" + + "github.com/rocket-pool/rocketpool-go/dao" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + rptypes "github.com/rocket-pool/rocketpool-go/types" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -31,7 +31,9 @@ func TestProposalDetails(t *testing.T) { // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Get & check initial proposal details if proposals, err := dao.GetProposals(rp, nil); err != nil { @@ -39,7 +41,7 @@ func TestProposalDetails(t *testing.T) { } else if len(proposals) != 0 { t.Error("Incorrect initial proposal count") } - if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if len(proposals) != 0 { t.Error("Incorrect initial proposal count") @@ -49,7 +51,7 @@ func TestProposalDetails(t *testing.T) { } else if len(daoProposals) != 0 { t.Error("Incorrect initial DAO proposal count") } - if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if len(daoProposals) != 0 { t.Error("Incorrect initial DAO proposal count") @@ -60,7 +62,7 @@ func TestProposalDetails(t *testing.T) { proposalMemberAddress := nodeAccount.Address proposalMemberId := "coolguy" proposalMemberEmail := "coolguy@rocketpool.net" - proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount.GetTransactor()) + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } // Mine blocks until proposal voting delay has passed @@ -69,13 +71,14 @@ func TestProposalDetails(t *testing.T) { if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { t.Fatal(err) } // Vote on & execute proposal - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Submit invite member proposal & cancel it - cancelledProposalId, _, err := trustednodedao.ProposeInviteMember(rp, "cancel this", nodeAccount.Address, "cancel", "cancel@rocketpool.net", trustedNodeAccount.GetTransactor()) + cancelledProposalId, _, err := trustednodedao.ProposeInviteMember(rp, "cancel this", nodeAccount.Address, "cancel", "cancel@rocketpool.net", trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Get & check updated proposal details if proposals, err := dao.GetProposals(rp, nil); err != nil { @@ -85,7 +88,7 @@ func TestProposalDetails(t *testing.T) { } else if proposals[0].ID != proposalId || proposals[1].ID != cancelledProposalId { t.Error("Incorrect proposal indexes") } - if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount.Address, nil); err != nil { + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if len(proposals) != 2 { t.Error("Incorrect updated proposal count") @@ -99,7 +102,7 @@ func TestProposalDetails(t *testing.T) { if proposal.DAO != proposalDaoName { t.Errorf("Incorrect proposal DAO %s", proposal.DAO) } - if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount.Address.Bytes()) { + if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount1.Address.Bytes()) { t.Errorf("Incorrect proposal proposer address %s", proposal.ProposerAddress.Hex()) } if proposal.Message != proposalMessage { @@ -120,7 +123,7 @@ func TestProposalDetails(t *testing.T) { if proposal.VotesRequired == 0.0 { t.Errorf("Incorrect proposal required votes %f", proposal.VotesRequired) } - if proposal.VotesFor != 1.0 { + if proposal.VotesFor != 2.0 { t.Errorf("Incorrect proposal votes for %f", proposal.VotesFor) } if proposal.VotesAgainst != 0.0 { @@ -162,7 +165,7 @@ func TestProposalDetails(t *testing.T) { } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { t.Error("Incorrect DAO proposal indexes") } - if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount.Address, nil); err != nil { + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) } else if len(daoProposals) != 2 { t.Error("Incorrect updated DAO proposal count") diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index abf5554be..6a4a72ca9 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -1,19 +1,19 @@ package trustednode import ( - "bytes" - "math/big" - "testing" + "bytes" + "math/big" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -42,12 +42,16 @@ func TestMemberDetails(t *testing.T) { // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount3.GetTransactor()); err != nil { t.Fatal(err) } if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Bootstrap trusted node DAO member memberId := "coolguy" memberEmail := "coolguy@rocketpool.net" if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount1.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount2.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount3.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get RPL bond amount rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) @@ -55,9 +59,17 @@ func TestMemberDetails(t *testing.T) { // Mint trusted node RPL bond & join trusted node DAO if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } if _, err := trustednodedao.Join(rp, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodedao.Join(rp, trustedNodeAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.Join(rp, trustedNodeAccount3.GetTransactor()); err != nil { + t.Fatal(err) + } // Submit a proposal if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } @@ -68,7 +80,7 @@ func TestMemberDetails(t *testing.T) { // Get & check updated member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { t.Error(err) - } else if len(members) != 1 { + } else if len(members) != 3 { t.Error("Incorrect updated trusted node DAO member count") } else { member := members[0] @@ -81,8 +93,8 @@ func TestMemberDetails(t *testing.T) { if member.ID != memberId { t.Errorf("Incorrect member ID %s", member.ID) } - if member.Email != memberEmail { - t.Errorf("Incorrect member email %s", member.Email) + if member.Url != memberEmail { + t.Errorf("Incorrect member email %s", member.Url) } if member.JoinedBlock == 0 { t.Errorf("Incorrect member joined block %d", member.JoinedBlock) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 1a41e38a1..a258f23bd 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -1,23 +1,23 @@ package trustednode import ( - "bytes" - "fmt" - "testing" - - "github.com/ethereum/go-ethereum/common" - - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "bytes" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -34,6 +34,8 @@ func TestProposeInviteMember(t *testing.T) { // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Submit, pass & execute invite member proposal proposalMemberAddress := nodeAccount.Address @@ -41,7 +43,7 @@ func TestProposeInviteMember(t *testing.T) { proposalMemberEmail := "coolguy@rocketpool.net" proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1}); err != nil { t.Fatal(err) } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } // Get & check initial member exists status if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { @@ -156,6 +158,7 @@ func TestProposeKickMember(t *testing.T) { // Register nodes if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Get & check initial member exists status if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { @@ -200,6 +203,8 @@ func TestProposeUpgradeContract(t *testing.T) { // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Submit, pass & execute upgrade contract proposal proposalUpgradeType := "upgradeContract" diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index b76e2fa39..7f7d06d4e 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -1,17 +1,17 @@ package trustednode import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -20,7 +20,9 @@ var ( rp *rocketpool.RocketPool ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account ) @@ -38,7 +40,11 @@ func TestMain(m *testing.M) { // Initialize accounts ownerAccount, err = accounts.GetAccount(0) if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { log.Fatal(err) } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { log.Fatal(err) } + trustedNodeAccount3, err = accounts.GetAccount(3) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 8dbde2e01..07129707c 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -1,15 +1,15 @@ package trustednode import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -63,13 +63,15 @@ func TestProposeMembersSettings(t *testing.T) { if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Set & get quorum quorum := 0.1 - if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { t.Error(err) @@ -79,9 +81,9 @@ func TestProposeMembersSettings(t *testing.T) { // Set & get rpl bond rplBond := eth.EthToWei(1) - if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { t.Error(err) @@ -91,9 +93,9 @@ func TestProposeMembersSettings(t *testing.T) { // Set & get maximum unbonded minipools var minipoolUnbondedMax uint64 = 1 - if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { t.Error(err) @@ -103,9 +105,9 @@ func TestProposeMembersSettings(t *testing.T) { // Set & get member challenge cooldown period var memberChallengeCooldown uint64 = 1 - if proposalId, _, err := trustednode.ProposeChallengeCooldown(rp, memberChallengeCooldown, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeChallengeCooldown(rp, memberChallengeCooldown, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetChallengeCooldown(rp, nil); err != nil { t.Error(err) @@ -115,9 +117,9 @@ func TestProposeMembersSettings(t *testing.T) { // Set & get member challenge window period var memberChallengeWindow uint64 = 1 - if proposalId, _, err := trustednode.ProposeChallengeWindow(rp, memberChallengeWindow, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeChallengeWindow(rp, memberChallengeWindow, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetChallengeWindow(rp, nil); err != nil { t.Error(err) @@ -127,9 +129,9 @@ func TestProposeMembersSettings(t *testing.T) { // Set & get member challenge cost amount challengeCost := eth.EthToWei(1) - if proposalId, _, err := trustednode.ProposeChallengeCost(rp, challengeCost, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeChallengeCost(rp, challengeCost, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetChallengeCost(rp, nil); err != nil { t.Error(err) diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 2f518ad0a..bd33bc79d 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -1,14 +1,14 @@ package trustednode import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -82,13 +82,15 @@ func TestProposeProposalsSettings(t *testing.T) { if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } // Set & get cooldown var cooldown uint64 = 1 - if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { t.Error(err) @@ -98,9 +100,9 @@ func TestProposeProposalsSettings(t *testing.T) { // Set & get vote blocks var voteBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalVoteBlocks(rp, voteBlocks, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalVoteBlocks(rp, voteBlocks, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { t.Error(err) @@ -110,9 +112,9 @@ func TestProposeProposalsSettings(t *testing.T) { // Set & get execute blocks var executeBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalExecuteBlocks(rp, executeBlocks, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalExecuteBlocks(rp, executeBlocks, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { t.Error(err) @@ -122,9 +124,9 @@ func TestProposeProposalsSettings(t *testing.T) { // Set & get action blocks var actionBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalActionBlocks(rp, actionBlocks, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalActionBlocks(rp, actionBlocks, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { t.Error(err) @@ -134,9 +136,9 @@ func TestProposeProposalsSettings(t *testing.T) { // Set & get vote delay blocks var voteDelayBlocks uint64 = 1000 - if proposalId, _, err := trustednode.ProposeProposalVoteDelayBlocks(rp, voteDelayBlocks, trustedNodeAccount.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalVoteDelayBlocks(rp, voteDelayBlocks, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount}); err != nil { + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { t.Error(err) diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 831343fb5..20a4562ba 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -1,21 +1,20 @@ package auction import ( - "math/big" + "math/big" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - // Create an amount of slashed RPL in the auction contract -func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account, userAccount *accounts.Account) error { +func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount, trustedNodeAccount2 *accounts.Account, userAccount *accounts.Account) error { // Stake a large amount of RPL against the node if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { return err } @@ -34,6 +33,7 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, // Mark minipool as withdrawable with zero end balance if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), big.NewInt(0), trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), big.NewInt(0), trustedNodeAccount2.GetTransactor()); err != nil { return err } // Return return nil From 634e262a2cdee975c0235aec32c5b388ad84fb9c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 15 Jun 2021 20:40:03 -0400 Subject: [PATCH 350/878] Added GetLatestReportableBlock() --- network/prices.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/network/prices.go b/network/prices.go index 45f08bb49..340b950d0 100644 --- a/network/prices.go +++ b/network/prices.go @@ -77,6 +77,20 @@ func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { } +// Returns the latest block number that oracles should be reporting prices for +func GetLatestReportableBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil +} + + // Get contracts var rocketNetworkPricesLock sync.Mutex func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 4c4a70b122c6aa5baa653cbc8a5f7c539e99ab64 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 15 Jun 2021 20:57:29 -0400 Subject: [PATCH 351/878] Added GetLatestReportableBalancesBlock() --- network/balances.go | 14 ++++++++++++++ network/prices.go | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/network/balances.go b/network/balances.go index 6d08e357b..934436279 100644 --- a/network/balances.go +++ b/network/balances.go @@ -106,6 +106,20 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt } +// Returns the latest block number that oracles should be reporting balances for +func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil +} + + // Get contracts var rocketNetworkBalancesLock sync.Mutex func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/network/prices.go b/network/prices.go index 340b950d0..8a1c2e47f 100644 --- a/network/prices.go +++ b/network/prices.go @@ -78,7 +78,7 @@ func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { // Returns the latest block number that oracles should be reporting prices for -func GetLatestReportableBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return nil, err From d36b8294ca39d14693bc68f2d31b5684fff9e0d8 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 1 Jul 2021 21:09:01 -0400 Subject: [PATCH 352/878] Updated to geth 1.10.4 to handle EIP 1559 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2ee93e8c9..ff1e054a8 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.21.0-beta // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/ethereum/go-ethereum v1.10.0 + github.com/ethereum/go-ethereum v1.10.4 github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect github.com/minio/highwayhash v1.0.1 // indirect github.com/protolambda/zssz v0.1.5 // indirect From 88971314ef4eb2c5de15b17b25da6184bd8f15f7 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Jul 2021 22:20:48 -0400 Subject: [PATCH 353/878] Updated the go lib to match the new smart contracts --- contracts/rocket-storage.go | 2 +- go.mod | 6 +- go.sum | 94 ++++++++++++++ minipool/minipool-contract.go | 135 ++++++++++++++++++-- minipool/status.go | 8 +- node/node.go | 65 +--------- rocketpool/rocketpool.go | 31 +++-- storage/rocket-storage.go | 50 ++++++++ tests/minipool/contract_test.go | 191 +++++++++++++++++++++++++---- tests/minipool/minipool_test.go | 20 +-- tests/minipool/status_test.go | 16 +-- tests/node/node_test.go | 21 ++-- tests/testutils/auction/auction.go | 4 +- 13 files changed, 503 insertions(+), 140 deletions(-) create mode 100644 storage/rocket-storage.go diff --git a/contracts/rocket-storage.go b/contracts/rocket-storage.go index d2a48fdfd..174c7a8a5 100644 --- a/contracts/rocket-storage.go +++ b/contracts/rocket-storage.go @@ -27,7 +27,7 @@ var ( ) // RocketStorageABI is the input ABI used to generate the binding from. -const RocketStorageABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getInt\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getBytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_value\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_value\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"int256\",\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"setInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteString\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"deleteBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" +const RocketStorageABI = "[{\"inputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"constructor\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": false,\"internalType\": \"address\",\"name\": \"oldGuardian\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"address\",\"name\": \"newGuardian\",\"type\": \"address\"}],\"name\": \"GuardianChanged\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"node\",\"type\": \"address\"},{\"indexed\": true,\"internalType\": \"address\",\"name\": \"withdrawalAddress\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"uint256\",\"name\": \"time\",\"type\": \"uint256\"}],\"name\": \"NodeWithdrawalAddressSet\",\"type\": \"event\"},{\"inputs\": [],\"name\": \"getGuardian\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"\",\"type\": \"address\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"_newAddress\",\"type\": \"address\"}],\"name\": \"setGuardian\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [],\"name\": \"confirmGuardian\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [],\"name\": \"getDeployedStatus\",\"outputs\": [{\"internalType\": \"bool\",\"name\": \"\",\"type\": \"bool\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [],\"name\": \"setDeployedStatus\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"_nodeAddress\",\"type\": \"address\"}],\"name\": \"getNodeWithdrawalAddress\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"\",\"type\": \"address\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"_nodeAddress\",\"type\": \"address\"}],\"name\": \"getNodePendingWithdrawalAddress\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"\",\"type\": \"address\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"_nodeAddress\",\"type\": \"address\"},{\"internalType\": \"address\",\"name\": \"_newWithdrawalAddress\",\"type\": \"address\"},{\"internalType\": \"bool\",\"name\": \"_confirm\",\"type\": \"bool\"}],\"name\": \"setWithdrawalAddress\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"_nodeAddress\",\"type\": \"address\"}],\"name\": \"confirmWithdrawalAddress\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getAddress\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"r\",\"type\": \"address\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getUint\",\"outputs\": [{\"internalType\": \"uint256\",\"name\": \"r\",\"type\": \"uint256\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getString\",\"outputs\": [{\"internalType\": \"string\",\"name\": \"\",\"type\": \"string\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getBytes\",\"outputs\": [{\"internalType\": \"bytes\",\"name\": \"\",\"type\": \"bytes\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getBool\",\"outputs\": [{\"internalType\": \"bool\",\"name\": \"r\",\"type\": \"bool\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getInt\",\"outputs\": [{\"internalType\": \"int256\",\"name\": \"r\",\"type\": \"int256\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"getBytes32\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"r\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\",\"constant\": true},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"address\",\"name\": \"_value\",\"type\": \"address\"}],\"name\": \"setAddress\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"uint256\",\"name\": \"_value\",\"type\": \"uint256\"}],\"name\": \"setUint\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"string\",\"name\": \"_value\",\"type\": \"string\"}],\"name\": \"setString\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"_value\",\"type\": \"bytes\"}],\"name\": \"setBytes\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"bool\",\"name\": \"_value\",\"type\": \"bool\"}],\"name\": \"setBool\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"int256\",\"name\": \"_value\",\"type\": \"int256\"}],\"name\": \"setInt\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"_value\",\"type\": \"bytes32\"}],\"name\": \"setBytes32\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteAddress\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteUint\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteString\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteBytes\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteBool\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteInt\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"}],\"name\": \"deleteBytes32\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"uint256\",\"name\": \"_amount\",\"type\": \"uint256\"}],\"name\": \"addUint\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes32\",\"name\": \"_key\",\"type\": \"bytes32\"},{\"internalType\": \"uint256\",\"name\": \"_amount\",\"type\": \"uint256\"}],\"name\": \"subUint\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"}]\r\n" // RocketStorage is an auto generated Go binding around an Ethereum contract. type RocketStorage struct { diff --git a/go.mod b/go.mod index 2ee93e8c9..ad0d350e1 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,11 @@ go 1.13 require ( github.com/btcsuite/btcd v0.21.0-beta // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/ethereum/go-ethereum v1.10.0 + github.com/ethereum/go-ethereum v1.10.4 github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect github.com/minio/highwayhash v1.0.1 // indirect github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 - golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect - golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a - golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c ) diff --git a/go.sum b/go.sum index b536a64d1..c14266da4 100644 --- a/go.sum +++ b/go.sum @@ -35,14 +35,18 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= @@ -52,6 +56,15 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -75,6 +88,7 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -85,7 +99,10 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/consensys/bavard v0.1.8-0.20210105233146-c16790d2aa8b/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/consensys/goff v0.3.10/go.mod h1:xTldOBEHmFiYS0gPXd3NsaEqZWlnmeWcRLWgD3ba3xc= github.com/consensys/gurvy v0.3.8/go.mod h1:sN75xnsiD593XnhbhvG2PkOy194pZBzqShWF/kwuW/g= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -107,6 +124,7 @@ github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDz github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= @@ -126,14 +144,18 @@ github.com/ethereum/go-ethereum v1.9.15/go.mod h1:slT8bPPRhXsyNTwHQxrOnjuTZ1sDXR github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/ethereum/go-ethereum v1.10.0 h1:EBZuZYjk1DHboBJb2YkBN8xItELRY6mtZEiYJKuH0+M= github.com/ethereum/go-ethereum v1.10.0/go.mod h1:E5e/zvdfUVr91JZ0AwjyuJM3x+no51zZJRz61orLLSk= +github.com/ethereum/go-ethereum v1.10.4 h1:JPZPL2MHbegfFStcaOrrggMVIcf57OQHQ0J3UhjQ+xQ= +github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 h1:9VDpsWq096+oGMDTT/SgBD/VgZYf4pTF+KTPmZ+OaKM= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= @@ -142,8 +164,10 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= @@ -181,6 +205,8 @@ github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -188,6 +214,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -236,11 +265,15 @@ github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031 h1:HarGZ5h9HD9LgEg1yRVMXyfiw4wlXiLiYM2oMjeA/SE= github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= +github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88 h1:bcAj8KroPf552TScjFPIakjH2/tdIrIH8F+cc4v4SRo= +github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -259,6 +292,8 @@ github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1C github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -282,9 +317,12 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM52 github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= @@ -292,15 +330,19 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -325,18 +367,23 @@ github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -354,7 +401,10 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -386,6 +436,7 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -398,11 +449,14 @@ github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible h1 github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.20.5+incompatible h1:tYH07UPoQt0OCQdgWWMgYHy3/a9bcxNpBIysykNIP7I= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -424,22 +478,31 @@ github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= +github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -465,6 +528,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -494,6 +559,8 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -520,6 +587,10 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -534,6 +605,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -562,21 +636,33 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b h1:ggRgirZABFolTmi3sn6Ivd9SipZwLedQ5wR0aAKnFxU= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -606,9 +692,11 @@ golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -656,6 +744,7 @@ google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyz google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -664,15 +753,19 @@ gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHN gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200603215123-a4a8cb9d2cbc/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -680,5 +773,6 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 46b3097d5..4982b15c0 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -363,20 +363,33 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { } -// Estimate the gas of Payout -func (mp *Minipool) EstimatePayoutGas(confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "payout", confirm) +// Estimate the gas of ProcessWithdrawal +func (mp *Minipool) EstimateProcessWithdrawalGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "processWithdrawal") } -// Payout withdrawn ETH -func (mp *Minipool) Payout(confirm bool, opts *bind.TransactOpts) (common.Hash, error) { - if !confirm { - return common.Hash{}, fmt.Errorf("Could not payout minipool %s: confirmation flag must be set to true", mp.Address.Hex()) +// Process an ETH withdrawal +func (mp *Minipool) ProcessWithdrawal(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "processWithdrawal") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) } - hash, err := mp.Contract.Transact(opts, "payout", confirm) + return hash, nil +} + + +// Estimate the gas of ProcessWithdrawalAndDestroy +func (mp *Minipool) EstimateProcessWithdrawalAndDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "processWithdrawal") +} + + +// Process an ETH withdrawal and destroy the minipool +func (mp *Minipool) ProcessWithdrawalAndDestroy(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "processWithdrawalAndDestroy") if err != nil { - return common.Hash{}, fmt.Errorf("Could not payout minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not process withdrawal for and destroy minipool %s: %w", mp.Address.Hex(), err) } return hash, nil } @@ -446,6 +459,110 @@ func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { } +// Estimate the gas of Destroy +func (mp *Minipool) EstimateDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "destroy") +} + + +// Destroy a minipool to get the RPL stake back +func (mp *Minipool) Destroy(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "destroy") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not destroy minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil +} + + +// Estimate the gas of DelegateUpgrade +func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") +} + + +// Upgrade this minipool to the latest network delegate contract +func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "delegateUpgrade") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil +} + + +// Estimate the gas of DelegateRollback +func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") +} + + +// Rollback to previous delegate contract +func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "delegateRollback") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil +} + + +// Estimate the gas of SetUseLatestDelegate +func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) +} + + +// If set to true, will automatically use the latest delegate contract +func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil +} + + +// Getter for useLatestDelegate setting +func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { + setting := new(bool) + if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { + return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *setting, nil +} + + +// Returns the address of the minipool's stored delegate +func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + + +// Returns the address of the minipool's previous delegate (or address(0) if not set) +func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + + +// Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting +func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + + // Get a minipool contract var rocketMinipoolLock sync.Mutex func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { diff --git a/minipool/status.go b/minipool/status.go index c654a1667..08bc410c7 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -27,22 +27,22 @@ func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, use // Estimate the gas of SubmitMinipoolWithdrawable -func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketMinipoolStatus.GetTransactionGasInfo(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) + return rocketMinipoolStatus.GetTransactionGasInfo(opts, "submitMinipoolWithdrawable", minipoolAddress) } // Submit a minipool withdrawable event -func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, stakingStartBalance, stakingEndBalance *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress, stakingStartBalance, stakingEndBalance) + hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } diff --git a/node/node.go b/node/node.go index a49c281bf..5026bb3e8 100644 --- a/node/node.go +++ b/node/node.go @@ -11,6 +11,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" "github.com/rocket-pool/rocketpool-go/utils/strings" ) @@ -128,7 +129,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts }) wg.Go(func() error { var err error - withdrawalAddress, err = GetNodeWithdrawalAddress(rp, nodeAddress, opts) + withdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) return err }) wg.Go(func() error { @@ -195,20 +196,6 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * } -// Get a node's withdrawal address -func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Address{}, err - } - withdrawalAddress := new(common.Address) - if err := rocketNodeManager.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) - } - return *withdrawalAddress, nil -} - - // Get a node's timezone location func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { rocketNodeManager, err := getRocketNodeManager(rp) @@ -247,54 +234,6 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } -// Estimate the gas of SetWithdrawalAddress -func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNodeManager.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) -} - - -// Set a node's withdrawal address -func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNodeManager.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) - } - return hash, nil -} - - -// Estimate the gas of ConfirmWithdrawalAddress -func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNodeManager.GetTransactionGasInfo(opts, "confirmWithdrawalAddress", nodeAddress) -} - - -// Set a node's withdrawal address -func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNodeManager.Transact(opts, "confirmWithdrawalAddress", nodeAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) - } - return hash, nil -} - - // Estimate the gas of SetTimezoneLocation func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeManager, err := getRocketNodeManager(rp) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 5e0aad125..589c1a0b4 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -2,6 +2,7 @@ package rocketpool import ( "fmt" + "strings" "sync" "time" @@ -36,14 +37,15 @@ type cachedContract struct { // Rocket Pool contract manager type RocketPool struct { - Client *ethclient.Client - RocketStorage *contracts.RocketStorage - addresses map[string]cachedAddress - abis map[string]cachedABI - contracts map[string]cachedContract - addressesLock sync.RWMutex - abisLock sync.RWMutex - contractsLock sync.RWMutex + Client *ethclient.Client + RocketStorage *contracts.RocketStorage + RocketStorageContract *Contract + addresses map[string]cachedAddress + abis map[string]cachedABI + contracts map[string]cachedContract + addressesLock sync.RWMutex + abisLock sync.RWMutex + contractsLock sync.RWMutex } @@ -56,10 +58,23 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) } + // Create a Contract for it + rsAbi, err := abi.JSON(strings.NewReader(contracts.RocketStorageABI)) + if err != nil { + return nil, err + } + contract := &Contract{ + Contract: bind.NewBoundContract(rocketStorageAddress, rsAbi, client, client, client), + Address: &rocketStorageAddress, + ABI: &rsAbi, + Client: client, + } + // Create and return return &RocketPool{ Client: client, RocketStorage: rocketStorage, + RocketStorageContract: contract, addresses: make(map[string]cachedAddress), abis: make(map[string]cachedABI), contracts: make(map[string]cachedContract), diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go new file mode 100644 index 000000000..6de3129b0 --- /dev/null +++ b/storage/rocket-storage.go @@ -0,0 +1,50 @@ +package storage + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get a node's withdrawal address +func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + withdrawalAddress := new(common.Address) + if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) + } + return *withdrawalAddress, nil +} + + +// Estimate the gas of SetWithdrawalAddress +func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return rp.RocketStorageContract.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) +} + + +// Set a node's withdrawal address +func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) + } + return hash, nil +} + + +// Estimate the gas of ConfirmWithdrawalAddress +func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return rp.RocketStorageContract.GetTransactionGasInfo(opts, "confirmWithdrawalAddress", nodeAddress) +} + + +// Set a node's withdrawal address +func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) + } + return hash, nil +} diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 013bf2088..7853ffdbc 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -1,22 +1,22 @@ package minipool import ( - "bytes" - "encoding/hex" - "testing" - - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "bytes" + "encoding/hex" + "testing" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tokens" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -47,7 +47,7 @@ func TestDetails(t *testing.T) { if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(34), eth.EthToWei(36), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check minipool details if status, err := mp.GetStatusDetails(nil); err != nil { @@ -283,6 +283,13 @@ func TestClose(t *testing.T) { } +func TestDestroy(t *testing.T) { + + // TODO + +} + + func TestWithdrawValidatorBalance(t *testing.T) { // State snapshotting @@ -307,7 +314,93 @@ func TestWithdrawValidatorBalance(t *testing.T) { if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + + // Get initial token contract ETH balances + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Withdraw minipool validator balance + opts := swcAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + if _, err := mp.Contract.Transfer(opts); err != nil { + t.Fatal(err) + } + + // Get node balances before withdrawal + nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Call ProcessWithdrawal method + if _, err := mp.ProcessWithdrawal(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node ETH balances + if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { + t.Fatal(err) + } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { + t.Error("node ETH balance did not increase after processing withdrawal") + } + + // Get & check updated token contract ETH balances + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + + // Get & check rETH collateral amount & rate + if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { + t.Fatal(err) + } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { + t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) + } + if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { + t.Fatal(err) + } else if rethCollateralRate != 1 { + t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } + + // Confirm the minipool still exists + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Minipool no longer exists but it should") + } + +} + + +func TestWithdrawValidatorBalanceAndDestroy(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } + + // Make user deposit + userDepositAmount := eth.EthToWei(16) + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = userDepositAmount + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get initial token contract ETH balances rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) @@ -322,14 +415,14 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Fatal(err) } - // Get node balances before payout + // Get node balances before withdrawal nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) if err != nil { t.Fatal(err) } - // Call payout method - if _, err := mp.Payout(true, nodeAccount.GetTransactor()); err != nil { + // Call ProcessWithdrawalAndDestroy method + if _, err := mp.ProcessWithdrawalAndDestroy(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -359,5 +452,61 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) } + // Confirm the minipool still exists + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Minipool still exists but it shouldn't") + } + +} + + +func TestDelegateUpgrade(t *testing.T) { + + // TODO + +} + + +func TestDelegateRollback(t *testing.T) { + + // TODO + +} + + +func TestSetUseLatestDelegate(t *testing.T) { + + // TODO + +} + + +func TestGetUseLatestDelegate(t *testing.T) { + + // TODO + +} + + +func TestGetDelegate(t *testing.T) { + + // TODO + +} + + +func TestGetPreviousDelegate(t *testing.T) { + + // TODO + +} + + +func TestGetEffectiveDelegate(t *testing.T) { + + // TODO + } diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index db59d1a95..41a06640e 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -1,17 +1,17 @@ package minipool import ( - "bytes" - "testing" + "bytes" + "testing" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -52,7 +52,7 @@ func TestMinipoolDetails(t *testing.T) { if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Mark minipool as withdrawable - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, minipoolDepositAmount, minipoolWithdrawalAmount, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get minipool validator pubkey validatorPubkey, err := validator.GetValidatorPubkey() diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index 0bb72cb86..5188e2662 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -1,15 +1,15 @@ package minipool import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -51,7 +51,7 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { } // Submit minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), eth.EthToWei(32), trustedNodeAccount.GetTransactor()); err != nil { + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/node/node_test.go b/tests/node/node_test.go index be1ba06cb..edc6c8797 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -1,14 +1,15 @@ package node import ( - "bytes" - "testing" + "bytes" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/storage" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -75,12 +76,12 @@ func TestSetWithdrawalAddress(t *testing.T) { // Set withdrawal address withdrawalAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := node.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, true, nodeAccount.GetTransactor()); err != nil { + if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, true, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check node withdrawal address - if nodeWithdrawalAddress, err := node.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) @@ -102,17 +103,17 @@ func TestSetWithdrawalAddressConfirmation(t *testing.T) { // Set withdrawal address withdrawalAddress := withdrawalAccount.Address - if _, err := node.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, false, nodeAccount.GetTransactor()); err != nil { + if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, false, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Confirm withdrawal address - if _, err := node.ConfirmWithdrawalAddress(rp, nodeAccount.Address, withdrawalAccount.GetTransactor()); err != nil { + if _, err := storage.ConfirmWithdrawalAddress(rp, nodeAccount.Address, withdrawalAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check node withdrawal address - if nodeWithdrawalAddress, err := node.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { t.Error(err) } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 20a4562ba..48596ba46 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -32,8 +32,8 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, if err := minipoolutils.StakeMinipool(rp, mp, trustedNodeAccount); err != nil { return err } // Mark minipool as withdrawable with zero end balance - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), big.NewInt(0), trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, eth.EthToWei(32), big.NewInt(0), trustedNodeAccount2.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { return err } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount2.GetTransactor()); err != nil { return err } // Return return nil From 87a575a57272ec271dd19344d6cbb0f9391b4492 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 16 Jul 2021 01:25:45 -0400 Subject: [PATCH 354/878] Removed the old Withdraw() method, added GetNodePendingWithdrawalAddress() --- minipool/minipool-contract.go | 16 ---------------- storage/rocket-storage.go | 10 ++++++++++ 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 4982b15c0..20e918fdd 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -411,22 +411,6 @@ func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSign } -// Estimate the gas of Withdraw -func (mp *Minipool) EstimateWithdrawGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "withdraw") -} - - -// Withdraw node balances & rewards from the withdrawable minipool and close it -func (mp *Minipool) Withdraw(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "withdraw") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not withdraw from minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil -} - - // Estimate the gas of Dissolve func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "dissolve") diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go index 6de3129b0..379e36f7e 100644 --- a/storage/rocket-storage.go +++ b/storage/rocket-storage.go @@ -18,6 +18,16 @@ func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Addr } +// Get a node's pending withdrawal address +func GetNodePendingWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + withdrawalAddress := new(common.Address) + if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s pending withdrawal address: %w", nodeAddress.Hex(), err) + } + return *withdrawalAddress, nil +} + + // Estimate the gas of SetWithdrawalAddress func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return rp.RocketStorageContract.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) From 8992cc4982996273874263ee35cfdf1f47f43539 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 16 Jul 2021 23:43:42 -0400 Subject: [PATCH 355/878] Added pendingWithdrawalStatus to the node status output --- node/node.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/node/node.go b/node/node.go index 5026bb3e8..84666c447 100644 --- a/node/node.go +++ b/node/node.go @@ -24,10 +24,11 @@ const ( // Node details type NodeDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - WithdrawalAddress common.Address `json:"withdrawalAddress"` - TimezoneLocation string `json:"timezoneLocation"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + WithdrawalAddress common.Address `json:"withdrawalAddress"` + PendingWithdrawalAddress common.Address `json:"pendingWithdrawalAddress"` + TimezoneLocation string `json:"timezoneLocation"` } @@ -119,6 +120,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts var wg errgroup.Group var exists bool var withdrawalAddress common.Address + var pendingWithdrawalAddress common.Address var timezoneLocation string // Load data @@ -132,6 +134,11 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts withdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) return err }) + wg.Go(func() error { + var err error + pendingWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) + return err + }) wg.Go(func() error { var err error timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) @@ -148,6 +155,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts Address: nodeAddress, Exists: exists, WithdrawalAddress: withdrawalAddress, + PendingWithdrawalAddress: pendingWithdrawalAddress, TimezoneLocation: timezoneLocation, }, nil From eebfa1a531fcef4849f92359635a97e755846b74 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 19 Jul 2021 22:37:52 -0400 Subject: [PATCH 356/878] Renamed the withdrawal methods to distributeBalance --- minipool/minipool-contract.go | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 20e918fdd..de95a727f 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -363,15 +363,18 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { } -// Estimate the gas of ProcessWithdrawal -func (mp *Minipool) EstimateProcessWithdrawalGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "processWithdrawal") +// Estimate the gas of DistributeBalance +func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } -// Process an ETH withdrawal -func (mp *Minipool) ProcessWithdrawal(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "processWithdrawal") +// Distribute the minipool's ETH balance to the node operator and rETH staking pool. +// !!! WARNING !!! +// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain +// and the balance has been deposited into the minipool! +func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) } @@ -379,15 +382,19 @@ func (mp *Minipool) ProcessWithdrawal(opts *bind.TransactOpts) (common.Hash, err } -// Estimate the gas of ProcessWithdrawalAndDestroy -func (mp *Minipool) EstimateProcessWithdrawalAndDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "processWithdrawal") +// Estimate the gas of DistributeBalanceAndDestroy +func (mp *Minipool) EstimateDistributeBalanceAndDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndDestroy") } -// Process an ETH withdrawal and destroy the minipool -func (mp *Minipool) ProcessWithdrawalAndDestroy(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "processWithdrawalAndDestroy") +// Distribute the minipool's ETH balance to the node operator and rETH staking pool, +// then destroys the minipool. +// !!! WARNING !!! +// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain +// and the balance has been deposited into the minipool! +func (mp *Minipool) DistributeBalanceAndDestroy(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "distributeBalanceAndDestroy") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for and destroy minipool %s: %w", mp.Address.Hex(), err) } From 186cd4230822fdb05c005d2b61dd7a694431ba0c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 20 Jul 2021 16:14:07 -0400 Subject: [PATCH 357/878] Fixed a unit test with an old name --- tests/minipool/contract_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 7853ffdbc..5452ec56a 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -336,7 +336,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { } // Call ProcessWithdrawal method - if _, err := mp.ProcessWithdrawal(nodeAccount.GetTransactor()); err != nil { + if _, err := mp.DistributeBalance(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -421,8 +421,8 @@ func TestWithdrawValidatorBalanceAndDestroy(t *testing.T) { t.Fatal(err) } - // Call ProcessWithdrawalAndDestroy method - if _, err := mp.ProcessWithdrawalAndDestroy(nodeAccount.GetTransactor()); err != nil { + // Call DistributeBalanceAndDestroy method + if _, err := mp.DistributeBalanceAndDestroy(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } From f74f4b31def94ca7f936554c9ad0cf8dea97f68f Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 21 Jul 2021 17:29:40 +1000 Subject: [PATCH 358/878] Update test.sh to point at master branch on contract repo --- test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.sh b/test.sh index 57c409605..1a49dbdb2 100755 --- a/test.sh +++ b/test.sh @@ -22,7 +22,7 @@ fi # Rocket Pool settings rp_repo_url="https://github.com/rocket-pool/rocketpool.git" -rp_repo_branch="rp3.0-updates" +rp_repo_branch="master" # Dependencies rp_dependencies=( From e11515f495cd217bf85756c122a47577fc33f929 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 21 Jul 2021 17:34:15 +1000 Subject: [PATCH 359/878] Update all methods that now use time instead of blocks --- dao/proposals.go | 94 ++++++++++++------------- dao/trustednode/dao.go | 70 +++++++++--------- settings/trustednode/proposals.go | 90 +++++++++++------------ tests/dao/proposals_test.go | 8 +-- tests/dao/trustednode/proposals_test.go | 16 ++--- tests/rewards/node_test.go | 8 +-- tests/rewards/trusted_node_test.go | 8 +-- tests/testutils/evm/mining.go | 2 +- tests/tokens/rpl_test.go | 4 +- 9 files changed, 150 insertions(+), 150 deletions(-) diff --git a/dao/proposals.go b/dao/proposals.go index 92ea29fc3..1e6cc6e5c 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -29,10 +29,10 @@ type ProposalDetails struct { DAO string `json:"dao"` ProposerAddress common.Address `json:"proposerAddress"` Message string `json:"message"` - CreatedBlock uint64 `json:"createdBlock"` - StartBlock uint64 `json:"startBlock"` - EndBlock uint64 `json:"endBlock"` - ExpiryBlock uint64 `json:"expiryBlock"` + CreatedTime uint64 `json:"createdTime"` + StartTime uint64 `json:"startTime"` + EndTime uint64 `json:"endTime"` + ExpiryTime uint64 `json:"expiryTime"` VotesRequired float64 `json:"votesRequired"` VotesFor float64 `json:"votesFor"` VotesAgainst float64 `json:"votesAgainst"` @@ -260,10 +260,10 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind var dao string var proposerAddress common.Address var message string - var createdBlock uint64 - var startBlock uint64 - var endBlock uint64 - var expiryBlock uint64 + var createdTime uint64 + var startTime uint64 + var endTime uint64 + var expiryTime uint64 var votesRequired float64 var votesFor float64 var votesAgainst float64 @@ -290,22 +290,22 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind }) wg.Go(func() error { var err error - createdBlock, err = GetProposalCreatedBlock(rp, proposalId, opts) + createdTime, err = GetProposalCreatedTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - startBlock, err = GetProposalStartBlock(rp, proposalId, opts) + startTime, err = GetProposalStartTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - endBlock, err = GetProposalEndBlock(rp, proposalId, opts) + endTime, err = GetProposalEndTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - expiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) + expiryTime, err = GetProposalExpiryTime(rp, proposalId, opts) return err }) wg.Go(func() error { @@ -357,22 +357,22 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind // Return return ProposalDetails{ - ID: proposalId, - DAO: dao, + ID: proposalId, + DAO: dao, ProposerAddress: proposerAddress, - Message: message, - CreatedBlock: createdBlock, - StartBlock: startBlock, - EndBlock: endBlock, - ExpiryBlock: expiryBlock, - VotesRequired: votesRequired, - VotesFor: votesFor, - VotesAgainst: votesAgainst, - IsCancelled: isCancelled, - IsExecuted: isExecuted, - Payload: payload, - PayloadStr: payloadStr, - State: state, + Message: message, + CreatedTime: createdTime, + StartTime: startTime, + EndTime: endTime, + ExpiryTime: expiryTime, + VotesRequired: votesRequired, + VotesFor: votesFor, + VotesAgainst: votesAgainst, + IsCancelled: isCancelled, + IsExecuted: isExecuted, + Payload: payload, + PayloadStr: payloadStr, + State: state, }, nil } @@ -465,49 +465,49 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } return strings.Sanitize(*message), nil } -func GetProposalCreatedBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalCreatedTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err } - createdBlock := new(*big.Int) - if err := rocketDAOProposal.Call(opts, createdBlock, "getCreated", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d created block: %w", proposalId, err) + createdTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, createdTime, "getCreated", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d created time: %w", proposalId, err) } - return (*createdBlock).Uint64(), nil + return (*createdTime).Uint64(), nil } -func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err } - startBlock := new(*big.Int) - if err := rocketDAOProposal.Call(opts, startBlock, "getStart", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d start block: %w", proposalId, err) + startTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, startTime, "getStart", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d start time: %w", proposalId, err) } - return (*startBlock).Uint64(), nil + return (*startTime).Uint64(), nil } -func GetProposalEndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalEndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err } - endBlock := new(*big.Int) - if err := rocketDAOProposal.Call(opts, endBlock, "getEnd", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d end block: %w", proposalId, err) + endTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, endTime, "getEnd", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d end time: %w", proposalId, err) } - return (*endBlock).Uint64(), nil + return (*endTime).Uint64(), nil } -func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) if err != nil { return 0, err } - expiryBlock := new(*big.Int) - if err := rocketDAOProposal.Call(opts, expiryBlock, "getExpires", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d expiry block: %w", proposalId, err) + expiryTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, expiryTime, "getExpires", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d expiry time: %w", proposalId, err) } - return (*expiryBlock).Uint64(), nil + return (*expiryTime).Uint64(), nil } func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { rocketDAOProposal, err := getRocketDAOProposal(rp) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 49b4f926f..d3b97adda 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -26,8 +26,8 @@ type MemberDetails struct { Exists bool `json:"exists"` ID string `json:"id"` Url string `json:"url"` - JoinedBlock uint64 `json:"joinedBlock"` - LastProposalBlock uint64 `json:"lastProposalBlock"` + JoinedTime uint64 `json:"joinedTime"` + LastProposalTime uint64 `json:"lastProposalTime"` RPLBondAmount *big.Int `json:"rplBondAmount"` UnbondedValidatorCount uint64 `json:"unbondedValidatorCount"` } @@ -122,8 +122,8 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o var exists bool var id string var url string - var joinedBlock uint64 - var lastProposalBlock uint64 + var joinedTime uint64 + var lastProposalTime uint64 var rplBondAmount *big.Int var unbondedValidatorCount uint64 @@ -145,12 +145,12 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o }) wg.Go(func() error { var err error - joinedBlock, err = GetMemberJoinedBlock(rp, memberAddress, opts) + joinedTime, err = GetMemberJoinedTime(rp, memberAddress, opts) return err }) wg.Go(func() error { var err error - lastProposalBlock, err = GetMemberLastProposalBlock(rp, memberAddress, opts) + lastProposalTime, err = GetMemberLastProposalTime(rp, memberAddress, opts) return err }) wg.Go(func() error { @@ -171,13 +171,13 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o // Return return MemberDetails{ - Address: memberAddress, - Exists: exists, - ID: id, - Url: url, - JoinedBlock: joinedBlock, - LastProposalBlock: lastProposalBlock, - RPLBondAmount: rplBondAmount, + Address: memberAddress, + Exists: exists, + ID: id, + Url: url, + JoinedTime: joinedTime, + LastProposalTime: lastProposalTime, + RPLBondAmount: rplBondAmount, UnbondedValidatorCount: unbondedValidatorCount, }, nil @@ -260,27 +260,27 @@ func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts } return strings.Sanitize(*url), nil } -func GetMemberJoinedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { +func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err } - joinedBlock := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, joinedBlock, "getMemberJoinedBlock", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s joined block: %w", memberAddress.Hex(), err) + joinedTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, joinedTime, "getMemberJoinedTime", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s joined time: %w", memberAddress.Hex(), err) } - return (*joinedBlock).Uint64(), nil + return (*joinedTime).Uint64(), nil } -func GetMemberLastProposalBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { +func GetMemberLastProposalTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err } - lastProposalBlock := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, lastProposalBlock, "getMemberLastProposalBlock", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal block: %w", memberAddress.Hex(), err) + lastProposalTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, lastProposalTime, "getMemberLastProposalTime", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal time: %w", memberAddress.Hex(), err) } - return (*lastProposalBlock).Uint64(), nil + return (*lastProposalTime).Uint64(), nil } func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) @@ -306,26 +306,26 @@ func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress co } -// Get the block that a proposal for a member was executed at -func GetMemberInviteProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedBlock(rp, "invited", memberAddress, opts) +// Get the time that a proposal for a member was executed at +func GetMemberInviteProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + return GetMemberProposalExecutedTime(rp, "invited", memberAddress, opts) } -func GetMemberLeaveProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedBlock(rp, "leave", memberAddress, opts) +func GetMemberLeaveProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + return GetMemberProposalExecutedTime(rp, "leave", memberAddress, opts) } -func GetMemberReplaceProposalExecutedBlock(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedBlock(rp, "replace", memberAddress, opts) +func GetMemberReplaceProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + return GetMemberProposalExecutedTime(rp, "replace", memberAddress, opts) } -func GetMemberProposalExecutedBlock(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { +func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) if err != nil { return 0, err } - proposalExecutedBlock := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, proposalExecutedBlock, "getMemberProposalExecutedBlock", proposalType, memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed block for member %s: %w", proposalType, memberAddress.Hex(), err) + proposalExecutedTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, proposalExecutedTime, "getMemberProposalExecutedTime", proposalType, memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) } - return (*proposalExecutedBlock).Uint64(), nil + return (*proposalExecutedTime).Uint64(), nil } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 18eaccf82..dd21b4484 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -15,15 +15,15 @@ import ( // Config const ( ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" - CooldownSettingPath = "proposal.cooldown" - VoteBlocksSettingPath = "proposal.vote.blocks" - VoteDelayBlocksSettingPath = "proposal.vote.delay.blocks" - ExecuteBlocksSettingPath = "proposal.execute.blocks" - ActionBlocksSettingPath = "proposal.action.blocks" + CooldownTimeSettingPath = "proposal.cooldown.time" + VoteTimeSettingPath = "proposal.vote.time" + VoteDelayTimeSettingPath = "proposal.vote.delay.time" + ExecuteTimeSettingPath = "proposal.execute.time" + ActionTimeSettingPath = "proposal.action.time" ) -// The cooldown period a member must wait after making a proposal before making another in blocks +// The cooldown period a member must wait after making a proposal before making another in seconds func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { @@ -36,105 +36,105 @@ func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 return (*value).Uint64(), nil } func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalCooldownGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownSettingPath), ProposalsSettingsContractName, CooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } -// The period a proposal can be voted on for in blocks -func GetProposalVoteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The period a proposal can be voted on for in seconds +func GetProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getVoteBlocks"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { return 0, fmt.Errorf("Could not get proposal voting period: %w", err) } return (*value).Uint64(), nil } -func BootstrapProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) +func BootstrapProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) +func ProposeProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } -func EstimateProposeProposalVoteBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteBlocksSettingPath), ProposalsSettingsContractName, VoteBlocksSettingPath, big.NewInt(int64(value)), opts) +func EstimateProposeProposalVoteTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } -// The delay after creation before a proposal can be voted on in blocks -func GetProposalVoteDelayBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The delay after creation before a proposal can be voted on in seconds +func GetProposalVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayBlocks"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayTime"); err != nil { return 0, fmt.Errorf("Could not get proposal voting delay: %w", err) } return (*value).Uint64(), nil } -func BootstrapProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) +func BootstrapProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalVoteDelayBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) +func ProposeProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } -func EstimateProposeProposalVoteDelayBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayBlocksSettingPath), ProposalsSettingsContractName, VoteDelayBlocksSettingPath, big.NewInt(int64(value)), opts) +func EstimateProposeProposalVoteDelayTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } -// The period during which a passed proposal can be executed in blocks -func GetProposalExecuteBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The period during which a passed proposal can be executed in time +func GetProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getExecuteBlocks"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getExecuteTime"); err != nil { return 0, fmt.Errorf("Could not get proposal execution period: %w", err) } return (*value).Uint64(), nil } -func BootstrapProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) +func BootstrapProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalExecuteBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) +func ProposeProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } -func EstimateProposeProposalExecuteBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteBlocksSettingPath), ProposalsSettingsContractName, ExecuteBlocksSettingPath, big.NewInt(int64(value)), opts) +func EstimateProposeProposalExecuteTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } -// The period during which an action can be performed on an executed proposal in blocks -func GetProposalActionBlocks(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The period during which an action can be performed on an executed proposal in seconds +func GetProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getActionBlocks"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getActionTime"); err != nil { return 0, fmt.Errorf("Could not get proposal action period: %w", err) } return (*value).Uint64(), nil } -func BootstrapProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) +func BootstrapProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalActionBlocks(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) +func ProposeProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } -func EstimateProposeProposalActionBlocksGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ActionBlocksSettingPath), ProposalsSettingsContractName, ActionBlocksSettingPath, big.NewInt(int64(value)), opts) +func EstimateProposeProposalActionTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 29e5d5a3c..8232d2127 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -27,7 +27,7 @@ func TestProposalDetails(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -65,10 +65,10 @@ func TestProposalDetails(t *testing.T) { proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) if err != nil { t.Fatal(err) } - // Mine blocks until proposal voting delay has passed - voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) + // Increase time until proposal voting delay has passed + voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) if err != nil { t.Fatal(err) } - if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { t.Fatal(err) } + if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { t.Fatal(err) } // Vote on & execute proposal if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index a258f23bd..044d0a261 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -29,7 +29,7 @@ func TestProposeInviteMember(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } @@ -73,10 +73,10 @@ func TestProposeInviteMember(t *testing.T) { } // Get & check member invite executed block - if inviteExecutedBlock, err := trustednodedao.GetMemberInviteProposalExecutedBlock(rp, proposalMemberAddress, nil); err != nil { + if inviteExecutedTime, err := trustednodedao.GetMemberInviteProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { t.Error(err) - } else if inviteExecutedBlock == 0 { - t.Errorf("Incorrect member invite proposal executed block %d", inviteExecutedBlock) + } else if inviteExecutedTime == 0 { + t.Errorf("Incorrect member invite proposal executed time %d", inviteExecutedTime) } } @@ -90,7 +90,7 @@ func TestProposeMemberLeave(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } @@ -136,7 +136,7 @@ func TestProposeMemberLeave(t *testing.T) { } // Get & check member leave executed block - if leaveExecutedBlock, err := trustednodedao.GetMemberLeaveProposalExecutedBlock(rp, proposalMemberAddress, nil); err != nil { + if leaveExecutedBlock, err := trustednodedao.GetMemberLeaveProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { t.Error(err) } else if leaveExecutedBlock == 0 { t.Errorf("Incorrect member leave proposal executed block %d", leaveExecutedBlock) @@ -153,7 +153,7 @@ func TestProposeKickMember(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } @@ -199,7 +199,7 @@ func TestProposeUpgradeContract(t *testing.T) { // Set proposal cooldown if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 1025d2080..6fb3c8eb6 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -21,14 +21,14 @@ func TestNodeRewards(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Constants - oneDay := uint64(24 * 60 * 60) + oneDay := 24 * 60 * 60 rewardInterval := oneDay // Register node if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardInterval, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check node claims enabled status if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { @@ -81,11 +81,11 @@ func TestNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + oneDay, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + uint64(oneDay), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Mine blocks until rewards are available + // Increase time until rewards are available if err := evm.IncreaseTime(oneDay + oneDay); err != nil { t.Fatal(err) } diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index 210de3ea1..de8bec441 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -20,14 +20,14 @@ func TestTrustedNodeRewards(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Constants - oneDay := uint64(24 * 60 * 60) + oneDay := 24 * 60 * 60 rewardInterval := oneDay // Register node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardInterval, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get & check trusted node claims enabled status if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { @@ -70,11 +70,11 @@ func TestTrustedNodeRewards(t *testing.T) { // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + oneDay, ownerAccount.GetTransactor()); err != nil { + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + uint64(oneDay), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Mine blocks until rewards are available + // Increase time until rewards are available if err := evm.IncreaseTime(oneDay + oneDay); err != nil { t.Fatal(err) } // Get & check updated trusted node claim rewards amount diff --git a/tests/testutils/evm/mining.go b/tests/testutils/evm/mining.go index 998d5fd5b..eacf06c69 100644 --- a/tests/testutils/evm/mining.go +++ b/tests/testutils/evm/mining.go @@ -25,7 +25,7 @@ func MineBlocks(numBlocks int) error { // Fast forward to some number of seconds -func IncreaseTime(time uint64) error { +func IncreaseTime(time int) error { // Initialize RPC client client, err := rpc.Dial(tests.Eth1ProviderAddress) diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index 390edb877..c9c26634b 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -116,12 +116,12 @@ func TestMintInflationRPL(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Constants - oneDay := uint64(24 * 60 * 60) + oneDay := 24 * 60 * 60 // Start RPL inflation if _, err := protocol.BootstrapInflationStartTime(rp, uint64(time.Now().Unix() + 3600), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - // Mine blocks until rewards are available + // Increase time until rewards are available if err := evm.IncreaseTime(3600 + oneDay); err != nil { t.Fatal(err) } // Get initial total supply From 104400541e13066affb3e18927fbc4205e8e2f24 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 22 Jul 2021 14:22:13 +1000 Subject: [PATCH 360/878] Bring go lib in line with contract changes --- dao/trustednode/dao.go | 4 +- minipool/minipool-contract.go | 52 --------- minipool/minipool.go | 88 --------------- settings/protocol/network.go | 17 --- settings/trustednode/members.go | 25 +++++ settings/trustednode/proposals.go | 10 +- tests/auction/auction_test.go | 10 +- tests/dao/proposals_test.go | 18 ++-- tests/dao/trustednode/dao_test.go | 13 ++- tests/dao/trustednode/proposals_test.go | 8 +- tests/minipool/contract_test.go | 10 -- tests/minipool/minipool_test.go | 20 ++-- tests/minipool/queue_test.go | 7 ++ tests/minipool/status_test.go | 34 ++---- tests/settings/protocol/network_test.go | 10 -- tests/settings/trustednode/members_test.go | 4 +- tests/settings/trustednode/proposals_test.go | 108 +++++++++---------- tests/testutils/accounts/accounts.go | 5 +- tests/testutils/auction/auction.go | 3 + tests/testutils/dao/proposals.go | 6 +- tests/tokens/reth_test.go | 9 ++ 21 files changed, 162 insertions(+), 299 deletions(-) diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index d3b97adda..3fdc2fa70 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -175,8 +175,8 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o Exists: exists, ID: id, Url: url, - JoinedTime: joinedTime, - LastProposalTime: lastProposalTime, + JoinedTime: joinedTime, + LastProposalTime: lastProposalTime, RPLBondAmount: rplBondAmount, UnbondedValidatorCount: unbondedValidatorCount, }, nil diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index de95a727f..8a0cb1946 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -33,10 +33,6 @@ type UserDetails struct { DepositAssigned bool `json:"depositAssigned"` DepositAssignedTime time.Time `json:"depositAssignedTime"` } -type StakingDetails struct { - StartBalance *big.Int `json:"startBalance"` - EndBalance *big.Int `json:"endBalance"` -} // Minipool contract @@ -289,54 +285,6 @@ func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, } -// Get staking details -func (mp *Minipool) GetStakingDetails(opts *bind.CallOpts) (StakingDetails, error) { - - // Data - var wg errgroup.Group - var startBalance *big.Int - var endBalance *big.Int - - // Load data - wg.Go(func() error { - var err error - startBalance, err = mp.GetStakingStartBalance(opts) - return err - }) - wg.Go(func() error { - var err error - endBalance, err = mp.GetStakingEndBalance(opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return StakingDetails{}, err - } - - // Return - return StakingDetails{ - StartBalance: startBalance, - EndBalance: endBalance, - }, nil - -} -func (mp *Minipool) GetStakingStartBalance(opts *bind.CallOpts) (*big.Int, error) { - stakingStartBalance := new(*big.Int) - if err := mp.Contract.Call(opts, stakingStartBalance, "getStakingStartBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s staking start balance: %w", mp.Address.Hex(), err) - } - return *stakingStartBalance, nil -} -func (mp *Minipool) GetStakingEndBalance(opts *bind.CallOpts) (*big.Int, error) { - stakingEndBalance := new(*big.Int) - if err := mp.Contract.Call(opts, stakingEndBalance, "getStakingEndBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s staking end balance: %w", mp.Address.Hex(), err) - } - return *stakingEndBalance, nil -} - - // Get withdrawal credentials func (mp *Minipool) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) { withdrawalCredentials := new(common.Hash) diff --git a/minipool/minipool.go b/minipool/minipool.go index 64a221e83..563e33407 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -25,10 +25,6 @@ type MinipoolDetails struct { Address common.Address `json:"address"` Exists bool `json:"exists"` Pubkey rptypes.ValidatorPubkey `json:"pubkey"` - WithdrawalTotalBalance *big.Int `json:"withdrawalTotalBalance"` - WithdrawalNodeBalance *big.Int `json:"withdrawalNodeBalance"` - Withdrawable bool `json:"withdrawable"` - WithdrawalProcessed bool `json:"withdrawalProcessed"` } @@ -221,10 +217,6 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres var wg errgroup.Group var exists bool var pubkey rptypes.ValidatorPubkey - var withdrawalTotalBalance *big.Int - var withdrawalNodeBalance *big.Int - var withdrawable bool - var withdrawalProcessed bool // Load data wg.Go(func() error { @@ -237,26 +229,6 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) return err }) - wg.Go(func() error { - var err error - withdrawalTotalBalance, err = GetMinipoolWithdrawalTotalBalance(rp, minipoolAddress, opts) - return err - }) - wg.Go(func() error { - var err error - withdrawalNodeBalance, err = GetMinipoolWithdrawalNodeBalance(rp, minipoolAddress, opts) - return err - }) - wg.Go(func() error { - var err error - withdrawable, err = GetMinipoolWithdrawable(rp, minipoolAddress, opts) - return err - }) - wg.Go(func() error { - var err error - withdrawalProcessed, err = GetMinipoolWithdrawalProcessed(rp, minipoolAddress, opts) - return err - }) // Wait for data if err := wg.Wait(); err != nil { @@ -268,10 +240,6 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres Address: minipoolAddress, Exists: exists, Pubkey: pubkey, - WithdrawalTotalBalance: withdrawalTotalBalance, - WithdrawalNodeBalance: withdrawalNodeBalance, - Withdrawable: withdrawable, - WithdrawalProcessed: withdrawalProcessed, }, nil } @@ -403,62 +371,6 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } -// Get a minipool's total balance at withdrawal -func GetMinipoolWithdrawalTotalBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return nil, err - } - balance := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, balance, "getMinipoolWithdrawalTotalBalance", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get minipool %s withdrawal total balance: %w", minipoolAddress.Hex(), err) - } - return *balance, nil -} - - -// Get a minipool's node balance at withdrawal -func GetMinipoolWithdrawalNodeBalance(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return nil, err - } - balance := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, balance, "getMinipoolWithdrawalNodeBalance", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get minipool %s withdrawal node balance: %w", minipoolAddress.Hex(), err) - } - return *balance, nil -} - - -// Check whether a minipool is withdrawable -func GetMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return false, err - } - withdrawable := new(bool) - if err := rocketMinipoolManager.Call(opts, withdrawable, "getMinipoolWithdrawable", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s withdrawable status: %w", minipoolAddress.Hex(), err) - } - return *withdrawable, nil -} - - -// Check whether a minipool's validator withdrawal has been processed -func GetMinipoolWithdrawalProcessed(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return false, err - } - processed := new(bool) - if err := rocketMinipoolManager.Call(opts, processed, "getMinipoolWithdrawalProcessed", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s withdrawal processed status: %w", minipoolAddress.Hex(), err) - } - return *processed, nil -} - - // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 1fb11162f..3a23038fd 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -102,23 +102,6 @@ func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opt } -// Processing validator withdrawals currently enabled -func GetProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := networkSettingsContract.Call(opts, value, "getProcessWithdrawalsEnabled"); err != nil { - return false, fmt.Errorf("Could not get processing withdrawals enabled status: %w", err) - } - return *value, nil -} -func BootstrapProcessWithdrawalsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.process.withdrawals.enabled", value, opts) -} - - // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { networkSettingsContract, err := getNetworkSettingsContract(rp) diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 64d80d8ff..8983b77cd 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -19,6 +19,7 @@ const ( QuorumSettingPath = "members.quorum" RPLBondSettingPath = "members.rplbond" MinipoolUnbondedMaxSettingPath = "members.minipool.unbonded.max" + MinipoolUnbondedMinFeeSettingPath = "members.minipool.unbonded.min.fee" ChallengeCooldownSettingPath = "members.challenge.cooldown" ChallengeWindowSettingPath = "members.challenge.window" ChallengeCostSettingPath = "members.challenge.cost" @@ -94,6 +95,30 @@ func EstimateProposeMinipoolUnbondedMaxGas(rp *rocketpool.RocketPool, value uint } + +// The minimum commission rate before unbonded minipools are allowed +func GetMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMinFee"); err != nil { + return 0, fmt.Errorf("Could not get member unbonded minipool minimum fee: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) +} +func ProposeMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) +} +func EstimateProposeMinipoolUnbondedMinFeeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) +} + + // The period a member must wait for before submitting another challenge, in blocks func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { membersSettingsContract, err := getMembersSettingsContract(rp) diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index dd21b4484..a6634d724 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -24,24 +24,24 @@ const ( // The cooldown period a member must wait after making a proposal before making another in seconds -func GetProposalCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetProposalCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getCooldown"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { return 0, fmt.Errorf("Could not get proposal cooldown period: %w", err) } return (*value).Uint64(), nil } -func BootstrapProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { +func BootstrapProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } -func ProposeProposalCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } -func EstimateProposeProposalCooldownGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeProposalCooldownTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 9160f45c9..3a8ed9c60 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -1,7 +1,8 @@ package auction import ( - "math/big" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "math/big" "testing" "github.com/rocket-pool/rocketpool-go/auction" @@ -27,6 +28,9 @@ func TestAuctionDetails(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } + // Disable min commission rate for unbonded pools + if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check initial RPL balances totalBalance1, err := auction.GetTotalRPLBalance(rp, nil) if err != nil { t.Fatal(err) } @@ -101,8 +105,12 @@ func TestLotDetails(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } + // Disable min commission rate for unbonded pools + if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Set network parameters if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index 8232d2127..f7ed7631e 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -26,7 +26,7 @@ func TestProposalDetails(t *testing.T) { proposalDaoName := "rocketDAONodeTrustedProposals" // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes @@ -108,17 +108,17 @@ func TestProposalDetails(t *testing.T) { if proposal.Message != proposalMessage { t.Errorf("Incorrect proposal message %s", proposal.Message) } - if proposal.CreatedBlock == 0 { - t.Errorf("Incorrect proposal created block %d", proposal.CreatedBlock) + if proposal.CreatedTime == 0 { + t.Errorf("Incorrect proposal created time %d", proposal.CreatedTime) } - if proposal.StartBlock <= proposal.CreatedBlock { - t.Errorf("Incorrect proposal start block %d", proposal.StartBlock) + if proposal.StartTime <= proposal.CreatedTime { + t.Errorf("Incorrect proposal start time %d", proposal.StartTime) } - if proposal.EndBlock <= proposal.StartBlock { - t.Errorf("Incorrect proposal end block %d", proposal.EndBlock) + if proposal.EndTime <= proposal.StartTime { + t.Errorf("Incorrect proposal end time %d", proposal.EndTime) } - if proposal.ExpiryBlock <= proposal.EndBlock { - t.Errorf("Incorrect proposal expiry block %d", proposal.ExpiryBlock) + if proposal.ExpiryTime <= proposal.EndTime { + t.Errorf("Incorrect proposal expiry time %d", proposal.ExpiryTime) } if proposal.VotesRequired == 0.0 { t.Errorf("Incorrect proposal required votes %f", proposal.VotesRequired) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 6a4a72ca9..73142d227 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -23,6 +23,9 @@ func TestMemberDetails(t *testing.T) { if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check minimum member count if minMemberCount, err := trustednodedao.GetMinimumMemberCount(rp, nil); err != nil { t.Error(err) @@ -38,7 +41,7 @@ func TestMemberDetails(t *testing.T) { } // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } @@ -96,11 +99,11 @@ func TestMemberDetails(t *testing.T) { if member.Url != memberEmail { t.Errorf("Incorrect member email %s", member.Url) } - if member.JoinedBlock == 0 { - t.Errorf("Incorrect member joined block %d", member.JoinedBlock) + if member.JoinedTime == 0 { + t.Errorf("Incorrect member joined time %d", member.JoinedTime) } - if member.LastProposalBlock == 0 { - t.Errorf("Incorrect member last proposal block %d", member.LastProposalBlock) + if member.LastProposalTime == 0 { + t.Errorf("Incorrect member last proposal time %d", member.LastProposalTime) } if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 044d0a261..a3592fd03 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -28,7 +28,7 @@ func TestProposeInviteMember(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes @@ -89,7 +89,7 @@ func TestProposeMemberLeave(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes @@ -152,7 +152,7 @@ func TestProposeKickMember(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register nodes @@ -198,7 +198,7 @@ func TestProposeUpgradeContract(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register node diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 5452ec56a..94537e4d0 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -100,16 +100,6 @@ func TestDetails(t *testing.T) { t.Errorf("Incorrect minipool user deposit assigned time %v", user.DepositAssignedTime) } } - if staking, err := mp.GetStakingDetails(nil); err != nil { - t.Error(err) - } else { - if staking.StartBalance.Cmp(eth.EthToWei(34)) != 0 { - t.Errorf("Incorrect minipool staking start balance %s", staking.StartBalance.String()) - } - if staking.EndBalance.Cmp(eth.EthToWei(36)) != 0 { - t.Errorf("Incorrect minipool staking end balance %s", staking.EndBalance.String()) - } - } if withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil); err != nil { t.Error(err) } else { diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index 41a06640e..f42d72b47 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -2,7 +2,8 @@ package minipool import ( "bytes" - "testing" + "github.com/rocket-pool/rocketpool-go/types" + "testing" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" @@ -44,7 +45,6 @@ func TestMinipoolDetails(t *testing.T) { // Minipool deposit/withdrawal amounts minipoolDepositAmount := eth.EthToWei(32) - minipoolWithdrawalAmount := eth.EthToWei(34) // Create & stake minipool mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, minipoolDepositAmount) @@ -74,18 +74,14 @@ func TestMinipoolDetails(t *testing.T) { if !bytes.Equal(mpDetails.Pubkey.Bytes(), validatorPubkey.Bytes()) { t.Errorf("Incorrect minipool validator pubkey %s", mpDetails.Pubkey.Hex()) } - if mpDetails.WithdrawalTotalBalance.Cmp(minipoolWithdrawalAmount) != 0 { - t.Errorf("Incorrect minipool withdrawal total balance %s", mpDetails.WithdrawalTotalBalance.String()) - } - if mpDetails.WithdrawalNodeBalance.Cmp(minipoolWithdrawalAmount) != 0 { - t.Errorf("Incorrect minipool withdrawal node balance %s", mpDetails.WithdrawalNodeBalance.String()) - } - if !mpDetails.Withdrawable { + } + // Check status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else { + if status != types.Withdrawable { t.Error("Incorrect minipool withdrawable status") } - if mpDetails.WithdrawalProcessed { - t.Error("Incorrect minipool withdrawal processed status") - } } if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { t.Error(err) diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index d272650a7..aca0250dd 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -1,6 +1,7 @@ package minipool import ( + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" "testing" "github.com/rocket-pool/rocketpool-go/minipool" @@ -23,6 +24,9 @@ func TestQueueLengths(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { t.Error(err) @@ -117,6 +121,9 @@ func TestQueueCapacity(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { t.Error(err) diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index 5188e2662..d9e8823bb 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -1,6 +1,7 @@ package minipool import ( + "github.com/rocket-pool/rocketpool-go/types" "testing" "github.com/rocket-pool/rocketpool-go/minipool" @@ -13,21 +14,6 @@ import ( ) -func TestMinipoolNodeRewardAmount(t *testing.T) { - - // Get & check node reward amount - // Node reward amount = (node balance) + (rewards * node balance / start balance) + (rewards * user balance / start balance * node fee) - // = (40 - 16) + (48 - 40) * (40 - 16) / 40 + (48 - 40) * 16 / 40 * 0.5 - // = 30.4 - if rewardAmount, err := minipool.GetMinipoolNodeRewardAmount(rp, 0.5, eth.EthToWei(16), eth.EthToWei(40), eth.EthToWei(48), nil); err != nil { - t.Error(err) - } else if rewardAmount.Cmp(eth.EthToWei(30.4)) != 0 { - t.Errorf("Incorrect minipool node reward amount %s", rewardAmount.String()) - } - -} - - func TestSubmitMinipoolWithdrawable(t *testing.T) { // State snapshotting @@ -44,11 +30,11 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Get & check initial minipool withdrawable status - if withdrawable, err := minipool.GetMinipoolWithdrawable(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if withdrawable { - t.Error("Incorrect initial minipool withdrawable status") - } + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status == types.Withdrawable { + t.Error("Incorrect initial minipool withdrawable status") + } // Submit minipool withdrawable status if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { @@ -56,10 +42,10 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { } // Get & check updated minipool withdrawable status - if withdrawable, err := minipool.GetMinipoolWithdrawable(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if !withdrawable { - t.Error("Incorrect updated minipool withdrawable status") + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != types.Withdrawable { + t.Error("Incorrect updated minipool withdrawable status") } } diff --git a/tests/settings/protocol/network_test.go b/tests/settings/protocol/network_test.go index 755fa8b7a..2d9002904 100644 --- a/tests/settings/protocol/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -66,16 +66,6 @@ func TestNetworkSettings(t *testing.T) { t.Error("Incorrect network price submission frequency value") } - // Set & get process withdrawals enabled - processWithdrawalsEnabled := false - if _, err := protocol.BootstrapProcessWithdrawalsEnabled(rp, processWithdrawalsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetProcessWithdrawalsEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != processWithdrawalsEnabled { - t.Error("Incorrect process withdrawals enabled value") - } - // Set & get minimum node fee minimumNodeFee := 0.80 if _, err := protocol.BootstrapMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index 07129707c..cb78cdc74 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -59,8 +59,8 @@ func TestProposeMembersSettings(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index bd33bc79d..37042e768 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -20,52 +20,52 @@ func TestBootstrapProposalsSettings(t *testing.T) { // Set & get cooldown var cooldown uint64 = 1 - if _, err := trustednode.BootstrapProposalCooldown(rp, cooldown, ownerAccount.GetTransactor()); err != nil { + if _, err := trustednode.BootstrapProposalCooldownTime(rp, cooldown, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { t.Error(err) } else if value != cooldown { t.Error("Incorrect cooldown value") } - // Set & get vote blocks - var voteBlocks uint64 = 10 - if _, err := trustednode.BootstrapProposalVoteBlocks(rp, voteBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get vote time + var voteTime uint64 = 10 + if _, err := trustednode.BootstrapProposalVoteTime(rp, voteTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { t.Error(err) - } else if value != voteBlocks { - t.Error("Incorrect vote blocks value") + } else if value != voteTime { + t.Error("Incorrect vote time value") } - // Set & get execute blocks - var executeBlocks uint64 = 10 - if _, err := trustednode.BootstrapProposalExecuteBlocks(rp, executeBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get execute time + var executeTime uint64 = 10 + if _, err := trustednode.BootstrapProposalExecuteTime(rp, executeTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { t.Error(err) - } else if value != executeBlocks { - t.Error("Incorrect execute blocks value") + } else if value != executeTime { + t.Error("Incorrect execute time value") } - // Set & get action blocks - var actionBlocks uint64 = 10 - if _, err := trustednode.BootstrapProposalActionBlocks(rp, actionBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get action time + var actionTime uint64 = 10 + if _, err := trustednode.BootstrapProposalActionTime(rp, actionTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { t.Error(err) - } else if value != actionBlocks { - t.Error("Incorrect action blocks value") + } else if value != actionTime { + t.Error("Incorrect action time value") } - // Set & get vote delay blocks - var voteDelayBlocks uint64 = 1000 - if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, voteDelayBlocks, ownerAccount.GetTransactor()); err != nil { + // Set & get vote delay time + var voteDelayTime uint64 = 1000 + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, voteDelayTime, ownerAccount.GetTransactor()); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { t.Error(err) - } else if value != voteDelayBlocks { - t.Error("Incorrect vote delay blocks value") + } else if value != voteDelayTime { + t.Error("Incorrect vote delay time value") } } @@ -78,8 +78,8 @@ func TestProposeProposalsSettings(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Set proposal cooldown - if _, err := trustednode.BootstrapProposalCooldown(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednode.BootstrapProposalVoteDelayBlocks(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Register trusted node if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } @@ -88,62 +88,62 @@ func TestProposeProposalsSettings(t *testing.T) { // Set & get cooldown var cooldown uint64 = 1 - if proposalId, _, err := trustednode.ProposeProposalCooldown(rp, cooldown, trustedNodeAccount1.GetTransactor()); err != nil { + if proposalId, _, err := trustednode.ProposeProposalCooldownTime(rp, cooldown, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalCooldown(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { t.Error(err) } else if value != cooldown { t.Error("Incorrect cooldown value") } - // Set & get vote blocks - var voteBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalVoteBlocks(rp, voteBlocks, trustedNodeAccount1.GetTransactor()); err != nil { + // Set & get vote time + var voteTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalVoteTime(rp, voteTime, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalVoteBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { t.Error(err) - } else if value != voteBlocks { - t.Error("Incorrect vote blocks value") + } else if value != voteTime { + t.Error("Incorrect vote time value") } - // Set & get execute blocks - var executeBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalExecuteBlocks(rp, executeBlocks, trustedNodeAccount1.GetTransactor()); err != nil { + // Set & get execute time + var executeTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalExecuteTime(rp, executeTime, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalExecuteBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { t.Error(err) - } else if value != executeBlocks { - t.Error("Incorrect execute blocks value") + } else if value != executeTime { + t.Error("Incorrect execute time value") } - // Set & get action blocks - var actionBlocks uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalActionBlocks(rp, actionBlocks, trustedNodeAccount1.GetTransactor()); err != nil { + // Set & get action time + var actionTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalActionTime(rp, actionTime, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalActionBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { t.Error(err) - } else if value != actionBlocks { - t.Error("Incorrect action blocks value") + } else if value != actionTime { + t.Error("Incorrect action time value") } - // Set & get vote delay blocks - var voteDelayBlocks uint64 = 1000 - if proposalId, _, err := trustednode.ProposeProposalVoteDelayBlocks(rp, voteDelayBlocks, trustedNodeAccount1.GetTransactor()); err != nil { + // Set & get vote delay time + var voteDelayTime uint64 = 1000 + if proposalId, _, err := trustednode.ProposeProposalVoteDelayTime(rp, voteDelayTime, trustedNodeAccount1.GetTransactor()); err != nil { t.Error(err) } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Error(err) - } else if value, err := trustednode.GetProposalVoteDelayBlocks(rp, nil); err != nil { + } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { t.Error(err) - } else if value != voteDelayBlocks { - t.Error("Incorrect vote delay blocks value") + } else if value != voteDelayTime { + t.Error("Incorrect vote delay time value") } } diff --git a/tests/testutils/accounts/accounts.go b/tests/testutils/accounts/accounts.go index 3f406f288..8c2ee0e07 100644 --- a/tests/testutils/accounts/accounts.go +++ b/tests/testutils/accounts/accounts.go @@ -1,6 +1,7 @@ package accounts import ( + "context" "crypto/ecdsa" "encoding/hex" @@ -41,6 +42,8 @@ func GetAccount(index uint8) (*Account, error) { // Get a transactor for an account func (a *Account) GetTransactor() *bind.TransactOpts { - return bind.NewKeyedTransactor(a.PrivateKey) + opts := bind.NewKeyedTransactor(a.PrivateKey) + opts.Context = context.Background() + return opts } diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 48596ba46..a00555f23 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -35,6 +35,9 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { return err } if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount2.GetTransactor()); err != nil { return err } + // Distribute balance and destroy pool to send slashed RPL to auction contract + if _, err := mp.DistributeBalanceAndDestroy(trustedNodeAccount.GetTransactor()); err != nil { return err } + // Return return nil diff --git a/tests/testutils/dao/proposals.go b/tests/testutils/dao/proposals.go index 9357681a2..762cc8166 100644 --- a/tests/testutils/dao/proposals.go +++ b/tests/testutils/dao/proposals.go @@ -16,11 +16,11 @@ import ( func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccounts []*accounts.Account) error { // Get proposal voting delay - voteDelayBlocks, err := trustednodesettings.GetProposalVoteDelayBlocks(rp, nil) + voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) if err != nil { return err } - // Mine blocks until proposal voting delay has passed - if err := evm.MineBlocks(int(voteDelayBlocks)); err != nil { return err } + // Increase time until proposal voting delay has passed + if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { return err } // Vote on proposal until passed for _, account := range trustedNodeAccounts { diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index fe2a3aeca..3b8373f8c 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -57,6 +57,9 @@ func TestTransferRETH(t *testing.T) { rethAmount := eth.EthToWei(100) if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } + // Mine pre-requisite 5760 blocks before being able to transfer + if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } + // Transfer rETH toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") sendAmount := eth.EthToWei(50) @@ -97,6 +100,9 @@ func TestTransferFromRETH(t *testing.T) { t.Errorf("Incorrect rETH spender allowance %s", allowance.String()) } + // Mine pre-requisite 5760 blocks before being able to transfer + if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } + // Transfer rETH from account toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") if _, err := tokens.TransferFromRETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { @@ -167,6 +173,9 @@ func TestBurnRETH(t *testing.T) { t.Fatal(err) } + // Mine pre-requisite 5760 blocks before being able to burn + if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } + // Burn rETH burnAmount := eth.EthToWei(50) if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { From 8b06ccc2204d61790dc904e1cfd4c4af30001849 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 22 Jul 2021 14:30:12 +1000 Subject: [PATCH 361/878] Add force flag to github push --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a3e472b42..a1338bf3a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -27,7 +27,7 @@ steps: | jq -r '.token') git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME git fetch github - git push github HEAD:$(Build.SourceBranch) --verbose + git push github HEAD:$(Build.SourceBranch) -f --verbose git push github HEAD:$(Build.SourceBranch) --tags --verbose displayName: 'Push to Github' env: From f373c34486c9097741e262385440eeef448aac96 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 22 Jul 2021 17:44:19 +1000 Subject: [PATCH 362/878] Fix broken tests --- tests/minipool/contract_test.go | 5 +++++ tests/node/staking_test.go | 24 ++++++++++++------------ tests/testutils/minipool/minipool.go | 1 + 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 94537e4d0..43cf0a925 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -330,6 +330,11 @@ func TestWithdrawValidatorBalance(t *testing.T) { t.Fatal(err) } + // Call refund method to withdraw node's balance + if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + // Get & check updated node ETH balances if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { t.Fatal(err) diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 7819556ef..f9f8a4d50 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -1,18 +1,18 @@ package node import ( - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index d0e18b223..b095ee8cf 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -2,6 +2,7 @@ package minipool import ( "errors" + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" From 5545b984e30c99939f7dd7991d10154274e8e7c2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 23 Jul 2021 01:06:53 -0400 Subject: [PATCH 363/878] Updated to geth 1.10.6 --- go.mod | 2 +- go.sum | 191 +++------------------------------------------------------ 2 files changed, 8 insertions(+), 185 deletions(-) diff --git a/go.mod b/go.mod index ad0d350e1..37f1d7814 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.21.0-beta // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/ethereum/go-ethereum v1.10.4 + github.com/ethereum/go-ethereum v1.10.6 github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect github.com/minio/highwayhash v1.0.1 // indirect github.com/protolambda/zssz v0.1.5 // indirect diff --git a/go.sum b/go.sum index c14266da4..087fc497b 100644 --- a/go.sum +++ b/go.sum @@ -12,7 +12,6 @@ cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbf cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= @@ -37,9 +36,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= @@ -50,12 +48,6 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= @@ -67,12 +59,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxq github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= @@ -98,20 +86,10 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/consensys/bavard v0.1.8-0.20210105233146-c16790d2aa8b/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/consensys/goff v0.3.10/go.mod h1:xTldOBEHmFiYS0gPXd3NsaEqZWlnmeWcRLWgD3ba3xc= -github.com/consensys/gurvy v0.3.8/go.mod h1:sN75xnsiD593XnhbhvG2PkOy194pZBzqShWF/kwuW/g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -129,28 +107,17 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c h1:JHHhtb9XWJrGNMcrVP6vyzO4dusgi/HnceHTgxSejUM= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.9.15 h1:wrWl+QrtutRUJ9LZXdUqBoGoo2b1tOCYRDrAOQhCY3A= -github.com/ethereum/go-ethereum v1.9.15/go.mod h1:slT8bPPRhXsyNTwHQxrOnjuTZ1sDXRajW11EkJ84QJ0= -github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= -github.com/ethereum/go-ethereum v1.10.0 h1:EBZuZYjk1DHboBJb2YkBN8xItELRY6mtZEiYJKuH0+M= -github.com/ethereum/go-ethereum v1.10.0/go.mod h1:E5e/zvdfUVr91JZ0AwjyuJM3x+no51zZJRz61orLLSk= -github.com/ethereum/go-ethereum v1.10.4 h1:JPZPL2MHbegfFStcaOrrggMVIcf57OQHQ0J3UhjQ+xQ= -github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/ethereum/go-ethereum v1.10.6 h1:bfx3rqWgw768vn6ioxTk8pPNe4IaRzVgRlrS35B43es= +github.com/ethereum/go-ethereum v1.10.6/go.mod h1:iY/t0vHSmaAOC+xlqvAAeHdGSWNFkfSnN0OhMTDYz90= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 h1:9VDpsWq096+oGMDTT/SgBD/VgZYf4pTF+KTPmZ+OaKM= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -159,7 +126,6 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -169,6 +135,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -176,12 +143,10 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -189,8 +154,6 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c h1:zqAKixg3cTcIasAMJV+EcfVbWwLpOZ7LeoWJvcuD/5Q= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -201,10 +164,7 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -228,57 +188,24 @@ github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989 h1:giknQ4mEuDFmmHSrGcbargOuLHQGtywqo4mheITex54= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031 h1:HarGZ5h9HD9LgEg1yRVMXyfiw4wlXiLiYM2oMjeA/SE= -github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= -github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88 h1:bcAj8KroPf552TScjFPIakjH2/tdIrIH8F+cc4v4SRo= -github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= +github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda h1:Vofqyy/Ysqit++X33unU0Gr08b6P35hKm3juytDrBVI= +github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= @@ -291,24 +218,19 @@ github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kilic/bls12-381 v0.0.0-20201226121925-69dacb279461/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= @@ -325,40 +247,26 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -370,9 +278,6 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -388,40 +293,29 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= @@ -433,45 +327,26 @@ github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:Vec github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible h1:+gAR1bMhuoQnZMTWFIvp7ukynULPsteLzG+siZKLtD8= -github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v2.20.5+incompatible h1:tYH07UPoQt0OCQdgWWMgYHy3/a9bcxNpBIysykNIP7I= -github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -480,11 +355,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -492,42 +362,28 @@ github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 h1:QmwruyY+bKbDDL0BaglrbZABEali68eoMFhTZpCjYVA= -golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -536,7 +392,6 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -554,22 +409,16 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -581,12 +430,8 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= @@ -597,22 +442,18 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -626,36 +467,24 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b h1:ggRgirZABFolTmi3sn6Ivd9SipZwLedQ5wR0aAKnFxU= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -663,7 +492,6 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -683,7 +511,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -691,7 +518,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -748,16 +574,13 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200603215123-a4a8cb9d2cbc/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From aaaa1030e973affb51bd58d040e745777464e67a Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 27 Jul 2021 10:54:35 +1000 Subject: [PATCH 364/878] Add tests for delegate upgrade system --- tests/minipool/contract_test.go | 148 +++++++++++++++++++-------- tests/testutils/minipool/minipool.go | 1 - 2 files changed, 107 insertions(+), 42 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 43cf0a925..20d3c96a6 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -1,22 +1,24 @@ package minipool import ( - "bytes" - "encoding/hex" - "testing" - - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "bytes" + "encoding/hex" + "github.com/ethereum/go-ethereum/common" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "testing" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tokens" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -457,51 +459,115 @@ func TestWithdrawValidatorBalanceAndDestroy(t *testing.T) { } -func TestDelegateUpgrade(t *testing.T) { - - // TODO - -} - - -func TestDelegateRollback(t *testing.T) { - - // TODO +func TestDelegateUpgradeAndRollback(t *testing.T) { + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) -} + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } -func TestSetUseLatestDelegate(t *testing.T) { + // Get original delegate contract + originalDelegate, err := mp.GetEffectiveDelegate(nil) + if err != nil { t.Fatal(err) } - // TODO + newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") + newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" -} + // Upgrade the network delegate contract + _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) + if err != nil { t.Fatal(err) } + // Get new effective delegate + effectiveDelegate, err := mp.GetEffectiveDelegate(nil) + if err != nil { t.Fatal(err) } -func TestGetUseLatestDelegate(t *testing.T) { + // Check + if effectiveDelegate != originalDelegate { + t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), originalDelegate.Hex()) + } - // TODO + // Call upgrade + if _, err := mp.DelegateUpgrade(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } -} + // Check effective delegate + if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != newDelegate { + t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } + // Check previous delegate + if previousDelegate, err := mp.GetPreviousDelegate(nil); err != nil { + t.Fatal(err) + } else if previousDelegate != originalDelegate { + t.Errorf("Previous delegate %s did not match original delegate %s", previousDelegate.Hex(), originalDelegate.Hex()) + } -func TestGetDelegate(t *testing.T) { + // Check current delegate + if currentDelegate, err := mp.GetDelegate(nil); err != nil { + t.Fatal(err) + } else if currentDelegate != newDelegate { + t.Errorf("Current delegate %s did not match new delegate %s", currentDelegate.Hex(), newDelegate.Hex()) + } - // TODO + // Rollback + if _, err := mp.DelegateRollback(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + // Get new effective delegate + if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != originalDelegate { + t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } } +func TestUseLatestDelegate(t *testing.T) { + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } + t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) -func TestGetPreviousDelegate(t *testing.T) { + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - // TODO + // Create minipool + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + if err != nil { t.Fatal(err) } -} + // New delegate params + newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") + newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + // Upgrade the network delegate contract + _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) + if err != nil { t.Fatal(err) } -func TestGetEffectiveDelegate(t *testing.T) { + // Set use latest delegate + if _, err = mp.SetUseLatestDelegate(true, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } - // TODO + // Get use latest delegate + if useLatest, err := mp.GetUseLatestDelegate(nil); err != nil { + t.Fatal(err) + } else if !useLatest { + t.Error("GetUseLatestDelegate returned false after being set") + } + // Check effective delegate + if effectiveDelegate, err := mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != newDelegate { + t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } } - diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index b095ee8cf..d0e18b223 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -2,7 +2,6 @@ package minipool import ( "errors" - "fmt" "math/big" "github.com/ethereum/go-ethereum/common" From 0d4646a8930aa44e18090a5d0c467bc3c1ce70d1 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Jul 2021 11:29:12 +1000 Subject: [PATCH 365/878] Replace GetMinipoolNodeRewardAmount with CalculateNodePortion --- minipool/minipool-contract.go | 20 ++++++++++++++++++++ minipool/status.go | 16 ---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 8a0cb1946..1566ec5c6 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -502,6 +502,25 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e } +// Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties +func (mp *Minipool) CalculateNodePortion(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { + nodeAmount := new(*big.Int) + if err := mp.Contract.Call(opts, nodeAmount, "calculateNodePortion", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool node portion: %w", err) + } + return *nodeAmount, nil +} + +// Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties +func (mp *Minipool) CalculateUserPortion(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { + nodeAmount := new(*big.Int) + if err := mp.Contract.Call(opts, nodeAmount, "calculateUserPortion", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool user portion: %w", err) + } + return *nodeAmount, nil +} + + // Get a minipool contract var rocketMinipoolLock sync.Mutex func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { @@ -510,3 +529,4 @@ func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Addre return rp.MakeContract("rocketMinipool", minipoolAddress) } + diff --git a/minipool/status.go b/minipool/status.go index 08bc410c7..c8ff63903 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -2,30 +2,14 @@ package minipool import ( "fmt" - "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Get the node reward amount for a minipool by node fee, user deposit balance, and staking start & end balances -func GetMinipoolNodeRewardAmount(rp *rocketpool.RocketPool, nodeFee float64, userDepositBalance, startBalance, endBalance *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return nil, err - } - nodeAmount := new(*big.Int) - if err := rocketMinipoolStatus.Call(opts, nodeAmount, "getMinipoolNodeRewardAmount", eth.EthToWei(nodeFee), userDepositBalance, startBalance, endBalance); err != nil { - return nil, fmt.Errorf("Could not get minipool node reward amount: %w", err) - } - return *nodeAmount, nil -} - - // Estimate the gas of SubmitMinipoolWithdrawable func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) From ff42ee2b8a53deef05083b15231b6722209b1916 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 27 Jul 2021 21:30:04 -0400 Subject: [PATCH 366/878] Added a binding for GetNodeMaximumRPLStake --- node/staking.go | 14 ++++++++++++++ tests/testutils/minipool/minipool.go | 1 - 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/node/staking.go b/node/staking.go index eec159024..fd393b1cb 100644 --- a/node/staking.go +++ b/node/staking.go @@ -81,6 +81,20 @@ func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } +// Get a node's maximum RPL stake to collateralize their minipools +func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeMaximumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) + } + return *nodeMaximumRplStake, nil +} + + // Get the time a node last staked RPL func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index b095ee8cf..d0e18b223 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -2,7 +2,6 @@ package minipool import ( "errors" - "fmt" "math/big" "github.com/ethereum/go-ethereum/common" From ba903d996838654472349c7240be0e66d7e3b3ca Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Jul 2021 11:30:49 +1000 Subject: [PATCH 367/878] Rename local variable --- minipool/minipool-contract.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 1566ec5c6..4a7cf965b 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -513,11 +513,11 @@ func (mp *Minipool) CalculateNodePortion(balance *big.Int, opts *bind.CallOpts) // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties func (mp *Minipool) CalculateUserPortion(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { - nodeAmount := new(*big.Int) - if err := mp.Contract.Call(opts, nodeAmount, "calculateUserPortion", balance); err != nil { + userAmount := new(*big.Int) + if err := mp.Contract.Call(opts, userAmount, "calculateUserPortion", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) } - return *nodeAmount, nil + return *userAmount, nil } From beb9e4cc97f9ec964b6269354e10af0e3a57691b Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 28 Jul 2021 13:16:37 +1000 Subject: [PATCH 368/878] Fix method name --- minipool/minipool-contract.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 4a7cf965b..c3f759b76 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -503,18 +503,18 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties -func (mp *Minipool) CalculateNodePortion(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) - if err := mp.Contract.Call(opts, nodeAmount, "calculateNodePortion", balance); err != nil { + if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool node portion: %w", err) } return *nodeAmount, nil } // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties -func (mp *Minipool) CalculateUserPortion(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) - if err := mp.Contract.Call(opts, userAmount, "calculateUserPortion", balance); err != nil { + if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) } return *userAmount, nil From ef959ab12b639e8868cb41840c85e28b2ba7b327 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 28 Jul 2021 01:37:07 -0400 Subject: [PATCH 369/878] Added GetMinipoolCountPerStatus() --- minipool/minipool.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 563e33407..f48872eab 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -28,6 +28,16 @@ type MinipoolDetails struct { } +// The counts of minipools per status +type MinipoolCountsPerStatus struct { + Initialized *big.Int `abi:"initializedCount"` + Prelaunch *big.Int `abi:"prelaunchCount"` + Staking *big.Int `abi:"stakingCount"` + Withdrawable *big.Int `abi:"withdrawableCount"` + Dissolved *big.Int `abi:"dissolvedCount"` +} + + // Get all minipool details func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { minipoolAddresses, err := GetMinipoolAddresses(rp, opts) @@ -259,6 +269,20 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } +// Get the minipool count by status +func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, offset, limit uint64, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + minipoolCounts := new(MinipoolCountsPerStatus) + if err := rocketMinipoolManager.Call(opts, minipoolCounts, "getMinipoolCountPerStatus", big.NewInt(int64(offset)), big.NewInt(int64(limit))); err != nil { + return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + } + return *minipoolCounts, nil +} + + // Get a minipool address by index func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) From 27a7956ec17febda0baf6dad10109805ef7fbb88 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 29 Jul 2021 17:15:17 +1000 Subject: [PATCH 370/878] Change destroy to finalise on minipool contract methods --- minipool/minipool-contract.go | 28 ++++++++++++++-------------- tests/minipool/contract_test.go | 8 ++++---- tests/testutils/auction/auction.go | 4 ++-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index c3f759b76..5677f58b0 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -330,21 +330,21 @@ func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, err } -// Estimate the gas of DistributeBalanceAndDestroy -func (mp *Minipool) EstimateDistributeBalanceAndDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndDestroy") +// Estimate the gas of DistributeBalanceAndFinalise +func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") } // Distribute the minipool's ETH balance to the node operator and rETH staking pool, -// then destroys the minipool. +// then finalises the minipool // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool) DistributeBalanceAndDestroy(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "distributeBalanceAndDestroy") +func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for and destroy minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) } return hash, nil } @@ -398,17 +398,17 @@ func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { } -// Estimate the gas of Destroy -func (mp *Minipool) EstimateDestroyGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "destroy") +// Estimate the gas of Finalise +func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "finalise") } -// Destroy a minipool to get the RPL stake back -func (mp *Minipool) Destroy(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "destroy") +// Finalise a minipool to get the RPL stake back +func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "finalise") if err != nil { - return common.Hash{}, fmt.Errorf("Could not destroy minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) } return hash, nil } diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 20d3c96a6..27bfbcc9e 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -275,7 +275,7 @@ func TestClose(t *testing.T) { } -func TestDestroy(t *testing.T) { +func TestFinalise(t *testing.T) { // TODO @@ -373,7 +373,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { } -func TestWithdrawValidatorBalanceAndDestroy(t *testing.T) { +func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { // State snapshotting if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } @@ -418,8 +418,8 @@ func TestWithdrawValidatorBalanceAndDestroy(t *testing.T) { t.Fatal(err) } - // Call DistributeBalanceAndDestroy method - if _, err := mp.DistributeBalanceAndDestroy(nodeAccount.GetTransactor()); err != nil { + // Call DistributeBalanceAndFinalise method + if _, err := mp.DistributeBalanceAndFinalise(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index a00555f23..39551892a 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -35,8 +35,8 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { return err } if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount2.GetTransactor()); err != nil { return err } - // Distribute balance and destroy pool to send slashed RPL to auction contract - if _, err := mp.DistributeBalanceAndDestroy(trustedNodeAccount.GetTransactor()); err != nil { return err } + // Distribute balance and finalise pool to send slashed RPL to auction contract + if _, err := mp.DistributeBalanceAndFinalise(trustedNodeAccount.GetTransactor()); err != nil { return err } // Return return nil From 73fdad9a11faf9734c3295bd4354f823e5468d1b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 29 Jul 2021 20:20:31 -0400 Subject: [PATCH 371/878] Added active and finalised support --- minipool/minipool-contract.go | 7 +++++ minipool/minipool.go | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 5677f58b0..29eaa2157 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -121,6 +121,13 @@ func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { } return time.Unix((*statusTime).Int64(), 0), nil } +func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { + finalised := new(bool) + if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { + return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) + } + return *finalised, nil +} // Get deposit type diff --git a/minipool/minipool.go b/minipool/minipool.go index f48872eab..010c4298e 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -269,6 +269,34 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } +// Get the number of finalised minipools in the network +func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + + +// Get the number of active minipools in the network +func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + + // Get the minipool count by status func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, offset, limit uint64, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) @@ -311,6 +339,34 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, } +// Get the number of minipools owned by a node that are not finalised +func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + + +// Get the number of minipools owned by a node that are finalised +func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + + // Get a node's minipool address by index func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) From 8a10d11049f7107d20862faadf03eceb86280fa3 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 5 Aug 2021 15:11:02 +1000 Subject: [PATCH 372/878] Add methods to calculate lifetime rewards by iterating events --- rewards/node.go | 49 +++++++++++++++++++++++++++++++++++----- rewards/rewards.go | 10 ++++++++- rewards/trusted-node.go | 50 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 98 insertions(+), 11 deletions(-) diff --git a/rewards/node.go b/rewards/node.go index 6de2426c9..3781221d4 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -1,13 +1,15 @@ package rewards import ( - "math/big" - "sync" + "context" + "github.com/ethereum/go-ethereum" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Get whether node reward claims are enabled @@ -69,6 +71,43 @@ func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo return claim(rocketClaimNode, "node", opts) } +// Filters through token claim events and sums the total amount claimed by claimerAddress +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address) (*big.Int, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return nil, err + } + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil +} // Get contracts var rocketClaimNodeLock sync.Mutex diff --git a/rewards/rewards.go b/rewards/rewards.go index 48edcec6e..b16547792 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -3,8 +3,9 @@ package rewards import ( "fmt" "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -68,3 +69,10 @@ func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.Tr return hash, nil } +// Get contracts +var rocketRewardsPoolLock sync.Mutex +func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketRewardsPoolLock.Lock() + defer rocketRewardsPoolLock.Unlock() + return rp.GetContract("rocketRewardsPool") +} diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index edf2466d5..5cad1dc00 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -1,13 +1,15 @@ package rewards import ( - "math/big" - "sync" + "context" + "github.com/ethereum/go-ethereum" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Get whether trusted node reward claims are enabled @@ -70,6 +72,44 @@ func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) } +// Filters through token claim events and sums the total amount claimed by claimerAddress +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address) (*big.Int, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return nil, err + } + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil +} + // Get contracts var rocketClaimTrustedNodeLock sync.Mutex func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 6cd5caae3652d11cbe630d93c3a1118b3f542ee0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 5 Aug 2021 02:27:13 -0400 Subject: [PATCH 373/878] Started adding timezone count support --- node/node.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/node/node.go b/node/node.go index 84666c447..2fb37c054 100644 --- a/node/node.go +++ b/node/node.go @@ -32,6 +32,13 @@ type NodeDetails struct { } +// Count of nodes belonging to a timezone +type TimezoneCount struct { + Timezone string `abi:"timezone"` + Count *big.Int `abi:"count"` +} + + // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { @@ -176,6 +183,20 @@ func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error } +// Get a breakdown of the number of nodes per timezone +func GetNodeCountPerTimezone(rp *rocketpool.RocketPool, offset, limit *big.Int, opts *bind.CallOpts) ([]TimezoneCount, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return []TimezoneCount{}, err + } + timezoneCounts := new([]TimezoneCount) + if err := rocketNodeManager.Call(opts, timezoneCounts, "getNodeCountPerTimezone", offset, limit); err != nil { + return []TimezoneCount{}, fmt.Errorf("Could not get node count: %w", err) + } + return *timezoneCounts, nil +} + + // Get a node address by index func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { rocketNodeManager, err := getRocketNodeManager(rp) From 75ad8ecf821eeaf23cb1cab6a39a51401dd17f0a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 6 Aug 2021 02:27:17 -0400 Subject: [PATCH 374/878] Added some more bindings related to estimating rewards at the next checkpoint --- rewards/rewards.go | 62 ++++++++++++++++++++++++++++++++++++++++++++-- tokens/rpl.go | 14 +++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index b16547792..a2e7c4dd0 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -3,9 +3,10 @@ package rewards import ( "fmt" "math/big" - "sync" + "sync" + "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -69,6 +70,63 @@ func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.Tr return hash, nil } + +// Get the timestamp that the current rewards interval started +func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return time.Time{}, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { + return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + } + return time.Unix(int64((*unixTime).Uint64()), 0), nil +} + + +// Get the number of seconds in a claim interval +func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { + return 0, fmt.Errorf("Could not get claim interval time: %w", err) + } + return time.Duration((*unixTime).Int64()) * time.Second, nil +} + + +// Get the percent of checkpoint rewards that goes to node operators +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil +} + + +// Get the percent of checkpoint rewards that goes to ODAO members +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil +} + + // Get contracts var rocketRewardsPoolLock sync.Mutex func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tokens/rpl.go b/tokens/rpl.go index 567f1858b..de22e88f3 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -158,6 +158,20 @@ func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts * } +// Get the RPL inflation interval rate +func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + rate := new(*big.Int) + if err := rocketTokenRPL.Call(opts, rate, "getInflationIntervalRate"); err != nil { + return nil, fmt.Errorf("Could not get RPL inflation interval rate: %w", err) + } + return *rate, nil +} + + // // Contracts // From b925817d36e126e111cd629d68775d6c8eec87e3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 8 Aug 2021 14:50:40 -0400 Subject: [PATCH 375/878] Added timezone sanitization to node registration --- node/node.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/node/node.go b/node/node.go index 2fb37c054..93ec484ad 100644 --- a/node/node.go +++ b/node/node.go @@ -245,6 +245,10 @@ func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, if err != nil { return rocketpool.GasInfo{}, err } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } return rocketNodeManager.GetTransactionGasInfo(opts, "registerNode", timezoneLocation) } @@ -255,6 +259,10 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind if err != nil { return common.Hash{}, err } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } hash, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) if err != nil { return common.Hash{}, fmt.Errorf("Could not register node: %w", err) @@ -271,7 +279,7 @@ func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not parse timezone [%s]: %w", timezoneLocation, err) + return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) } return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) } @@ -285,7 +293,7 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return common.Hash{}, fmt.Errorf("Could not parse timezone [%s]: %w", timezoneLocation, err) + return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) } hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { From b0bbe982238e56971cdfd6e6347240f458b1449d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 8 Aug 2021 15:23:09 -0400 Subject: [PATCH 376/878] Added a first pass of node.GetNodeRegistrationTime() --- node/node.go | 37 +++++++++++++++++++++++++++++++++++++ rewards/node.go | 17 +++++++++-------- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/node/node.go b/node/node.go index 93ec484ad..482f061f8 100644 --- a/node/node.go +++ b/node/node.go @@ -1,11 +1,13 @@ package node import ( + "context" "fmt" "math/big" "sync" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -303,6 +305,41 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } +// Get the time when a node was first registered +func GetNodeRegistrationTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return time.Time{}, err + } + + // Construct a filter query for RocketNodeManager.NodeRegistered(address nodeAddress, uint256 time) + addressFilter := []common.Address{*rocketNodeManager.Address} + topicFilter := [][]common.Hash{{rocketNodeManager.ABI.Events["NodeRegistered"].ID}, {nodeAddress.Hash()}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return time.Time{}, err + } + + // If this address hasn't been registered, return nothing + if len(logs) == 0 { + return time.Time{}, nil + } + + // Get the node registration time + values := make(map[string]interface{}) + err = rocketNodeManager.ABI.Events["NodeRegistered"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { + return time.Time{}, err + } + unixTime := values["time"].(*big.Int) + time := time.Unix(unixTime.Int64(), 0) + return time, nil +} + + // Get contracts var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rewards/node.go b/rewards/node.go index 3781221d4..d7f3c3eff 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -1,15 +1,16 @@ package rewards import ( - "context" - "github.com/ethereum/go-ethereum" - "math/big" - "sync" + "context" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Get whether node reward claims are enabled @@ -84,7 +85,7 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm } // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketRewardsPool.Address} - // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) + // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ Addresses: addressFilter, From 1022d280278a39390ce50426304e125c51ecd5c8 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 8 Aug 2021 21:11:01 -0400 Subject: [PATCH 377/878] Replaced the event-based GetNodeRegistrationTime() with one that uses RocketRewardsPool.getClaimingContractUserRegisteredTime() --- node/node.go | 37 ------------------------------------- rewards/node.go | 7 +++++++ rewards/rewards.go | 14 ++++++++++++++ rewards/trusted-node.go | 22 +++++++++++++++------- 4 files changed, 36 insertions(+), 44 deletions(-) diff --git a/node/node.go b/node/node.go index 482f061f8..93ec484ad 100644 --- a/node/node.go +++ b/node/node.go @@ -1,13 +1,11 @@ package node import ( - "context" "fmt" "math/big" "sync" "time" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -305,41 +303,6 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } -// Get the time when a node was first registered -func GetNodeRegistrationTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return time.Time{}, err - } - - // Construct a filter query for RocketNodeManager.NodeRegistered(address nodeAddress, uint256 time) - addressFilter := []common.Address{*rocketNodeManager.Address} - topicFilter := [][]common.Hash{{rocketNodeManager.ABI.Events["NodeRegistered"].ID}, {nodeAddress.Hash()}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - }) - if err != nil { - return time.Time{}, err - } - - // If this address hasn't been registered, return nothing - if len(logs) == 0 { - return time.Time{}, nil - } - - // Get the node registration time - values := make(map[string]interface{}) - err = rocketNodeManager.ABI.Events["NodeRegistered"].Inputs.UnpackIntoMap(values, logs[0].Data) - if err != nil { - return time.Time{}, err - } - unixTime := values["time"].(*big.Int) - time := time.Unix(unixTime.Int64(), 0) - return time, nil -} - - // Get contracts var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rewards/node.go b/rewards/node.go index d7f3c3eff..818f7c5c8 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -4,6 +4,7 @@ import ( "context" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum" @@ -110,6 +111,12 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm return sum, nil } + +// Get the time that the user registered as a claimer +func GetNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts) +} + // Get contracts var rocketClaimNodeLock sync.Mutex func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rewards/rewards.go b/rewards/rewards.go index a2e7c4dd0..8e4c4bbb2 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -55,6 +55,20 @@ func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName strin } +// Get the time that the user registered as a claimer +func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return time.Time{}, err + } + claimTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { + return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) + } + return time.Unix((*claimTime).Int64(), 0), nil +} + + // Estimate the gas of claim func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return claimsContract.GetTransactionGasInfo(opts, "claim") diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 5cad1dc00..76967e2bc 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -1,15 +1,17 @@ package rewards import ( - "context" - "github.com/ethereum/go-ethereum" - "math/big" - "sync" + "context" + "math/big" + "sync" + "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Get whether trusted node reward claims are enabled @@ -110,6 +112,12 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre return sum, nil } + +// Get the time that the user registered as a claimer +func GetTrustedNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts) +} + // Get contracts var rocketClaimTrustedNodeLock sync.Mutex func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From e0c2900432d62e5c5d53e2b2ec07e4e0b8f1d059 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 10 Aug 2021 16:27:47 +1000 Subject: [PATCH 378/878] Add a util to query logs from all past version of a contract --- utils/eth/logs.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 utils/eth/logs.go diff --git a/utils/eth/logs.go b/utils/eth/logs.go new file mode 100644 index 000000000..3f32f1d55 --- /dev/null +++ b/utils/eth/logs.go @@ -0,0 +1,56 @@ +package eth + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +type FilterQuery struct { + BlockHash *common.Hash + FromBlock *big.Int + ToBlock *big.Int + Topics [][]common.Hash +} + +func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q FilterQuery) ([]types.Log, error) { + rocketDaoNodeTrustedUpgrade, err := rp.GetContract("rocketDAONodeTrustedUpgrade") + if err != nil { + return nil, err + } + // Get all the addresses this contract has ever been deployed at + addresses := make([]common.Address, 0) + // Construct a filter to query ContractUpgraded event + addressFilter := []common.Address{*rocketDaoNodeTrustedUpgrade.Address} + topicFilter := [][]common.Hash{{rocketDaoNodeTrustedUpgrade.ABI.Events["ContractUpgraded"].ID}, {crypto.Keccak256Hash([]byte(contractName))}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return nil, err + } + // Interate the logs and store every past contract address + for _, log := range logs { + addresses = append(addresses, common.HexToAddress(log.Topics[2].Hex())) + } + // Append current address + currentAddress, err := rp.GetAddress(contractName) + if err != nil { + return nil, err + } + addresses = append(addresses, *currentAddress) + // Perform the desired getLogs call and return results + return rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + BlockHash: q.BlockHash, + Addresses: addresses, + FromBlock: q.FromBlock, + ToBlock: q.ToBlock, + Topics: q.Topics, + }) +} From cf6120da2c74bd8cf39fdea7e0051e0f9dbfc398 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 11 Aug 2021 14:54:10 +1000 Subject: [PATCH 379/878] Add trusted node participation calculators --- go.mod | 1 + node/node.go | 311 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 300 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 37f1d7814..ab239b259 100644 --- a/go.mod +++ b/go.mod @@ -12,4 +12,5 @@ require ( github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c + gonum.org/v1/gonum v0.9.3 ) diff --git a/node/node.go b/node/node.go index 2fb37c054..3e9f0c43e 100644 --- a/node/node.go +++ b/node/node.go @@ -1,18 +1,24 @@ package node import ( - "fmt" - "math/big" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "context" + "fmt" + "github.com/ethereum/go-ethereum" + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "gonum.org/v1/gonum/mathext" + "math" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) // Settings @@ -38,6 +44,17 @@ type TimezoneCount struct { Count *big.Int `abi:"count"` } +// The results of the trusted node participation calculation +type TrustedNodeParticipation struct { + StartBlock uint64 + UpdateFrequency uint64 + UpdateCount uint64 + Probability float64 + ExpectedSubmissions float64 + ActualSubmissions map[common.Address]float64 + Participation map[common.Address][]bool +} + // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { @@ -294,6 +311,256 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt return hash, nil } +// Filters through and counts price submissions by node +func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (uint64, error) { + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return 0, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + FromBlock: big.NewInt(int64(fromBlock)), + }) + if err != nil { + return 0, err + } + return uint64(len(logs)), nil +} + +// Returns an array of block numbers for submissions the given trusted node has submitted since fromBlock +func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (*[]uint64, error) { + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + FromBlock: big.NewInt(int64(fromBlock)), + }) + if err != nil { + return nil, err + } + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkBalances.ABI.Events["BalancesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil +} + +// Returns the most recent block number that the number of trusted nodes changed +func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool) (uint64, error) { + // Get contracts + rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return 0, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} + topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return 0, err + } + for i := range(logs) { + log := logs[len(logs) - i - 1] + if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { + values := make(map[string]interface{}) + // Decode the event + if rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return 0, err + } + if values["success"].(bool) { + return log.BlockNumber, nil + } + } else { + return log.BlockNumber, nil + } + } + + return 0, nil +} + +// Calculates the participation rate of every trusted node on price submission since the last block that member count changed +func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { + // Get the block of the most recent member join + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp) + if err != nil { + return nil, err + } + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock / updatePricesFrequency + 1) * updatePricesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount) / 2 + 1) + // The number of intervals passed + intervalsPassed := (currentBlockNumber - startBlock) / updatePricesFrequency + 1 + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range(members) { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if (intervalsPassed > 0) { + blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + actual = len(*blocks) + if err != nil { + return nil, err + } + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block % updatePricesFrequency == 0 { + index := block / updatePricesFrequency - startBlock / updatePricesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if (intervalsPassed > 0){ + probability = 1 - mathext.GammaIncReg(float64(len(members) - 1) / 2, chi/2) + } + // Construct return value + participation := TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updatePricesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil +} + +// Calculates the participation rate of every trusted node on balance submission since the last block that member count changed +func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { + // Get the block of the most recent member join + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp) + if err != nil { + return nil, err + } + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock / updateBalancesFrequency + 1) * updateBalancesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount) / 2 + 1) + // The number of intervals passed + intervalsPassed := (currentBlockNumber - startBlock) / updateBalancesFrequency + 1 + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range(members) { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if (intervalsPassed > 0) { + blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + actual = len(*blocks) + if err != nil { + return nil, err + } + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block % updateBalancesFrequency == 0 { + index := block / updateBalancesFrequency - startBlock / updateBalancesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if (intervalsPassed > 0){ + probability = 1 - mathext.GammaIncReg(float64(len(members) - 1) / 2, chi/2) + } + // Construct return value + participation := TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updateBalancesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil +} // Get contracts var rocketNodeManagerLock sync.Mutex @@ -303,3 +570,23 @@ func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, erro return rp.GetContract("rocketNodeManager") } +var rocketNetworkPricesLock sync.Mutex +func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + return rp.GetContract("rocketNetworkPrices") +} + +var rocketNetworkBalancesLock sync.Mutex +func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances") +} + +var rocketDAONodeTrustedActionsLock sync.Mutex +func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDAONodeTrustedActionsLock.Lock() + defer rocketDAONodeTrustedActionsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedActions") +} From 56a3d2206756e66f248be191d1b7a7c035731d15 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 12 Aug 2021 09:22:05 +1000 Subject: [PATCH 380/878] Limit event filter to past 200 intervals --- node/node.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/node/node.go b/node/node.go index 2d4e25330..e13934a4c 100644 --- a/node/node.go +++ b/node/node.go @@ -370,8 +370,8 @@ func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address return ×tamps, nil } -// Returns the most recent block number that the number of trusted nodes changed -func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool) (uint64, error) { +// Returns the most recent block number that the number of trusted nodes changed since fromBlock +func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64) (uint64, error) { // Get contracts rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { @@ -381,6 +381,7 @@ func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool) (uint64, error) addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + FromBlock: big.NewInt(int64(fromBlock)), Addresses: addressFilter, Topics: topicFilter, }) @@ -402,17 +403,11 @@ func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool) (uint64, error) return log.BlockNumber, nil } } - - return 0, nil + return fromBlock, nil } // Calculates the participation rate of every trusted node on price submission since the last block that member count changed func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the block of the most recent member join - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp) - if err != nil { - return nil, err - } // Get the update frequency updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) if err != nil { @@ -424,6 +419,12 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi return nil, err } currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 200 intervals) + minBlock := (currentBlockNumber / updatePricesFrequency - 200) * updatePricesFrequency + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) + if err != nil { + return nil, err + } // Get the number of current members memberCount, err := trustednode.GetMemberCount(rp, nil) if err != nil { @@ -490,11 +491,6 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi // Calculates the participation rate of every trusted node on balance submission since the last block that member count changed func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the block of the most recent member join - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp) - if err != nil { - return nil, err - } // Get the update frequency updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) if err != nil { @@ -506,6 +502,12 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * return nil, err } currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 200 intervals) + minBlock := (currentBlockNumber / updateBalancesFrequency - 200) * updateBalancesFrequency + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) + if err != nil { + return nil, err + } // Get the number of current members memberCount, err := trustednode.GetMemberCount(rp, nil) if err != nil { From 2606b5e84535087cf6c07f3a47c4468ab636dae9 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 12 Aug 2021 12:08:07 +1000 Subject: [PATCH 381/878] Fix overflow in participation calculation --- node/node.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/node/node.go b/node/node.go index e13934a4c..4cdaf9e7e 100644 --- a/node/node.go +++ b/node/node.go @@ -434,8 +434,12 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi startBlock := (latestMemberCountChangedBlock / updatePricesFrequency + 1) * updatePricesFrequency // The number of members that have to submit each interval consensus := math.Floor(float64(memberCount) / 2 + 1) - // The number of intervals passed - intervalsPassed := (currentBlockNumber - startBlock) / updatePricesFrequency + 1 + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber - startBlock) / updatePricesFrequency + 1 + } // How many submissions would we expect per member given a random submission expected := float64(intervalsPassed) * consensus / float64(memberCount) // Get trusted members @@ -517,8 +521,12 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * startBlock := (latestMemberCountChangedBlock / updateBalancesFrequency + 1) * updateBalancesFrequency // The number of members that have to submit each interval consensus := math.Floor(float64(memberCount) / 2 + 1) - // The number of intervals passed - intervalsPassed := (currentBlockNumber - startBlock) / updateBalancesFrequency + 1 + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber - startBlock) / updateBalancesFrequency + 1 + } // How many submissions would we expect per member given a random submission expected := float64(intervalsPassed) * consensus / float64(memberCount) // Get trusted members From baf37bcfbd62ab69daccb020f129c31ad47286e2 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 17 Aug 2021 15:30:16 +1000 Subject: [PATCH 382/878] Reduce participation interval log query size --- node/node.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/node/node.go b/node/node.go index 4cdaf9e7e..af31a3de7 100644 --- a/node/node.go +++ b/node/node.go @@ -419,8 +419,8 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi return nil, err } currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 200 intervals) - minBlock := (currentBlockNumber / updatePricesFrequency - 200) * updatePricesFrequency + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber / updatePricesFrequency - 50) * updatePricesFrequency latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) if err != nil { return nil, err @@ -506,8 +506,8 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * return nil, err } currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 200 intervals) - minBlock := (currentBlockNumber / updateBalancesFrequency - 200) * updateBalancesFrequency + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber / updateBalancesFrequency - 50) * updateBalancesFrequency latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) if err != nil { return nil, err From 9ae52237d306e2babec6f2eb1db09b44ccb9e281 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 17 Aug 2021 16:28:55 +1000 Subject: [PATCH 383/878] Fix potential defreference of nil after error --- node/node.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/node.go b/node/node.go index af31a3de7..285a299c3 100644 --- a/node/node.go +++ b/node/node.go @@ -457,10 +457,10 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi actual := 0 if (intervalsPassed > 0) { blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) - actual = len(*blocks) if err != nil { return nil, err } + actual = len(*blocks) delta := float64(actual) - expected chi += (delta * delta) / expected // Add to participation table @@ -544,10 +544,10 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * actual := 0 if (intervalsPassed > 0) { blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) - actual = len(*blocks) if err != nil { return nil, err } + actual = len(*blocks) delta := float64(actual) - expected chi += (delta * delta) / expected // Add to participation table From 40f14683e3605e091c1af013b6465f656c91b4ce Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 25 Aug 2021 23:40:36 -0400 Subject: [PATCH 384/878] Updated dependencies --- go.mod | 12 +++--- go.sum | 127 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 106 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index ab239b259..099fb6854 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module github.com/rocket-pool/rocketpool-go go 1.13 require ( - github.com/btcsuite/btcd v0.21.0-beta // indirect - github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/ethereum/go-ethereum v1.10.6 - github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 // indirect - github.com/minio/highwayhash v1.0.1 // indirect + github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/ethereum/go-ethereum v1.10.8 + github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9 // indirect + github.com/minio/highwayhash v1.0.2 // indirect github.com/protolambda/zssz v0.1.5 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c gonum.org/v1/gonum v0.9.3 diff --git a/go.sum b/go.sum index 087fc497b..311a2e454 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,7 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -34,7 +35,6 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -61,12 +61,13 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -90,6 +91,7 @@ github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3h github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -98,8 +100,10 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= @@ -108,35 +112,49 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.6 h1:bfx3rqWgw768vn6ioxTk8pPNe4IaRzVgRlrS35B43es= -github.com/ethereum/go-ethereum v1.10.6/go.mod h1:iY/t0vHSmaAOC+xlqvAAeHdGSWNFkfSnN0OhMTDYz90= +github.com/ethereum/go-ethereum v1.10.8 h1:0UP5WUR8hh46ffbjJV7PK499+uGEyasRIfffS0vy06o= +github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9 h1:9VDpsWq096+oGMDTT/SgBD/VgZYf4pTF+KTPmZ+OaKM= -github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= +github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9 h1:EMcYdPKfgZm1PyumuDkMwZUbx43bvF0T/oFPQ/e64rI= +github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -146,6 +164,7 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -167,6 +186,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -188,6 +208,7 @@ github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= @@ -200,15 +221,18 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda h1:Vofqyy/Ysqit++X33unU0Gr08b6P35hKm3juytDrBVI= -github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= @@ -227,6 +251,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= @@ -247,24 +272,33 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= -github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= @@ -295,9 +329,10 @@ github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mo github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -320,8 +355,8 @@ github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342 h1:SMro7Z5L2ACvcKREIVJDn8LvoVTY1TY2rTlPJmDlUWc= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210121075346-fee7b721f342/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= @@ -331,6 +366,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -340,7 +376,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -353,6 +388,7 @@ github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= @@ -365,6 +401,9 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -384,6 +423,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -393,12 +434,20 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -432,10 +481,13 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -458,6 +510,7 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -465,33 +518,46 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -510,6 +576,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -527,9 +594,14 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -586,8 +658,9 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= From 3a042e9ce13d163ddfa2308ab77b6b48d8d16ae5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 25 Aug 2021 23:40:49 -0400 Subject: [PATCH 385/878] Changed gas estimation to provide a range --- rocketpool/contract.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index b4e194569..75bffa14a 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -36,6 +36,7 @@ type Contract struct { type GasInfo struct { EstGasPrice *big.Int `json:"estGasPrice"` EstGasLimit uint64 `json:"estGasLimit"` + SafeGasLimit uint64 `json:"safeGasLimit"` ReqGasPrice *big.Int `json:"reqGasPrice"` ReqGasLimit uint64 `json:"reqGasLimit"` } @@ -65,11 +66,12 @@ func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, } // Estimate gas limit - estGasLimit, err := c.estimateGasLimit(opts, input) + estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, input) if err != nil { return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) } response.EstGasLimit = estGasLimit + response.SafeGasLimit = safeGasLimit // Estimate gas price estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) @@ -91,11 +93,11 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in if err != nil { return common.Hash{}, fmt.Errorf("Could not encode input data: %w", err) } - gasLimit, err := c.estimateGasLimit(opts, input) + _, safeGasLimit, err := c.estimateGasLimit(opts, input) if err != nil { return common.Hash{}, err } - opts.GasLimit = gasLimit + opts.GasLimit = safeGasLimit } // Send transaction @@ -119,11 +121,12 @@ func (c *Contract) GetTransferGasInfo(opts *bind.TransactOpts) (GasInfo, error) } // Estimate gas limit - estGasLimit, err := c.estimateGasLimit(opts, []byte{}) + estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) if err != nil { return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas limit: %w", err) } response.EstGasLimit = estGasLimit + response.SafeGasLimit = safeGasLimit // Estimate gas price estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) @@ -141,11 +144,11 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { // Estimate gas limit if opts.GasLimit == 0 { - gasLimit, err := c.estimateGasLimit(opts, []byte{}) + _, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) if err != nil { return common.Hash{}, err } - opts.GasLimit = gasLimit + opts.GasLimit = safeGasLimit } // Send transaction @@ -159,8 +162,8 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { } -// Estimate the gas limit for a contract transaction -func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, error) { +// Estimate the expected and safe gas limits for a contract transaction +func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, uint64, error) { // Estimate gas limit gasLimit, err := c.Client.EstimateGas(context.Background(), ethereum.CallMsg{ @@ -171,13 +174,14 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint Data: input, }) if err != nil { - return 0, fmt.Errorf("Could not estimate gas needed: %w", err) + return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) } // Pad and return gas limit - gasLimit = uint64(float64(gasLimit) * GasLimitMultiplier) + safeGasLimit := uint64(float64(gasLimit) * GasLimitMultiplier) if gasLimit > MaxGasLimit { gasLimit = MaxGasLimit } - return gasLimit, nil + if safeGasLimit > MaxGasLimit { safeGasLimit = MaxGasLimit } + return gasLimit, safeGasLimit, nil } From 074ad533113ac59b764700447eb95e78f9c9124a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 29 Aug 2021 23:12:32 -0400 Subject: [PATCH 386/878] Added safeGasLimit to sending ETH --- utils/eth/transactions.go | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index b4946cb0e..cacbafe88 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -45,6 +45,7 @@ func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Addre return rocketpool.GasInfo{}, err } response.EstGasLimit = gasLimit + response.SafeGasLimit = gasLimit return response, err } From 254eca4ca450adb778bc07d089f5f75d70d67172 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 31 Aug 2021 12:26:00 +1000 Subject: [PATCH 387/878] Fix prices participation metric functions --- node/node.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/node/node.go b/node/node.go index 285a299c3..4dbafafeb 100644 --- a/node/node.go +++ b/node/node.go @@ -319,12 +319,12 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt return hash, nil } -// Filters through and counts price submissions by node -func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (uint64, error) { +// Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock +func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (*[]uint64, error) { // Get contracts rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { - return 0, err + return nil, err } // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketNetworkPrices.Address} @@ -335,13 +335,22 @@ func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Addre FromBlock: big.NewInt(int64(fromBlock)), }) if err != nil { - return 0, err + return nil, err } - return uint64(len(logs)), nil + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkPrices.ABI.Events["PricesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil } -// Returns an array of block numbers for submissions the given trusted node has submitted since fromBlock -func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (*[]uint64, error) { +// Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock +func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (*[]uint64, error) { // Get contracts rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { @@ -456,7 +465,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if (intervalsPassed > 0) { - blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + blocks, err := GetPricesSubmissions(rp, member.Address, startBlock) if err != nil { return nil, err } @@ -543,7 +552,7 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if (intervalsPassed > 0) { - blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock) if err != nil { return nil, err } From 5cd6e96fd8b3e1824663c3ee5f576bfe64c144e2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Sep 2021 22:45:04 -0400 Subject: [PATCH 388/878] Added support for event log intervals --- node/node.go | 82 ++++++++++++++++++++--------------------- rewards/node.go | 14 +++---- rewards/trusted-node.go | 14 +++---- utils/eth/logs.go | 71 +++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 58 deletions(-) diff --git a/node/node.go b/node/node.go index 285a299c3..35ae0dbc1 100644 --- a/node/node.go +++ b/node/node.go @@ -1,24 +1,25 @@ package node import ( - "context" - "fmt" - "github.com/ethereum/go-ethereum" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "gonum.org/v1/gonum/mathext" - "math" - "math/big" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "context" + "fmt" + "math" + "math/big" + "sync" + "time" + + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "gonum.org/v1/gonum/mathext" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) // Settings @@ -320,7 +321,7 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } // Filters through and counts price submissions by node -func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (uint64, error) { +func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (uint64, error) { // Get contracts rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { @@ -329,19 +330,18 @@ func GetPriceSubmissionCount(rp *rocketpool.RocketPool, nodeAddress common.Addre // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketNetworkPrices.Address} topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - FromBlock: big.NewInt(int64(fromBlock)), - }) + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) if err != nil { return 0, err } + return uint64(len(logs)), nil } // Returns an array of block numbers for submissions the given trusted node has submitted since fromBlock -func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64) (*[]uint64, error) { +func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { // Get contracts rocketNetworkBalances, err := getRocketNetworkBalances(rp) if err != nil { @@ -350,14 +350,13 @@ func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketNetworkBalances.Address} topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - FromBlock: big.NewInt(int64(fromBlock)), - }) + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) if err != nil { return nil, err } + timestamps := make([]uint64, len(logs)) for i, log := range logs { values := make(map[string]interface{}) @@ -371,7 +370,7 @@ func GetBalanceSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address } // Returns the most recent block number that the number of trusted nodes changed since fromBlock -func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64) (uint64, error) { +func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) (uint64, error) { // Get contracts rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) if err != nil { @@ -380,14 +379,13 @@ func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint6 // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - FromBlock: big.NewInt(int64(fromBlock)), - Addresses: addressFilter, - Topics: topicFilter, - }) + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) if err != nil { return 0, err } + for i := range(logs) { log := logs[len(logs) - i - 1] if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { @@ -407,7 +405,7 @@ func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint6 } // Calculates the participation rate of every trusted node on price submission since the last block that member count changed -func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { +func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { // Get the update frequency updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) if err != nil { @@ -421,7 +419,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi currentBlockNumber := currentBlock.Number.Uint64() // Get the block of the most recent member join (limiting to 50 intervals) minBlock := (currentBlockNumber / updatePricesFrequency - 50) * updatePricesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) if err != nil { return nil, err } @@ -456,7 +454,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if (intervalsPassed > 0) { - blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock, intervalSize) if err != nil { return nil, err } @@ -494,7 +492,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, opts *bi } // Calculates the participation rate of every trusted node on balance submission since the last block that member count changed -func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { +func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { // Get the update frequency updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) if err != nil { @@ -508,7 +506,7 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * currentBlockNumber := currentBlock.Number.Uint64() // Get the block of the most recent member join (limiting to 50 intervals) minBlock := (currentBlockNumber / updateBalancesFrequency - 50) * updateBalancesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock) + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) if err != nil { return nil, err } @@ -543,7 +541,7 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, opts * participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if (intervalsPassed > 0) { - blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock) + blocks, err := GetBalanceSubmissions(rp, member.Address, startBlock, intervalSize) if err != nil { return nil, err } diff --git a/rewards/node.go b/rewards/node.go index 818f7c5c8..36aca47bd 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -1,17 +1,15 @@ package rewards import ( - "context" "math/big" "sync" "time" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Get whether node reward claims are enabled @@ -74,7 +72,7 @@ func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address) (*big.Int, error) { +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int) (*big.Int, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -88,13 +86,13 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm addressFilter := []common.Address{*rocketRewardsPool.Address} // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - }) + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil) if err != nil { return nil, err } + // Iterate over the logs and sum the amount sum := big.NewInt(0) for _, log := range logs { diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 76967e2bc..8eabc2765 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -1,17 +1,15 @@ package rewards import ( - "context" "math/big" "sync" "time" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Get whether trusted node reward claims are enabled @@ -75,7 +73,7 @@ func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address) (*big.Int, error) { +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int) (*big.Int, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -89,13 +87,13 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre addressFilter := []common.Address{*rocketRewardsPool.Address} // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - }) + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil) if err != nil { return nil, err } + // Iterate over the logs and sum the amount sum := big.NewInt(0) for _, log := range logs { diff --git a/utils/eth/logs.go b/utils/eth/logs.go index 3f32f1d55..90159c2df 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -54,3 +54,74 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter Topics: q.Topics, }) } + + +// Gets the logs for a particular log request, breaking the calls into batches if necessary +func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFilter [][]common.Hash, intervalSize, fromBlock *big.Int) ([]types.Log, error) { + var logs []types.Log + + // Get the block that Rocket Pool was deployed on as the lower bound if one wasn't specified + if fromBlock == nil { + var err error + deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) + fromBlock, err = rp.RocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return nil, err + } + } + + if intervalSize == nil { + // Handle unlimited intervals with a single call + logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + }) + if err != nil { + return nil, err + } + return logs, nil + } else { + // Get the latest block + latestBlockUint, err := rp.Client.BlockNumber(context.Background()) + if err != nil { + return nil, err + } + latestBlock := big.NewInt(0) + latestBlock.SetUint64(latestBlockUint) + + // Set the start and end, clamping on the latest block + intervalSize.Sub(intervalSize, big.NewInt(1)) + start := fromBlock + end := big.NewInt(0).Add(start, intervalSize) + if end.Cmp(latestBlock) == 1 { + end = latestBlock + } + for { + // Get the logs using the current interval + newLogs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ + Addresses: addressFilter, + Topics: topicFilter, + FromBlock: start, + ToBlock: end, + }) + if err != nil { + return nil, err + } + + // Append the logs to the total list + logs = append(logs, newLogs...) + + // Return once we've finished iterating + if end.Cmp(latestBlock) == 0 { + return logs, nil + } + + // Update to the next interval (end+1 : that + interval - 1) + start.Add(end, big.NewInt(1)) + end.Add(start, intervalSize) + if end.Cmp(latestBlock) == 1 { + end = latestBlock + } + } + } +} \ No newline at end of file From 48ad2d239e1d519acd4cc734e850486a2a78c283 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 16 Sep 2021 01:57:38 -0400 Subject: [PATCH 389/878] Added a docs generator --- .gitignore | 4 +- docs/docgen.go | 89 ++++++++++++++++++++++ go.mod | 3 +- go.sum | 200 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 294 insertions(+), 2 deletions(-) create mode 100644 docs/docgen.go diff --git a/.gitignore b/.gitignore index 723ef36f4..c52e32f31 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.idea \ No newline at end of file +.idea +docs/*.md +docs/docs diff --git a/docs/docgen.go b/docs/docgen.go new file mode 100644 index 000000000..3edd05950 --- /dev/null +++ b/docs/docgen.go @@ -0,0 +1,89 @@ +package main + +import ( + "fmt" + "go/build" + "os" + + "github.com/princjef/gomarkdoc" + "github.com/princjef/gomarkdoc/lang" + "github.com/princjef/gomarkdoc/logger" +) + +const repo string = "https://github.com/rocket-pool/rocketpool-go" +const branch string = "release" + +func main() { + + // gomarkdoc's logger + log := logger.New(logger.DebugLevel) + + // Make a new doc renderer + renderer, err := gomarkdoc.NewRenderer() + if err != nil { + fmt.Printf("Error creating renderer: %s\n", err.Error()) + os.Exit(1) + } + + // Get the working directory + wd, err := os.Getwd() + if err != nil { + fmt.Printf("Error getting working directory: %s\n", err.Error()) + os.Exit(1) + } + + // These are all of the packages to generate the source for + packages := map[string]string{ + "auction": "%s/../auction", + "contracts": "%s/../contracts", + "dao": "%s/../dao", + "deposit": "%s/../deposit", + "minipool": "%s/../minipool", + "network": "%s/../network", + "node": "%s/../node", + "rewards": "%s/../rewards", + "rocketpool": "%s/../rocketpool", + "settings-protocol": "%s/../settings/protocol", + "settings-trustednode": "%s/../settings/trustednode", + "storage": "%s/../storage", + "tokens": "%s/../tokens", + "types": "%s/../types", + "utils": "%s/../utils", + } + + // Build the documentation file for each package + for filename, path := range packages { + + // Load the source dir + builder, err := build.ImportDir(fmt.Sprintf(path, wd), build.ImportComment) + if err != nil { + fmt.Printf("Error loading package builder for %s: %s\n", filename, err.Error()) + os.Exit(1) + } + + // Create a package from the source + pkg, err := lang.NewPackageFromBuild(log, builder, lang.PackageWithRepositoryOverrides(&lang.Repo{ + Remote: repo, + DefaultBranch: branch, + })) + if err != nil { + fmt.Printf("Error creating package %s: %s\n", filename, err.Error()) + os.Exit(1) + } + + // Render the documentation for the package + packageContents, err := renderer.Package(pkg) + if err != nil { + fmt.Printf("Error exporting package %s: %s\n", filename, err.Error()) + os.Exit(1) + } + + // Write the docs out to the appropriate file + err = os.WriteFile(fmt.Sprintf("%s/%s.md", wd, filename), []byte(packageContents), 0644) + if err != nil { + fmt.Printf("Error writing file for package %s: %s\n", filename, err.Error()) + os.Exit(1) + } + } + +} \ No newline at end of file diff --git a/go.mod b/go.mod index 099fb6854..49dbe4e8b 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,9 @@ require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/ethereum/go-ethereum v1.10.8 - github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9 // indirect + github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 // indirect github.com/minio/highwayhash v1.0.2 // indirect + github.com/princjef/gomarkdoc v0.2.1 github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 diff --git a/go.sum b/go.sum index 311a2e454..c05fc397d 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbf cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= @@ -35,19 +36,32 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= @@ -59,6 +73,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxq github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -83,6 +99,11 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb v2.0.7+incompatible h1:gLKifR1UkZ/kLkda5gC0K6c8g+jU2sINPtBeOiNlMhU= +github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= +github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= +github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -90,7 +111,14 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -117,15 +145,24 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.10.8 h1:0UP5WUR8hh46ffbjJV7PK499+uGEyasRIfffS0vy06o= github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= +github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9 h1:EMcYdPKfgZm1PyumuDkMwZUbx43bvF0T/oFPQ/e64rI= github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= +github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 h1:6dVcS0LktRSyEEgldFY4N9J17WjUoiJStttH+RZj0Wo= +github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -136,6 +173,7 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -143,6 +181,15 @@ github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0 github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= +github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= @@ -161,11 +208,13 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -212,10 +261,31 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= @@ -225,6 +295,8 @@ github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= @@ -239,11 +311,15 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -256,6 +332,10 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= @@ -264,51 +344,80 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM52 github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -319,15 +428,20 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= @@ -338,18 +452,27 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/princjef/gomarkdoc v0.2.1 h1:/I0mbQUwpQ2yMC6Sd1ATep/icirzVpiRfhcuiSlOjDg= +github.com/princjef/gomarkdoc v0.2.1/go.mod h1:k16wbqWczV/LpfLxcv3G4y0qFtM2f4wicmmZBNzyFLc= +github.com/princjef/mageutil v0.1.0 h1:WXB92nDhPh8oKR7woRWCriDFeF75mYZ6JwDUxo8DJ34= +github.com/princjef/mageutil v0.1.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -360,26 +483,52 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -391,6 +540,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -398,6 +548,7 @@ github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= @@ -405,19 +556,30 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -427,6 +589,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -467,7 +631,10 @@ golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -482,10 +649,13 @@ golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -503,9 +673,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -520,14 +692,18 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -538,13 +714,18 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -558,6 +739,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -578,6 +760,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -640,19 +823,34 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v2 v2.0.7/go.mod h1:0CiZ1p8pvtxBlQpLXkHuUTpdJ1shm3OqCF1QugkjHL4= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fatih/color.v1 v1.7.0/go.mod h1:P7yosIhqIl/sX8J8UypY5M+dDpD2KmyfP5IRs5v/fo0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mattn/go-colorable.v0 v0.1.0/go.mod h1:BVJlBXzARQxdi3nZo6f6bnl5yR20/tOL6p+V0KejgSY= +gopkg.in/mattn/go-isatty.v0 v0.0.4/go.mod h1:wt691ab7g0X4ilKZNmMII3egK0bTxl37fEn/Fwbd8gc= +gopkg.in/mattn/go-runewidth.v0 v0.0.4/go.mod h1:BmXejnxvhwdaATwiJbB1vZ2dtXkQKZGu9yLFCZb4msQ= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -670,5 +868,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= +mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 91268aa4e48e3c78091c2f62996c3f8fa6f3dbb4 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Sep 2021 01:01:54 -0400 Subject: [PATCH 390/878] Fixed a bug in GetLogs --- utils/eth/logs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/eth/logs.go b/utils/eth/logs.go index 90159c2df..8179d2123 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -75,6 +75,7 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ Addresses: addressFilter, Topics: topicFilter, + FromBlock: fromBlock, }) if err != nil { return nil, err From db82b19fd6b291d9297aa0af5cd17fde3d82edce Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Sep 2021 01:38:40 -0400 Subject: [PATCH 391/878] Added interval support to FilterContractLogs --- node/node.go | 6 +++--- rewards/node.go | 2 +- rewards/trusted-node.go | 2 +- utils/eth/logs.go | 42 +++++++++++++++++++---------------------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/node/node.go b/node/node.go index e07e88f71..dda2f6e53 100644 --- a/node/node.go +++ b/node/node.go @@ -332,7 +332,7 @@ func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) if err != nil { return nil, err } @@ -360,7 +360,7 @@ func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Addres topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) if err != nil { return nil, err } @@ -389,7 +389,7 @@ func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint6 topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock))) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) if err != nil { return 0, err } diff --git a/rewards/node.go b/rewards/node.go index 36aca47bd..13d41259a 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -88,7 +88,7 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil, nil, nil) if err != nil { return nil, err } diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 8eabc2765..123df6d04 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -89,7 +89,7 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil, nil, nil) if err != nil { return nil, err } diff --git a/utils/eth/logs.go b/utils/eth/logs.go index 8179d2123..a79d156ec 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -18,7 +18,7 @@ type FilterQuery struct { Topics [][]common.Hash } -func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q FilterQuery) ([]types.Log, error) { +func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q FilterQuery, intervalSize *big.Int) ([]types.Log, error) { rocketDaoNodeTrustedUpgrade, err := rp.GetContract("rocketDAONodeTrustedUpgrade") if err != nil { return nil, err @@ -28,10 +28,7 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter // Construct a filter to query ContractUpgraded event addressFilter := []common.Address{*rocketDaoNodeTrustedUpgrade.Address} topicFilter := [][]common.Hash{{rocketDaoNodeTrustedUpgrade.ABI.Events["ContractUpgraded"].ID}, {crypto.Keccak256Hash([]byte(contractName))}} - logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - Addresses: addressFilter, - Topics: topicFilter, - }) + logs, err := GetLogs(rp, addressFilter, topicFilter, intervalSize, nil, nil, nil) if err != nil { return nil, err } @@ -46,18 +43,12 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter } addresses = append(addresses, *currentAddress) // Perform the desired getLogs call and return results - return rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ - BlockHash: q.BlockHash, - Addresses: addresses, - FromBlock: q.FromBlock, - ToBlock: q.ToBlock, - Topics: q.Topics, - }) + return GetLogs(rp, addresses, q.Topics, intervalSize, q.FromBlock, q.ToBlock, q.BlockHash); } // Gets the logs for a particular log request, breaking the calls into batches if necessary -func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFilter [][]common.Hash, intervalSize, fromBlock *big.Int) ([]types.Log, error) { +func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFilter [][]common.Hash, intervalSize, fromBlock, toBlock *big.Int, blockHash *common.Hash) ([]types.Log, error) { var logs []types.Log // Get the block that Rocket Pool was deployed on as the lower bound if one wasn't specified @@ -76,6 +67,8 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil Addresses: addressFilter, Topics: topicFilter, FromBlock: fromBlock, + ToBlock: toBlock, + BlockHash: blockHash, }) if err != nil { return nil, err @@ -83,19 +76,21 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil return logs, nil } else { // Get the latest block - latestBlockUint, err := rp.Client.BlockNumber(context.Background()) - if err != nil { - return nil, err + if toBlock == nil { + latestBlock, err := rp.Client.BlockNumber(context.Background()) + if err != nil { + return nil, err + } + toBlock = big.NewInt(0) + toBlock.SetUint64(latestBlock) } - latestBlock := big.NewInt(0) - latestBlock.SetUint64(latestBlockUint) // Set the start and end, clamping on the latest block intervalSize.Sub(intervalSize, big.NewInt(1)) start := fromBlock end := big.NewInt(0).Add(start, intervalSize) - if end.Cmp(latestBlock) == 1 { - end = latestBlock + if end.Cmp(toBlock) == 1 { + end = toBlock } for { // Get the logs using the current interval @@ -104,6 +99,7 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil Topics: topicFilter, FromBlock: start, ToBlock: end, + BlockHash: blockHash, }) if err != nil { return nil, err @@ -113,15 +109,15 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil logs = append(logs, newLogs...) // Return once we've finished iterating - if end.Cmp(latestBlock) == 0 { + if end.Cmp(toBlock) == 0 { return logs, nil } // Update to the next interval (end+1 : that + interval - 1) start.Add(end, big.NewInt(1)) end.Add(start, intervalSize) - if end.Cmp(latestBlock) == 1 { - end = latestBlock + if end.Cmp(toBlock) == 1 { + end = toBlock } } } From 6ae73020b9c010935b8c203ae59d4cf5f3121994 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Sep 2021 00:39:31 -0400 Subject: [PATCH 392/878] Added some missing files to docgen --- docs/docgen.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docgen.go b/docs/docgen.go index 3edd05950..3d0aba6a1 100644 --- a/docs/docgen.go +++ b/docs/docgen.go @@ -37,6 +37,8 @@ func main() { "auction": "%s/../auction", "contracts": "%s/../contracts", "dao": "%s/../dao", + "dao-protocol": "%s/../dao/protocol", + "dao-trustednode": "%s/../dao/trustednode", "deposit": "%s/../deposit", "minipool": "%s/../minipool", "network": "%s/../network", @@ -49,6 +51,8 @@ func main() { "tokens": "%s/../tokens", "types": "%s/../types", "utils": "%s/../utils", + "utils-eth": "%s/../utils/eth", + "utils-strings": "%s/../utils/strings", } // Build the documentation file for each package From cdac32fa57a38a0cf94a331c8a8f106a00d2bc9f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 30 Sep 2021 23:28:00 -0400 Subject: [PATCH 393/878] Updated to Geth v1.10.9, fixed an ABI spelling change for mainnet --- go.mod | 2 +- go.sum | 39 ++++++++++++++++++++++----------------- minipool/minipool.go | 2 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 49dbe4e8b..9e69dbe26 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.8 + github.com/ethereum/go-ethereum v1.10.9 github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.2.1 diff --git a/go.sum b/go.sum index c05fc397d..0490981bf 100644 --- a/go.sum +++ b/go.sum @@ -50,17 +50,20 @@ github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1o github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= @@ -149,19 +152,18 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.8 h1:0UP5WUR8hh46ffbjJV7PK499+uGEyasRIfffS0vy06o= -github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= +github.com/ethereum/go-ethereum v1.10.9 h1:uMSWt0qDhaqqCk0PWqfDFOMUExmk4Tnbma6c6oXW+Pk= +github.com/ethereum/go-ethereum v1.10.9/go.mod h1:CaTMQrv51WaAlD2eULQ3f03KiahDRO28fleQcKjWrrg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9 h1:EMcYdPKfgZm1PyumuDkMwZUbx43bvF0T/oFPQ/e64rI= -github.com/ferranbt/fastssz v0.0.0-20210817104241-ab271261c6d9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 h1:6dVcS0LktRSyEEgldFY4N9J17WjUoiJStttH+RZj0Wo= github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -173,6 +175,7 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= @@ -187,6 +190,7 @@ github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= @@ -232,9 +236,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -267,6 +271,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -330,7 +336,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= @@ -347,12 +352,12 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -364,6 +369,7 @@ github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -384,7 +390,6 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -407,10 +412,11 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= @@ -426,14 +432,14 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -541,8 +547,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= -github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= @@ -587,7 +593,6 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -826,10 +831,10 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v2 v2.0.7/go.mod h1:0CiZ1p8pvtxBlQpLXkHuUTpdJ1shm3OqCF1QugkjHL4= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/minipool/minipool.go b/minipool/minipool.go index 010c4298e..89470fc67 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -30,7 +30,7 @@ type MinipoolDetails struct { // The counts of minipools per status type MinipoolCountsPerStatus struct { - Initialized *big.Int `abi:"initializedCount"` + Initialized *big.Int `abi:"initialisedCount"` Prelaunch *big.Int `abi:"prelaunchCount"` Staking *big.Int `abi:"stakingCount"` Withdrawable *big.Int `abi:"withdrawableCount"` From 47bcc91832cda7c7e3d239c678f86f4197295dba Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Tue, 5 Oct 2021 15:23:27 +1000 Subject: [PATCH 394/878] minor update to pipeline --- azure-pipelines.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a1338bf3a..019ab097c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,16 +19,16 @@ steps: inputs: secureFile: 'rp-azure-pipeline-github.pem' - bash: | - eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") - TOKEN=$(curl -s -X POST \ - -H "Authorization: Bearer $PUSH_JWT" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ - | jq -r '.token') - git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME - git fetch github - git push github HEAD:$(Build.SourceBranch) -f --verbose - git push github HEAD:$(Build.SourceBranch) --tags --verbose +# eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") +# TOKEN=$(curl -s -X POST \ +# -H "Authorization: Bearer $PUSH_JWT" \ +# -H "Accept: application/vnd.github.v3+json" \ +# https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ +# | jq -r '.token') +# git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME +# git fetch github +# git push github HEAD:$(Build.SourceBranch) -f --verbose +# git push github HEAD:$(Build.SourceBranch) --tags --verbose displayName: 'Push to Github' env: GITHUB_PEM_PATH: $(githubPEM.secureFilePath) From 3ead36517daaf153a2182f23f23fa3b4c0d933a4 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 6 Oct 2021 00:48:19 -0400 Subject: [PATCH 395/878] Deposit now takes all of the stake parameters --- minipool/minipool.go | 14 ++++++ node/deposit.go | 26 +++++++++-- tests/node/deposit_test.go | 18 ++++--- tests/node/staking_test.go | 28 ++++++----- tests/testutils/minipool/minipool.go | 20 ++++---- tests/testutils/node/deposit.go | 48 +++++++++++++++++++ utils/address_generation.go | 70 ++++++++++++++++++++++++++++ 7 files changed, 186 insertions(+), 38 deletions(-) create mode 100644 tests/testutils/node/deposit.go create mode 100644 utils/address_generation.go diff --git a/minipool/minipool.go b/minipool/minipool.go index 89470fc67..91e10c728 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -451,6 +451,20 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } +// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits +func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []byte{}, err + } + bytecode := new([]byte) + if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + } + return *bytecode, nil +} + + // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/node/deposit.go b/node/deposit.go index 1ac16e8e8..1bd0f47b9 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -2,32 +2,35 @@ package node import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Estimate the gas of Deposit -func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee)) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) } // Make a node deposit -func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.TransactOpts) (common.Hash, error) { +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee)) + + hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) } @@ -35,6 +38,21 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, opts *bind.Trans } +// Get the type of a deposit based on the amount +func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return rptypes.Empty, err + } + + depositType := new(rptypes.MinipoolDeposit) + if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { + return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) + } + return *depositType, nil +} + + // Get contracts var rocketNodeDepositLock sync.Mutex func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index 08a0ce251..054af7e0e 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -1,15 +1,15 @@ package node import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -36,9 +36,7 @@ func TestDeposit(t *testing.T) { if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { t.Fatal(err) } // Deposit - opts := nodeAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - if _, err := node.Deposit(rp, 0, opts); err != nil { + if _, _, err := nodeutils.Deposit(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index f9f8a4d50..89887cdc7 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -1,18 +1,18 @@ package node import ( - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) @@ -119,9 +119,7 @@ func TestStakeRPL(t *testing.T) { } // Make node deposit to create minipool - opts := nodeAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - if _, err := node.Deposit(rp, 0, opts); err != nil { t.Fatal(err) } + if _, _, err := nodeutils.Deposit(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Check updated staking details if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index d0e18b223..ce90be314 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -2,16 +2,15 @@ package minipool import ( "errors" + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -35,13 +34,11 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun if err != nil { return nil, err } if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { return nil, err } - // Make node deposit - opts := nodeAccount.GetTransactor() - opts.Value = depositAmount - hash, err := node.Deposit(rp, 0, opts) - if err != nil { return nil, err } - txReceipt, err := utils.WaitForTransaction(rp.Client, hash) - if err != nil { return nil, err } + // Do the node deposit to generate the minipool + expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(rp, nodeAccount, depositAmount) + if err != nil { + return nil, fmt.Errorf("Could not do node deposit: %w", err) + } // Get minipool manager contract rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager") @@ -54,6 +51,11 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun } minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool + // Sanity check to verify the created minipool is at the expected address + if expectedMinipoolAddress != minipoolAddress { + return nil, errors.New(fmt.Sprintf("Expected minipool address %s but got %s", expectedMinipoolAddress.Hex(), minipoolAddress.Hex())) + } + // Return minipool instance return minipool.NewMinipool(rp, minipoolAddress) diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go new file mode 100644 index 000000000..b7fac196f --- /dev/null +++ b/tests/testutils/node/deposit.go @@ -0,0 +1,48 @@ +package node + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" +) + +// Returns the default salt for minipool address generation +func GetDefaultSalt() *big.Int { + return big.NewInt(204) +} + + +// Call deposit on the node using the validator test values +func Deposit(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int) (common.Address, *types.Receipt, error) { + + // Get validator & deposit data + validatorPubkey, err := validator.GetValidatorPubkey() + if err != nil { return common.Address{}, nil, err } + expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, rptypes.Half, GetDefaultSalt(), nil) + if err != nil { return common.Address{}, nil, err } + withdrawalCredentials := utils.GetWithdrawalCredentials(expectedMinipoolAddress) + validatorSignature, err := validator.GetValidatorSignature() + if err != nil { return common.Address{}, nil, err } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) + if err != nil { return common.Address{}, nil, err } + + // Make node deposit + opts := nodeAccount.GetTransactor() + opts.Value = depositAmount + hash, err := node.Deposit(rp, 0, validatorPubkey, validatorSignature, depositDataRoot, GetDefaultSalt(), expectedMinipoolAddress, opts) + if err != nil { return common.Address{}, nil, err } + txReceipt, err := utils.WaitForTransaction(rp.Client, hash) + if err != nil { return common.Address{}, nil, err } + + return expectedMinipoolAddress, txReceipt, nil +} + diff --git a/utils/address_generation.go b/utils/address_generation.go new file mode 100644 index 000000000..6d78f4ca9 --- /dev/null +++ b/utils/address_generation.go @@ -0,0 +1,70 @@ +package utils + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// Precompute the address of a minipool based on the node wallet, deposit type, and unique salt +// If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { + + // Get dependencies + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAbi, err := rp.GetABI("rocketMinipool") + if err != nil { + return common.Address{}, err + } + + if len(minipoolBytecode) == 0 { + minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + if err != nil { + return common.Address{}, err + } + } + + // Create the hash of the minipool constructor call + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address.Bytes(), nodeAddress.Bytes(), depositType) + if err != nil { + return common.Address{}, err + } + initData := append(minipoolBytecode, packedConstructorArgs...) + initHash := crypto.Keccak256(initData) + saltBytes := [32]byte{} + salt.FillBytes(saltBytes[:]) + + address := crypto.CreateAddress2(*rocketMinipoolManager.Address, saltBytes, initHash) + return address, nil + +} + + +// Transform a Minipool address into a Beacon Chain withdrawal address +func GetWithdrawalCredentials(minipoolAddress common.Address) common.Hash { + prefix := []byte{0x01} + padding := [11]byte{} + address := minipoolAddress.Bytes() + credentials := append(prefix, padding[:]...) + credentials = append(credentials, address[:]...) + + return common.BytesToHash(credentials) +} + + +// Get contracts +var rocketMinipoolManagerLock sync.Mutex +func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") +} + From ba13af974d8dd1aee58b6d8bb033346d0943c32a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 8 Oct 2021 02:21:23 -0400 Subject: [PATCH 396/878] Started fixing up the unit tests --- test.sh | 4 ++-- tests/auction/main_test.go | 4 ++++ tests/dao/main_test.go | 4 ++++ tests/dao/trustednode/dao_test.go | 4 ++-- tests/testutils/auction/auction.go | 6 ++---- tests/testutils/node/deposit.go | 13 +++++++------ tests/utils/stage4_bootstrap.go | 31 ++++++++++++++++++++++++++++++ utils/address_generation.go | 21 ++++++++++++++------ 8 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 tests/utils/stage4_bootstrap.go diff --git a/test.sh b/test.sh index 1a49dbdb2..191a465be 100755 --- a/test.sh +++ b/test.sh @@ -21,8 +21,8 @@ fi # Rocket Pool settings -rp_repo_url="https://github.com/rocket-pool/rocketpool.git" -rp_repo_branch="master" +rp_repo_url="git@ssh.dev.azure.com:v3/rocket-pool/RocketPool/rocketpool" +rp_repo_branch="minipool-approval" # Dependencies rp_dependencies=( diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 3271afee6..52477647d 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils" ) @@ -52,6 +53,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } userAccount2, err = accounts.GetAccount(9) if err != nil { log.Fatal(err) } + + // Do the bootstrap settings + utils.Stage4Bootstrap(rp, ownerAccount) // Run tests os.Exit(m.Run()) diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 645450c99..9ddeb26ae 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -12,6 +12,7 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/utils" ) @@ -50,6 +51,9 @@ func TestMain(m *testing.M) { nodeAccount, err = accounts.GetAccount(4) if err != nil { log.Fatal(err) } + // Do the bootstrap settings + utils.Stage4Bootstrap(rp, ownerAccount) + // Run tests os.Exit(m.Run()) diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 73142d227..49b93da66 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -2,7 +2,6 @@ package trustednode import ( "bytes" - "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -10,6 +9,7 @@ import ( trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" "github.com/rocket-pool/rocketpool-go/node" trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" @@ -78,7 +78,7 @@ func TestMemberDetails(t *testing.T) { if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Create an unbonded minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount1, big.NewInt(0)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount1, eth.EthToWei(16)); err != nil { t.Fatal(err) } // Get & check updated member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 39551892a..5ca91d695 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -1,8 +1,6 @@ package auction import ( - "math/big" - "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -20,12 +18,12 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { return err } // Create unbonded minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, big.NewInt(0)) + mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(16)) if err != nil { return err } // Deposit user ETH to minipool opts := userAccount.GetTransactor() - opts.Value = eth.EthToWei(32) + opts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, opts); err != nil { return err } // Stake minipool diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go index b7fac196f..06d52d653 100644 --- a/tests/testutils/node/deposit.go +++ b/tests/testutils/node/deposit.go @@ -1,6 +1,7 @@ package node import ( + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" @@ -26,22 +27,22 @@ func Deposit(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAm // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey() - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator pubkey: %w", err) } expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, rptypes.Half, GetDefaultSalt(), nil) - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error generating minipool address: %w", err) } withdrawalCredentials := utils.GetWithdrawalCredentials(expectedMinipoolAddress) validatorSignature, err := validator.GetValidatorSignature() - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator signature: %w", err) } depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting deposit data root: %w", err) } // Make node deposit opts := nodeAccount.GetTransactor() opts.Value = depositAmount hash, err := node.Deposit(rp, 0, validatorPubkey, validatorSignature, depositDataRoot, GetDefaultSalt(), expectedMinipoolAddress, opts) - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error executing deposit: %w", err) } txReceipt, err := utils.WaitForTransaction(rp.Client, hash) - if err != nil { return common.Address{}, nil, err } + if err != nil { return common.Address{}, nil, fmt.Errorf("Error waiting for deposit transaction: %w", err) } return expectedMinipoolAddress, txReceipt, nil } diff --git a/tests/utils/stage4_bootstrap.go b/tests/utils/stage4_bootstrap.go new file mode 100644 index 000000000..8cc801bb5 --- /dev/null +++ b/tests/utils/stage4_bootstrap.go @@ -0,0 +1,31 @@ +package utils + +import ( + "time" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Bootstrap all of the parameters to mimic Stage 4 so the unit tests work correctly +func Stage4Bootstrap(rp *rocketpool.RocketPool, ownerAccount *accounts.Account) { + + opts := ownerAccount.GetTransactor() + + protocol.BootstrapDepositEnabled(rp, true, opts) + protocol.BootstrapAssignDepositsEnabled(rp, true, opts) + protocol.BootstrapMaximumDepositPoolSize(rp, eth.EthToWei(1000), opts) + protocol.BootstrapNodeRegistrationEnabled(rp, true, opts) + protocol.BootstrapNodeDepositEnabled(rp, true, opts) + protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, true, opts) + protocol.BootstrapMinimumNodeFee(rp, 0.05, opts) + protocol.BootstrapTargetNodeFee(rp, 0.1, opts) + protocol.BootstrapMaximumNodeFee(rp, 0.2, opts) + protocol.BootstrapNodeFeeDemandRange(rp, eth.EthToWei(1000), opts) + protocol.BootstrapInflationStartTime(rp, + uint64(time.Now().Unix() + (60 * 60 * 24 * 14)), opts) + +} + diff --git a/utils/address_generation.go b/utils/address_generation.go index 6d78f4ca9..1abf47985 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "math/big" "sync" @@ -28,21 +29,29 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo if len(minipoolBytecode) == 0 { minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) if err != nil { - return common.Address{}, err + return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) } } // Create the hash of the minipool constructor call - packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address.Bytes(), nodeAddress.Bytes(), depositType) + depositTypeBytes := [32]byte{} + depositTypeBytes[0] = byte(depositType) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) if err != nil { - return common.Address{}, err + return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) } - initData := append(minipoolBytecode, packedConstructorArgs...) - initHash := crypto.Keccak256(initData) + + // Create a new salt by hashing the original and the node address saltBytes := [32]byte{} salt.FillBytes(saltBytes[:]) + saltHash := crypto.Keccak256(nodeAddress[:], saltBytes[:]) + nodeSalt := [32]byte{} + copy(nodeSalt[:], saltHash[0:32]) + + initData := append(minipoolBytecode, packedConstructorArgs...) + initHash := crypto.Keccak256(initData) - address := crypto.CreateAddress2(*rocketMinipoolManager.Address, saltBytes, initHash) + address := crypto.CreateAddress2(*rocketMinipoolManager.Address, nodeSalt, initHash) return address, nil } From a55b3f49373146dd2786e3e66cbb98ef8c8685a1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 11 Oct 2021 00:08:51 -0400 Subject: [PATCH 397/878] Updated the unit tests with scrub support --- node/deposit.go | 5 +- tests/auction/auction_test.go | 9 ++- tests/config.go | 5 +- tests/dao/trustednode/dao_test.go | 4 +- tests/dao/trustednode/proposals_test.go | 14 ++-- tests/deposit/deposit_test.go | 16 ++-- tests/minipool/contract_test.go | 92 +++++++++++++++-------- tests/minipool/minipool_test.go | 15 +++- tests/minipool/queue_test.go | 43 ++++++----- tests/minipool/status_test.go | 11 ++- tests/node/deposit_test.go | 2 +- tests/node/staking_test.go | 20 ++++- tests/rewards/node_test.go | 37 ++++++--- tests/testutils/auction/auction.go | 17 ++++- tests/testutils/minipool/minipool.go | 9 ++- tests/testutils/node/deposit.go | 30 +++++--- tests/testutils/validator/deposit-data.go | 37 ++++++--- utils/address_generation.go | 19 +++-- 18 files changed, 258 insertions(+), 127 deletions(-) diff --git a/node/deposit.go b/node/deposit.go index 1bd0f47b9..97b987b3d 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -29,7 +29,6 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey if err != nil { return common.Hash{}, err } - hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) @@ -45,11 +44,11 @@ func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallO return rptypes.Empty, err } - depositType := new(rptypes.MinipoolDeposit) + depositType := new(uint8) if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) } - return *depositType, nil + return rptypes.MinipoolDeposit(*depositType), nil } diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 3a8ed9c60..60f1a0613 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -1,10 +1,11 @@ package auction import ( - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "math/big" + "math/big" "testing" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/auction" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/settings/protocol" @@ -49,7 +50,7 @@ func TestAuctionDetails(t *testing.T) { } // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { + if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } @@ -117,7 +118,7 @@ func TestLotDetails(t *testing.T) { if _, err := protocol.BootstrapLotDuration(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } + if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } // Get & check initial lot details if lots, err := auction.GetLots(rp, nil); err != nil { diff --git a/tests/config.go b/tests/config.go index c21f3c4f2..c891d86c3 100644 --- a/tests/config.go +++ b/tests/config.go @@ -1,6 +1,5 @@ package tests - // Contract addresses and account private keys are based on the following mnemonic: // jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet @@ -12,7 +11,11 @@ const ( const ( ValidatorPubkey = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30e" + ValidatorPubkey2 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30d" + ValidatorPubkey3 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30c" ValidatorSignature = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e33" + ValidatorSignature2 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e34" + ValidatorSignature3 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e35" ) var AccountPrivateKeys = []string{ diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index 49b93da66..ad08a5f4c 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -78,7 +78,7 @@ func TestMemberDetails(t *testing.T) { if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } // Create an unbonded minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount1, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount1, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } // Get & check updated member details if members, err := trustednodedao.GetMembers(rp, nil); err != nil { @@ -108,9 +108,11 @@ func TestMemberDetails(t *testing.T) { if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) } + /* TEMPORARILY DISABLED if member.UnbondedValidatorCount != 1 { t.Errorf("Incorrect member unbonded validator count %d", member.UnbondedValidatorCount) } + */ } } diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index a3592fd03..9a89fd640 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -109,6 +109,13 @@ func TestProposeMemberLeave(t *testing.T) { trustedNodeAccount4, }); err != nil { t.Fatal(err) } + // Get & check member leave executed time + if leaveExecutedTime, err := trustednodedao.GetMemberLeaveProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { + t.Error(err) + } else if leaveExecutedTime == 0 { + t.Errorf("Incorrect member leave proposal executed time %d", leaveExecutedTime) + } + // Get & check initial member exists status if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { t.Error(err) @@ -135,13 +142,6 @@ func TestProposeMemberLeave(t *testing.T) { t.Errorf("Incorrect proposal payload string %s", payloadStr) } - // Get & check member leave executed block - if leaveExecutedBlock, err := trustednodedao.GetMemberLeaveProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { - t.Error(err) - } else if leaveExecutedBlock == 0 { - t.Errorf("Incorrect member leave proposal executed block %d", leaveExecutedBlock) - } - } diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 9d0896b21..672064a87 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -1,15 +1,15 @@ package deposit import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" ) @@ -59,7 +59,7 @@ func TestAssignDeposits(t *testing.T) { // Register node & create minipool if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } // Re-enable deposit assignments if _, err := protocol.BootstrapAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 27bfbcc9e..8dc7465c2 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -1,24 +1,27 @@ package minipool import ( - "bytes" - "encoding/hex" - "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "testing" - - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "bytes" + "encoding/hex" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/common" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/utils" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tokens" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) @@ -37,7 +40,7 @@ func TestDetails(t *testing.T) { if err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) if err != nil { t.Fatal(err) } // Make user deposit @@ -45,6 +48,10 @@ func TestDetails(t *testing.T) { depositOpts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + // Stake minipool if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } @@ -126,7 +133,7 @@ func TestRefund(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) if err != nil { t.Fatal(err) } // Make user deposit @@ -166,15 +173,15 @@ func TestStake(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) if err != nil { t.Fatal(err) } // Get validator & deposit data - validatorPubkey, err := validator.GetValidatorPubkey() + validatorPubkey, err := validator.GetValidatorPubkey(1) if err != nil { t.Fatal(err) } withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) if err != nil { t.Fatal(err) } - validatorSignature, err := validator.GetValidatorSignature() + validatorSignature, err := validator.GetValidatorSignature(1) if err != nil { t.Fatal(err) } depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) if err != nil { t.Fatal(err) } @@ -186,6 +193,10 @@ func TestStake(t *testing.T) { t.Errorf("Incorrect initial minipool status %s", status.String()) } + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + // Stake minipool if _, err := mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) @@ -212,7 +223,7 @@ func TestDissolve(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // Get & check initial minipool status @@ -247,7 +258,7 @@ func TestClose(t *testing.T) { if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // Dissolve minipool @@ -260,6 +271,15 @@ func TestClose(t *testing.T) { t.Error("Incorrect initial minipool exists status") } + // Simulate a post-merge withdrawal by sending 16 ETH to the minipool + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + hash, err := eth.SendTransaction(rp.Client, mp.Address, opts) + if err != nil { + t.Errorf("Error sending ETH to minipool: %s", err.Error()) + } + utils.WaitForTransaction(rp.Client, hash) + // Close minipool if _, err := mp.Close(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) @@ -293,7 +313,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // Make user deposit @@ -302,6 +322,10 @@ func TestWithdrawValidatorBalance(t *testing.T) { userDepositOpts.Value = userDepositAmount if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + // Stake minipool if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } @@ -384,7 +408,7 @@ func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // Make user deposit @@ -393,6 +417,10 @@ func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { userDepositOpts.Value = userDepositAmount if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + // Stake minipool if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } @@ -445,15 +473,15 @@ func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { } if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { t.Fatal(err) - } else if rethCollateralRate != 1 { + } else if rethCollateralRate != 0.1 { t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) } // Confirm the minipool still exists if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { t.Error(err) - } else if exists { - t.Error("Minipool still exists but it shouldn't") + } else if !exists { + t.Error("Minipool doesn't exist but it should") } } @@ -469,7 +497,7 @@ func TestDelegateUpgradeAndRollback(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // Get original delegate contract @@ -541,7 +569,7 @@ func TestUseLatestDelegate(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) if err != nil { t.Fatal(err) } // New delegate params diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index f42d72b47..9aeda585a 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -2,8 +2,10 @@ package minipool import ( "bytes" - "github.com/rocket-pool/rocketpool-go/types" - "testing" + "fmt" + "testing" + + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" @@ -47,15 +49,20 @@ func TestMinipoolDetails(t *testing.T) { minipoolDepositAmount := eth.EthToWei(32) // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, minipoolDepositAmount) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, minipoolDepositAmount, 1) if err != nil { t.Fatal(err) } + + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Mark minipool as withdrawable if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } // Get minipool validator pubkey - validatorPubkey, err := validator.GetValidatorPubkey() + validatorPubkey, err := validator.GetValidatorPubkey(1) if err != nil { t.Fatal(err) } // Get & check updated minipool details diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index aca0250dd..310c048d3 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -1,16 +1,17 @@ package minipool import ( - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/utils/eth" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) @@ -46,7 +47,7 @@ func TestQueueLengths(t *testing.T) { } // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { @@ -67,7 +68,7 @@ func TestQueueLengths(t *testing.T) { } // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 2); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { @@ -88,13 +89,13 @@ func TestQueueLengths(t *testing.T) { } // Create empty deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + //if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0), 3); err != nil { t.Fatal(err) } // Get & check queue lengths if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { t.Error(err) } else { - if queueLengths.Total != 3 { + if queueLengths.Total != 2 { t.Errorf("Incorrect total queue length 4 %d", queueLengths.Total) } if queueLengths.FullDeposit != 1 { @@ -103,9 +104,9 @@ func TestQueueLengths(t *testing.T) { if queueLengths.HalfDeposit != 1 { t.Errorf("Incorrect half deposit queue length 4 %d", queueLengths.HalfDeposit) } - if queueLengths.EmptyDeposit != 1 { - t.Errorf("Incorrect empty deposit queue length 4 %d", queueLengths.EmptyDeposit) - } + //if queueLengths.EmptyDeposit != 1 { + // t.Errorf("Incorrect empty deposit queue length 4 %d", queueLengths.EmptyDeposit) + //} } } @@ -139,8 +140,9 @@ func TestQueueCapacity(t *testing.T) { } } + /* TODO: Unbonded minipools are temporarily disabled // Create empty deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { @@ -156,15 +158,16 @@ func TestQueueCapacity(t *testing.T) { t.Errorf("Incorrect queue next minipool capacity 2 %s", queueCapacity.NextMinipool.String()) } } + */ // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { t.Error(err) } else { - if queueCapacity.Total.Cmp(eth.EthToWei(48)) != 0 { + if queueCapacity.Total.Cmp(eth.EthToWei(16)) != 0 { t.Errorf("Incorrect queue total capacity 3 %s", queueCapacity.Total.String()) } if queueCapacity.Effective.Cmp(eth.EthToWei(16)) != 0 { @@ -176,13 +179,13 @@ func TestQueueCapacity(t *testing.T) { } // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)); err != nil { t.Fatal(err) } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 2); err != nil { t.Fatal(err) } // Get & check queue capacity if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { t.Error(err) } else { - if queueCapacity.Total.Cmp(eth.EthToWei(64)) != 0 { + if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { t.Errorf("Incorrect queue total capacity 4 %s", queueCapacity.Total.String()) } if queueCapacity.Effective.Cmp(eth.EthToWei(32)) != 0 { diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index d9e8823bb..2fad24621 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -1,9 +1,11 @@ package minipool import ( - "github.com/rocket-pool/rocketpool-go/types" + "fmt" "testing" + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -25,8 +27,13 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(32)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) if err != nil { t.Fatal(err) } + + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Get & check initial minipool withdrawable status diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index 054af7e0e..ebd88a2ba 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -36,7 +36,7 @@ func TestDeposit(t *testing.T) { if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { t.Fatal(err) } // Deposit - if _, _, err := nodeutils.Deposit(rp, nodeAccount, eth.EthToWei(16)); err != nil { + if _, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 89887cdc7..472e87d3a 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -1,9 +1,12 @@ package node import ( + "fmt" "math/big" "testing" + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" @@ -119,7 +122,22 @@ func TestStakeRPL(t *testing.T) { } // Make node deposit to create minipool - if _, _, err := nodeutils.Deposit(rp, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + minipoolAddress, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1) + if err != nil { t.Fatal(err) } + mp, err := minipool.NewMinipool(rp, minipoolAddress) + if err != nil { t.Fatal(err) } + + // Make user deposit + depositOpts := nodeAccount.GetTransactor(); + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } + + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } // Check updated staking details if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 6fb3c8eb6..0eba3a611 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -1,16 +1,18 @@ package rewards import ( - "context" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "math/big" - "testing" + "context" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -62,7 +64,20 @@ func TestNodeRewards(t *testing.T) { } // Stake RPL & create a minipool - if _, err := minipoolutils.CreateMinipool(rp, ownerAccount, nodeAccount, eth.EthToWei(16)); err != nil { t.Fatal(err) } + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { t.Fatal(err) } + + // Deposit user ETH to minipool + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, opts); err != nil { t.Error(err) } + + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { t.Errorf("Could not increase time: %s", err.Error()) } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Error(err) } // Get & check updated node claim rewards percent if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 5ca91d695..cd1a3cf6e 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -1,24 +1,33 @@ package auction import ( + "fmt" + "testing" + "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) // Create an amount of slashed RPL in the auction contract -func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount, trustedNodeAccount2 *accounts.Account, userAccount *accounts.Account) error { +func CreateSlashedRPL(t *testing.T, rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount, trustedNodeAccount2 *accounts.Account, userAccount *accounts.Account) error { // Stake a large amount of RPL against the node if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { return err } + // Make user deposit + depositOpts := userAccount.GetTransactor(); + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { return err } + // Create unbonded minipool - mp, err := minipoolutils.CreateMinipool(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(16)) + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(16), 1) if err != nil { return err } // Deposit user ETH to minipool @@ -26,6 +35,10 @@ func CreateSlashedRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, opts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, opts); err != nil { return err } + // Delay for the time between depositing and staking (PLACEHOLDER) + err = evm.IncreaseTime(24 * 60 * 60 + 1) + if err != nil { return fmt.Errorf("Could not increase time: %w", err) } + // Stake minipool if err := minipoolutils.StakeMinipool(rp, mp, trustedNodeAccount); err != nil { return err } diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index ce90be314..06950f04a 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/big" + "testing" "github.com/ethereum/go-ethereum/common" @@ -27,7 +28,7 @@ type minipoolCreated struct { // Create a minipool -func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, depositAmount *big.Int) (*minipool.Minipool, error) { +func CreateMinipool(t *testing.T, rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, depositAmount *big.Int, pubkey int) (*minipool.Minipool, error) { // Mint & stake RPL required for mininpool rplRequired, err := GetMinipoolRPLRequired(rp) @@ -35,7 +36,7 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { return nil, err } // Do the node deposit to generate the minipool - expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(rp, nodeAccount, depositAmount) + expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(t, rp, nodeAccount, depositAmount, pubkey) if err != nil { return nil, fmt.Errorf("Could not do node deposit: %w", err) } @@ -66,11 +67,11 @@ func CreateMinipool(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accoun func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount *accounts.Account) error { // Get validator & deposit data - validatorPubkey, err := validator.GetValidatorPubkey() + validatorPubkey, err := validator.GetValidatorPubkey(1) if err != nil { return err } withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) if err != nil { return err } - validatorSignature, err := validator.GetValidatorSignature() + validatorSignature, err := validator.GetValidatorSignature(1) if err != nil { return err } depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) if err != nil { return err } diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go index 06d52d653..e6572d7b4 100644 --- a/tests/testutils/node/deposit.go +++ b/tests/testutils/node/deposit.go @@ -3,35 +3,43 @@ package node import ( "fmt" "math/big" + "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) -// Returns the default salt for minipool address generation -func GetDefaultSalt() *big.Int { - return big.NewInt(204) +var salt int64 = 0 + +// Returns a unique salt for minipool address generation +func GetSalt() *big.Int { + salt += 1 + return big.NewInt(salt) } // Call deposit on the node using the validator test values -func Deposit(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int) (common.Address, *types.Receipt, error) { +func Deposit(t *testing.T, rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int, pubkey int) (common.Address, *types.Receipt, error) { + + // Get the next salt + salt := GetSalt() // Get validator & deposit data - validatorPubkey, err := validator.GetValidatorPubkey() + depositType, err := node.GetDepositType(rp, depositAmount, nil) + if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting deposit type: %w", err) } + validatorPubkey, err := validator.GetValidatorPubkey(pubkey) if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator pubkey: %w", err) } - expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, rptypes.Half, GetDefaultSalt(), nil) + expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, depositType, salt, nil) if err != nil { return common.Address{}, nil, fmt.Errorf("Error generating minipool address: %w", err) } withdrawalCredentials := utils.GetWithdrawalCredentials(expectedMinipoolAddress) - validatorSignature, err := validator.GetValidatorSignature() + validatorSignature, err := validator.GetValidatorSignature(pubkey) if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator signature: %w", err) } depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting deposit data root: %w", err) } @@ -39,7 +47,11 @@ func Deposit(rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAm // Make node deposit opts := nodeAccount.GetTransactor() opts.Value = depositAmount - hash, err := node.Deposit(rp, 0, validatorPubkey, validatorSignature, depositDataRoot, GetDefaultSalt(), expectedMinipoolAddress, opts) + + minNodeFee := 0.0 + //t.Logf("Deposit:\n\tMin Node Fee: %f\n\tValidator Pubkey: %s\n\tValidator Signature: %s\n\tDeposit Data Root: %s\n\tNode Address: %s\n\tSalt: %s\n\tExpected Minipool: %s\n", + // minNodeFee, validatorPubkey.Hex(), validatorSignature.Hex(), depositDataRoot.Hex(), nodeAccount.Address.Hex(), GetDefaultSalt().String(), expectedMinipoolAddress.Hex()) + hash, err := node.Deposit(rp, minNodeFee, validatorPubkey, validatorSignature, depositDataRoot, salt, expectedMinipoolAddress, opts) if err != nil { return common.Address{}, nil, fmt.Errorf("Error executing deposit: %w", err) } txReceipt, err := utils.WaitForTransaction(rp.Client, hash) if err != nil { return common.Address{}, nil, fmt.Errorf("Error waiting for deposit transaction: %w", err) } diff --git a/tests/testutils/validator/deposit-data.go b/tests/testutils/validator/deposit-data.go index 2f180374e..6c6de461e 100644 --- a/tests/testutils/validator/deposit-data.go +++ b/tests/testutils/validator/deposit-data.go @@ -1,17 +1,18 @@ package validator import ( - "github.com/ethereum/go-ethereum/common" - "github.com/prysmaticlabs/go-ssz" + "fmt" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/ethereum/go-ethereum/common" + "github.com/prysmaticlabs/go-ssz" - "github.com/rocket-pool/rocketpool-go/tests" -) + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/tests" +) // Deposit settings -const depositAmount = 32000000000 // gwei +const depositAmount = 16000000000 // gwei // Deposit data @@ -24,14 +25,30 @@ type depositData struct { // Get the validator pubkey -func GetValidatorPubkey() (types.ValidatorPubkey, error) { - return types.HexToValidatorPubkey(tests.ValidatorPubkey) +func GetValidatorPubkey(pubkey int) (types.ValidatorPubkey, error) { + if pubkey == 1 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey) + } else if pubkey == 2 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey2) + } else if pubkey == 3 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey3) + } else { + return types.ValidatorPubkey{}, fmt.Errorf("Invalid pubkey index %d", pubkey) + } } // Get the validator deposit signature -func GetValidatorSignature() (types.ValidatorSignature, error) { - return types.HexToValidatorSignature(tests.ValidatorSignature) +func GetValidatorSignature(pubkey int) (types.ValidatorSignature, error) { + if pubkey == 1 { + return types.HexToValidatorSignature(tests.ValidatorSignature) + } else if pubkey == 2 { + return types.HexToValidatorSignature(tests.ValidatorSignature2) + } else if pubkey == 3 { + return types.HexToValidatorSignature(tests.ValidatorSignature3) + } else { + return types.ValidatorSignature{}, fmt.Errorf("Invalid pubkey index %d", pubkey) + } } diff --git a/utils/address_generation.go b/utils/address_generation.go index 1abf47985..eea254f3d 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -12,6 +12,16 @@ import ( rptypes "github.com/rocket-pool/rocketpool-go/types" ) +// Combine a node's address and a salt to retreive a new salt compatible with depositing +func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { + // Create a new salt by hashing the original and the node address + saltBytes := [32]byte{} + salt.FillBytes(saltBytes[:]) + saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) + return saltHash +} + + // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { @@ -41,13 +51,8 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) } - // Create a new salt by hashing the original and the node address - saltBytes := [32]byte{} - salt.FillBytes(saltBytes[:]) - saltHash := crypto.Keccak256(nodeAddress[:], saltBytes[:]) - nodeSalt := [32]byte{} - copy(nodeSalt[:], saltHash[0:32]) - + // Get the node salt and initialization data + nodeSalt := GetNodeSalt(nodeAddress, salt) initData := append(minipoolBytecode, packedConstructorArgs...) initHash := crypto.Keccak256(initData) From 9fd54ce5a99b27207a14024ce8c2714b849ff5cd Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 11 Oct 2021 00:58:59 -0400 Subject: [PATCH 398/878] Added support for the scrub period setting --- settings/trustednode/minipool.go | 52 ++++++++++++++++++++++++++++++ tests/minipool/contract_test.go | 25 +++++++++----- tests/minipool/minipool_test.go | 7 ++-- tests/minipool/status_test.go | 7 ++-- tests/node/staking_test.go | 7 ++-- tests/rewards/node_test.go | 10 ++++-- tests/testutils/auction/auction.go | 7 ++-- 7 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 settings/trustednode/minipool.go diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go new file mode 100644 index 000000000..3f8ff2a65 --- /dev/null +++ b/settings/trustednode/minipool.go @@ -0,0 +1,52 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Config +const ( + MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" + ScrubPeriodPath = "minipool.scrub.period" +) + + +// The cooldown period a member must wait after making a proposal before making another in seconds +func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getScrubPeriod"); err != nil { + return 0, fmt.Errorf("Could not get scrub period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) +} +func ProposeScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) +} +func EstimateProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) +} + + +// Get contracts +var minipoolSettingsContractLock sync.Mutex +func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + minipoolSettingsContractLock.Lock() + defer minipoolSettingsContractLock.Unlock() + return rp.GetContract(MinipoolSettingsContractName) +} + diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 8dc7465c2..ba5179ec7 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/utils" "github.com/rocket-pool/rocketpool-go/deposit" @@ -48,8 +49,10 @@ func TestDetails(t *testing.T) { depositOpts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool @@ -193,8 +196,10 @@ func TestStake(t *testing.T) { t.Errorf("Incorrect initial minipool status %s", status.String()) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool @@ -322,8 +327,10 @@ func TestWithdrawValidatorBalance(t *testing.T) { userDepositOpts.Value = userDepositAmount if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool @@ -417,8 +424,10 @@ func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { userDepositOpts.Value = userDepositAmount if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index 9aeda585a..17998b085 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/minipool" @@ -52,8 +53,10 @@ func TestMinipoolDetails(t *testing.T) { mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, minipoolDepositAmount, 1) if err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index 2fad24621..54f8710c3 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/minipool" @@ -30,8 +31,10 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) if err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 472e87d3a..0d37aa1ed 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -9,6 +9,7 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/tokens" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -132,8 +133,10 @@ func TestStakeRPL(t *testing.T) { depositOpts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 0eba3a611..23ca21f0d 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -2,6 +2,7 @@ package rewards import ( "context" + "fmt" "math/big" "testing" @@ -9,6 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rewards" "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" "github.com/rocket-pool/rocketpool-go/tokens" @@ -72,9 +74,11 @@ func TestNodeRewards(t *testing.T) { opts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, opts); err != nil { t.Error(err) } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) - if err != nil { t.Errorf("Could not increase time: %s", err.Error()) } + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { t.Fatal(err) } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Error(err) } diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index cd1a3cf6e..0c77ef1a0 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -7,6 +7,7 @@ import ( "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/trustednode" "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -35,8 +36,10 @@ func CreateSlashedRPL(t *testing.T, rp *rocketpool.RocketPool, ownerAccount *acc opts.Value = eth.EthToWei(16) if _, err := deposit.Deposit(rp, opts); err != nil { return err } - // Delay for the time between depositing and staking (PLACEHOLDER) - err = evm.IncreaseTime(24 * 60 * 60 + 1) + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { return err } + err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { return fmt.Errorf("Could not increase time: %w", err) } // Stake minipool From 784b98da460565ed6e9f3d83c9618f80b4a38991 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 11 Oct 2021 01:47:06 -0400 Subject: [PATCH 399/878] Added GetPrelaunchMinipoolAddresses() --- minipool/minipool.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 91e10c728..5c74796dd 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -133,6 +133,24 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com } +// Get the addresses of all minipools in prelaunch status +func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []common.Address{}, err + } + offset := big.NewInt(0) + limit := big.NewInt(0) + addresses := new([]common.Address) + if err := rocketMinipoolManager.Call(opts, addresses, "getPrelaunchMinipools", offset, limit); err != nil { + return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + } + return *addresses, nil + +} + + // Get a node's minipool addresses func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { From 19f493b46a4b3dc5234bf98399f8d41c1c8c3e18 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Oct 2021 01:55:30 -0400 Subject: [PATCH 400/878] Moved to contract-based withdrawal credential creation --- minipool/minipool-contract.go | 10 ---------- minipool/minipool.go | 14 ++++++++++++++ tests/minipool/contract_test.go | 4 ++-- tests/testutils/minipool/minipool.go | 2 +- tests/testutils/node/deposit.go | 4 +++- utils/address_generation.go | 12 ------------ 6 files changed, 20 insertions(+), 26 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 29eaa2157..7f6ea3f97 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -292,16 +292,6 @@ func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, } -// Get withdrawal credentials -func (mp *Minipool) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) { - withdrawalCredentials := new(common.Hash) - if err := mp.Contract.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { - return common.Hash{}, fmt.Errorf("Could not get minipool %s withdrawal credentials: %w", mp.Address.Hex(), err) - } - return *withdrawalCredentials, nil -} - - // Estimate the gas of Refund func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "refund") diff --git a/minipool/minipool.go b/minipool/minipool.go index 5c74796dd..d85a37477 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -483,6 +483,20 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte } +// Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool +func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Hash{}, err + } + withdrawalCredentials := new(common.Hash) + if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { + return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) + } + return *withdrawalCredentials, nil +} + + // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index ba5179ec7..c7808b6c2 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -112,7 +112,7 @@ func TestDetails(t *testing.T) { t.Errorf("Incorrect minipool user deposit assigned time %v", user.DepositAssignedTime) } } - if withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil); err != nil { + if withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil); err != nil { t.Error(err) } else { withdrawalPrefix := byte(1) @@ -182,7 +182,7 @@ func TestStake(t *testing.T) { // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey(1) if err != nil { t.Fatal(err) } - withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) if err != nil { t.Fatal(err) } validatorSignature, err := validator.GetValidatorSignature(1) if err != nil { t.Fatal(err) } diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 06950f04a..8de6d3be9 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -69,7 +69,7 @@ func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount // Get validator & deposit data validatorPubkey, err := validator.GetValidatorPubkey(1) if err != nil { return err } - withdrawalCredentials, err := mp.GetWithdrawalCredentials(nil) + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) if err != nil { return err } validatorSignature, err := validator.GetValidatorSignature(1) if err != nil { return err } diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go index e6572d7b4..23d111ca9 100644 --- a/tests/testutils/node/deposit.go +++ b/tests/testutils/node/deposit.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils" @@ -38,7 +39,8 @@ func Deposit(t *testing.T, rp *rocketpool.RocketPool, nodeAccount *accounts.Acco if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator pubkey: %w", err) } expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, depositType, salt, nil) if err != nil { return common.Address{}, nil, fmt.Errorf("Error generating minipool address: %w", err) } - withdrawalCredentials := utils.GetWithdrawalCredentials(expectedMinipoolAddress) + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, expectedMinipoolAddress, nil) + if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting minipool withdrawal credentials: %w", err) } validatorSignature, err := validator.GetValidatorSignature(pubkey) if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator signature: %w", err) } depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) diff --git a/utils/address_generation.go b/utils/address_generation.go index eea254f3d..5ca1ba07e 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -62,18 +62,6 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo } -// Transform a Minipool address into a Beacon Chain withdrawal address -func GetWithdrawalCredentials(minipoolAddress common.Address) common.Hash { - prefix := []byte{0x01} - padding := [11]byte{} - address := minipoolAddress.Bytes() - credentials := append(prefix, padding[:]...) - credentials = append(credentials, address[:]...) - - return common.BytesToHash(credentials) -} - - // Get contracts var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From a82b8f9fef20a2353b7069fd1e24ff4cc1bee733 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Oct 2021 02:37:53 -0400 Subject: [PATCH 401/878] Added a deposit event retrieval utility method --- utils/deposit_retrieval.go | 108 +++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 utils/deposit_retrieval.go diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go new file mode 100644 index 000000000..2952fa9c2 --- /dev/null +++ b/utils/deposit_retrieval.go @@ -0,0 +1,108 @@ +package utils + +import ( + "bytes" + "encoding/binary" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// BeaconDepositEvent represents a DepositEvent event raised by the BeaconDeposit contract. +type BeaconDepositEvent struct { + Pubkey []byte + WithdrawalCredentials []byte + Amount []byte + Signature []byte + Index []byte + Raw types.Log // Blockchain specific contextual infos +} + + +// Formatted Beacon deposit event data +type DepositData struct { + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount uint64 `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + TxHash common.Hash `json:"txHash"` +} + + +// Gets all of the deposit contract's deposit events for the provided minipool addresses +func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[common.Address][]DepositData, error ) { + + // Get the deposit contract wrapper + casperDeposit, err := getCasperDeposit(rp) + if err != nil { + return nil, err + } + + // Create the initial map and pubkey lookup + depositMap := make(map[common.Address][]DepositData) + pubkeyLookup := make(map[rptypes.ValidatorPubkey]common.Address) + for _, address := range minipoolAddresses { + pubkey, err := minipool.GetMinipoolPubkey(rp, address, nil) + if err != nil { + return nil, err + } + pubkeyLookup[pubkey] = address + depositMap[address] = []DepositData{} + } + + // Get the deposit events + addressFilter := []common.Address{*casperDeposit.Address} + topicFilter := [][]common.Hash{{casperDeposit.ABI.Events["DepositEvent"].ID}} + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Process each event + for _, log := range logs { + depositEvent := new(BeaconDepositEvent) + casperDeposit.Contract.UnpackLog(depositEvent, "DepositEvent", log) + + // Check if this is a deposit for one of the minipools we're looking for + pubkey := rptypes.BytesToValidatorPubkey(depositEvent.Pubkey) + minipoolAddress, exists := pubkeyLookup[pubkey] + if exists { + // Convert the deposit amount from little-endian binary to a uint64 + var amount uint64 + buf := bytes.NewReader(depositEvent.Amount) + err = binary.Read(buf, binary.LittleEndian, &amount) + if err != nil { + return nil, err + } + + // Create the deposit data wrapper and add it to this minipool's collection + depositData := DepositData{ + Pubkey: pubkey, + WithdrawalCredentials: common.BytesToHash(depositEvent.WithdrawalCredentials), + Amount: amount, + Signature: rptypes.BytesToValidatorSignature(depositEvent.Signature), + TxHash: log.TxHash, + } + depositMap[minipoolAddress] = append(depositMap[minipoolAddress], depositData) + } + } + + return depositMap, nil +} + + +// Get contracts +var casperDepositLock sync.Mutex +func getCasperDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + casperDepositLock.Lock() + defer casperDepositLock.Unlock() + return rp.GetContract("casperDeposit") +} + From d9f59b7b97b689b7b0e06b3962819e769623f75c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Oct 2021 19:55:10 -0400 Subject: [PATCH 402/878] Added scrub function bindings and deposit sorting --- minipool/minipool-contract.go | 17 +++++++++++++++++ utils/deposit_retrieval.go | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 7f6ea3f97..18f4e32b6 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -508,6 +508,7 @@ func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (* return *nodeAmount, nil } + // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) @@ -518,6 +519,22 @@ func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (* } +// Estimate the gas requiired to vote to scrub a minipool +func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") +} + + +// Vote to scrub a minipool +func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "voteScrub") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil +} + + // Get a minipool contract var rocketMinipoolLock sync.Mutex func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index 2952fa9c2..20022d1f9 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "math/big" + "sort" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -33,6 +34,8 @@ type DepositData struct { Amount uint64 `json:"amount"` Signature rptypes.ValidatorSignature `json:"signature"` TxHash common.Hash `json:"txHash"` + BlockNumber uint64 `json:"blockNumber"` + TxIndex uint `json:"txIndex"` } @@ -89,15 +92,38 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipoolAddresses []common.A Amount: amount, Signature: rptypes.BytesToValidatorSignature(depositEvent.Signature), TxHash: log.TxHash, + BlockNumber: log.BlockNumber, + TxIndex: log.TxIndex, } depositMap[minipoolAddress] = append(depositMap[minipoolAddress], depositData) } } + // Sort deposits by time + for _, deposits := range depositMap { + if len(deposits) > 1 { + sortDepositData(deposits) + } + } + return depositMap, nil } +// Sorts a slice of deposit data entries - lower blocks come first, and if multiple transactions occur +// in the same block, lower transaction indices come first +func sortDepositData(data []DepositData) { + sort.Slice(data, func(i int, j int) bool { + first := data[i] + second := data[j] + if first.BlockNumber == second.BlockNumber { + return first.TxIndex < second.TxIndex + } + return first.BlockNumber < second.BlockNumber + }) +} + + // Get contracts var casperDepositLock sync.Mutex func getCasperDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 6dccc680eebf8b9aa6d4448d4051afe37c4a38a9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Oct 2021 20:41:28 -0400 Subject: [PATCH 403/878] Reset the Azure pipeline --- azure-pipelines.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 019ab097c..a1338bf3a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,16 +19,16 @@ steps: inputs: secureFile: 'rp-azure-pipeline-github.pem' - bash: | -# eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") -# TOKEN=$(curl -s -X POST \ -# -H "Authorization: Bearer $PUSH_JWT" \ -# -H "Accept: application/vnd.github.v3+json" \ -# https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ -# | jq -r '.token') -# git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME -# git fetch github -# git push github HEAD:$(Build.SourceBranch) -f --verbose -# git push github HEAD:$(Build.SourceBranch) --tags --verbose + eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") + TOKEN=$(curl -s -X POST \ + -H "Authorization: Bearer $PUSH_JWT" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ + | jq -r '.token') + git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME + git fetch github + git push github HEAD:$(Build.SourceBranch) -f --verbose + git push github HEAD:$(Build.SourceBranch) --tags --verbose displayName: 'Push to Github' env: GITHUB_PEM_PATH: $(githubPEM.secureFilePath) From 74202b1868b2e85c3df59d703368eb7ecf361cab Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 14 Oct 2021 01:23:25 -0400 Subject: [PATCH 404/878] Changed GetMinipoolLaunchTimeout() to seconds --- settings/protocol/minipool.go | 12 +++++++----- tests/settings/protocol/minipool_test.go | 11 ++++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 063d935c8..1fc0e6277 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -119,8 +120,8 @@ func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value } -// Timeout period in blocks for prelaunch minipools to launch -func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// Timeout period in seconds for prelaunch minipools to launch +func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp) if err != nil { return 0, err @@ -129,10 +130,11 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) } - return (*value).Uint64(), nil + seconds := time.Duration((*value).Int64()) * time.Second + return seconds, nil } -func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value)), opts) +func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, opts *bind.TransactOpts) (common.Hash, error) { + return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) } diff --git a/tests/settings/protocol/minipool_test.go b/tests/settings/protocol/minipool_test.go index 1a5fe4a6a..6df12876f 100644 --- a/tests/settings/protocol/minipool_test.go +++ b/tests/settings/protocol/minipool_test.go @@ -1,12 +1,13 @@ package protocol import ( - "testing" + "testing" + "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) @@ -67,7 +68,7 @@ func TestMinipoolSettings(t *testing.T) { } // Set & get minipool launch timeout - var minipoolLaunchTimeout uint64 = 5 + var minipoolLaunchTimeout time.Duration = 5 * time.Second if _, err := protocol.BootstrapMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { t.Error(err) } else if value, err := protocol.GetMinipoolLaunchTimeout(rp, nil); err != nil { From 796368436a6ca98a231341dffc21665bdb609610 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 15 Oct 2021 11:10:54 -0400 Subject: [PATCH 405/878] Updated to geth v1.10.10 --- go.mod | 2 +- go.sum | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 9e69dbe26..b8a6eb7b5 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.9 + github.com/ethereum/go-ethereum v1.10.10 github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.2.1 diff --git a/go.sum b/go.sum index 0490981bf..9d26ed8cb 100644 --- a/go.sum +++ b/go.sum @@ -140,9 +140,10 @@ github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMa github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= @@ -152,8 +153,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.9 h1:uMSWt0qDhaqqCk0PWqfDFOMUExmk4Tnbma6c6oXW+Pk= -github.com/ethereum/go-ethereum v1.10.9/go.mod h1:CaTMQrv51WaAlD2eULQ3f03KiahDRO28fleQcKjWrrg= +github.com/ethereum/go-ethereum v1.10.10 h1:Ft2GcLQrr2M89l49g9NoqgNtJZ9AahzMb7N6VXKZy5U= +github.com/ethereum/go-ethereum v1.10.10/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -206,7 +207,7 @@ github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -336,7 +337,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= From ab32e8bc7d51658903a2559c27c8f5e4c1543fe3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Oct 2021 02:54:21 -0400 Subject: [PATCH 406/878] Added the prestake event to minipool --- minipool/minipool-contract.go | 59 +++++++++++++++++++++++++++++++++++ utils/deposit_retrieval.go | 18 +++++------ 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 18f4e32b6..618352133 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -35,6 +36,29 @@ type UserDetails struct { } +// The data from a minipool's MinipoolPrestaked event +type minipoolPrestakeEvent struct { + Pubkey []byte + Signature []byte + DepositDataRoot [32]byte + Amount *big.Int + WithdrawalCredentials []byte + Time *big.Int + Raw types.Log +} + + +// Formatted MinipoolPrestaked event data +type PrestakeData struct { + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount *big.Int `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + DepositDataRoot common.Hash `json:"depositDataRoot"` + Time time.Time `json:"time"` +} + + // Minipool contract type Minipool struct { Address common.Address @@ -535,6 +559,41 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } +// Get the data from this minipool's MinipoolPrestaked event +func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { + + addressFilter := []common.Address{ mp.Address } + topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} + logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, nil, nil, nil) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + } + + // Confirm there's only one of them + if len(logs) != 1 { + return PrestakeData{}, fmt.Errorf("ALERT: There were %d prestake logs for minipool %s", len(logs), mp.Address.Hex()) + } + + // Decode the event + prestakeEvent := new(minipoolPrestakeEvent) + mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", logs[0]) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + } + + // Convert the event to a more useable struct + prestakeData := PrestakeData { + Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), + WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), + Amount: prestakeEvent.Amount, + Signature: rptypes.BytesToValidatorSignature(prestakeEvent.Signature), + DepositDataRoot: prestakeEvent.DepositDataRoot, + Time: time.Unix(prestakeEvent.Time.Int64(), 0), + } + return prestakeData, nil +} + + // Get a minipool contract var rocketMinipoolLock sync.Mutex func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index 20022d1f9..55120e502 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -40,7 +40,7 @@ type DepositData struct { // Gets all of the deposit contract's deposit events for the provided minipool addresses -func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[common.Address][]DepositData, error ) { +func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipool, pubkeys []rptypes.ValidatorPubkey, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[*minipool.Minipool][]DepositData, error ) { // Get the deposit contract wrapper casperDeposit, err := getCasperDeposit(rp) @@ -49,13 +49,10 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipoolAddresses []common.A } // Create the initial map and pubkey lookup - depositMap := make(map[common.Address][]DepositData) - pubkeyLookup := make(map[rptypes.ValidatorPubkey]common.Address) - for _, address := range minipoolAddresses { - pubkey, err := minipool.GetMinipoolPubkey(rp, address, nil) - if err != nil { - return nil, err - } + depositMap := make(map[*minipool.Minipool][]DepositData) + pubkeyLookup := make(map[rptypes.ValidatorPubkey]*minipool.Minipool) + for i, address := range minipools { + pubkey := pubkeys[i] pubkeyLookup[pubkey] = address depositMap[address] = []DepositData{} } @@ -71,7 +68,10 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipoolAddresses []common.A // Process each event for _, log := range logs { depositEvent := new(BeaconDepositEvent) - casperDeposit.Contract.UnpackLog(depositEvent, "DepositEvent", log) + err = casperDeposit.Contract.UnpackLog(depositEvent, "DepositEvent", log) + if err != nil { + return nil, err + } // Check if this is a deposit for one of the minipools we're looking for pubkey := rptypes.BytesToValidatorPubkey(depositEvent.Pubkey) From 3ccc65aa99b861e0218d897acd3bcca6be007af9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Oct 2021 15:41:10 -0400 Subject: [PATCH 407/878] Changed GetMinipoolDeposits() to GetDeposits(), which only needs pubkeys now --- utils/deposit_retrieval.go | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index 55120e502..87ac1ab49 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -39,8 +38,8 @@ type DepositData struct { } -// Gets all of the deposit contract's deposit events for the provided minipool addresses -func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipool, pubkeys []rptypes.ValidatorPubkey, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[*minipool.Minipool][]DepositData, error ) { +// Gets all of the deposit contract's deposit events for the provided pubkeys +func GetDeposits(rp *rocketpool.RocketPool, pubkeys map[rptypes.ValidatorPubkey]bool, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[rptypes.ValidatorPubkey][]DepositData, error ) { // Get the deposit contract wrapper casperDeposit, err := getCasperDeposit(rp) @@ -49,13 +48,7 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipo } // Create the initial map and pubkey lookup - depositMap := make(map[*minipool.Minipool][]DepositData) - pubkeyLookup := make(map[rptypes.ValidatorPubkey]*minipool.Minipool) - for i, address := range minipools { - pubkey := pubkeys[i] - pubkeyLookup[pubkey] = address - depositMap[address] = []DepositData{} - } + depositMap := make(map[rptypes.ValidatorPubkey][]DepositData) // Get the deposit events addressFilter := []common.Address{*casperDeposit.Address} @@ -73,9 +66,9 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipo return nil, err } - // Check if this is a deposit for one of the minipools we're looking for + // Check if this is a deposit for one of the pubkeys we're looking for pubkey := rptypes.BytesToValidatorPubkey(depositEvent.Pubkey) - minipoolAddress, exists := pubkeyLookup[pubkey] + _, exists := pubkeys[pubkey] if exists { // Convert the deposit amount from little-endian binary to a uint64 var amount uint64 @@ -85,7 +78,7 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipo return nil, err } - // Create the deposit data wrapper and add it to this minipool's collection + // Create the deposit data wrapper and add it to this pubkey's collection depositData := DepositData{ Pubkey: pubkey, WithdrawalCredentials: common.BytesToHash(depositEvent.WithdrawalCredentials), @@ -95,7 +88,7 @@ func GetMinipoolDeposits(rp *rocketpool.RocketPool, minipools []*minipool.Minipo BlockNumber: log.BlockNumber, TxIndex: log.TxIndex, } - depositMap[minipoolAddress] = append(depositMap[minipoolAddress], depositData) + depositMap[pubkey] = append(depositMap[pubkey], depositData) } } From ce1413b6f2e21be9ee1dc8485c64730860b43727 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Oct 2021 16:04:16 -0400 Subject: [PATCH 408/878] Added a capacity hint to a map --- utils/deposit_retrieval.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index 87ac1ab49..879dbe893 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -48,7 +48,7 @@ func GetDeposits(rp *rocketpool.RocketPool, pubkeys map[rptypes.ValidatorPubkey] } // Create the initial map and pubkey lookup - depositMap := make(map[rptypes.ValidatorPubkey][]DepositData) + depositMap := make(map[rptypes.ValidatorPubkey][]DepositData, len(pubkeys)) // Get the deposit events addressFilter := []common.Address{*casperDeposit.Address} From 2c58764797a6e871c8cf27d7909a2e59f148ad99 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Oct 2021 21:44:29 -0400 Subject: [PATCH 409/878] Added ABI decorators to BeaconDepositEvent and minipoolPrestateEvent --- minipool/minipool-contract.go | 14 ++++++-------- utils/deposit_retrieval.go | 12 ++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 618352133..92187c08e 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -38,13 +37,12 @@ type UserDetails struct { // The data from a minipool's MinipoolPrestaked event type minipoolPrestakeEvent struct { - Pubkey []byte - Signature []byte - DepositDataRoot [32]byte - Amount *big.Int - WithdrawalCredentials []byte - Time *big.Int - Raw types.Log + Pubkey []byte `abi:"validatorPubkey"` + Signature []byte `abi:"validatorSignature"` + DepositDataRoot [32]byte `abi:"depositDataRoot"` + Amount *big.Int `abi:"amount"` + WithdrawalCredentials []byte `abi:"withdrawalCredentials"` + Time *big.Int `abi:"time"` } diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index 879dbe893..d6862a39e 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -17,12 +17,12 @@ import ( // BeaconDepositEvent represents a DepositEvent event raised by the BeaconDeposit contract. type BeaconDepositEvent struct { - Pubkey []byte - WithdrawalCredentials []byte - Amount []byte - Signature []byte - Index []byte - Raw types.Log // Blockchain specific contextual infos + Pubkey []byte `abi:"pubkey"` + WithdrawalCredentials []byte `abi:"withdrawal_credentials"` + Amount []byte `abi:"amount"` + Signature []byte `abi:"signature"` + Index []byte `abi:"index"` + Raw types.Log // Blockchain specific contextual infos } From 489bf11d5ab97a0df0e1e7cf9f17bba66b6ef080 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Oct 2021 21:32:50 -0400 Subject: [PATCH 410/878] Updated to geth v1.10.11 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b8a6eb7b5..bfaad7358 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.10 + github.com/ethereum/go-ethereum v1.10.11 github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.2.1 diff --git a/go.sum b/go.sum index 9d26ed8cb..77db95c3d 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.10 h1:Ft2GcLQrr2M89l49g9NoqgNtJZ9AahzMb7N6VXKZy5U= -github.com/ethereum/go-ethereum v1.10.10/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.11 h1:KKIcwpmur9iTaVbR2dxlHu+peHVhU+/KX//NWvT1n9U= +github.com/ethereum/go-ethereum v1.10.11/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From 0f422821decb3ce47a4d687c3c537cf63d141255 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 22 Oct 2021 02:07:45 -0400 Subject: [PATCH 411/878] Added ScrubPenaltyEnabled --- settings/trustednode/minipool.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 3f8ff2a65..2b22d8134 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -16,6 +16,7 @@ import ( const ( MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" ScrubPeriodPath = "minipool.scrub.period" + ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" ) @@ -42,6 +43,29 @@ func EstimateProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts } +// Whether or not the RPL slashing penalty is applied to scrubbed minipools +func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := minipoolSettingsContract.Call(opts, value, "getScrubPenaltyEnabled"); err != nil { + return false, fmt.Errorf("Could not get scrub penalty setting: %w", err) + } + return (*value), nil +} +func BootstrapScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapBool(rp, MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) +} +func ProposeScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetBool(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) +} +func EstimateProposeScrubPenaltyEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) +} + + // Get contracts var minipoolSettingsContractLock sync.Mutex func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From c07d725d0ab8ca9dddd1e937721b174887383ef9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 24 Oct 2021 22:44:17 -0400 Subject: [PATCH 412/878] Added batching to GetPrelaunchMinipoolAddresses() --- minipool/minipool.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index d85a37477..962467824 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -15,6 +15,7 @@ import ( // Settings const ( + MinipoolPrelaunchBatchSize = 750 MinipoolAddressBatchSize = 50 MinipoolDetailsBatchSize = 20 ) @@ -140,14 +141,27 @@ func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpt if err != nil { return []common.Address{}, err } - offset := big.NewInt(0) - limit := big.NewInt(0) - addresses := new([]common.Address) - if err := rocketMinipoolManager.Call(opts, addresses, "getPrelaunchMinipools", offset, limit); err != nil { - return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return []common.Address{}, err } - return *addresses, nil + totalMinipools := int64(totalMinipoolsUint) + addresses := []common.Address{} + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of addresses + offset := big.NewInt(i) + newAddresses := new([]common.Address) + if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { + return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + } + addresses = append(addresses, *newAddresses...) + } + + return addresses, nil } From aefeca3a0106cc7ac135a181e85c9cd7aafcb623 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Oct 2021 02:46:16 -0400 Subject: [PATCH 413/878] Removed the pubkey parameter from Stake --- minipool/minipool-contract.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 92187c08e..c54904fad 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -376,8 +376,8 @@ func (mp *Minipool) EstimateStakeGas(validatorPubkey rptypes.ValidatorPubkey, va // Progress the prelaunch minipool to staking -func (mp *Minipool) Stake(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) +func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) } From feefd859ca3086fb1735721ff40465f4f187808d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Oct 2021 00:17:53 -0400 Subject: [PATCH 414/878] Fixed updated parameter count for Stake gas estimation --- minipool/minipool-contract.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index c54904fad..49409368c 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -370,8 +370,8 @@ func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (commo // Estimate the gas of Stake -func (mp *Minipool) EstimateStakeGas(validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorPubkey[:], validatorSignature[:], depositDataRoot) +func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } From a9aea68b6a2c74ccffda432420d0925a1e264490 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Wed, 3 Nov 2021 11:53:46 +1000 Subject: [PATCH 415/878] Use backwards scan to find prestake event --- minipool/minipool-contract.go | 57 +++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 49409368c..cd12e7c7e 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,8 +1,11 @@ package minipool import ( - "fmt" - "math/big" + "context" + "fmt" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "math/big" "sync" "time" @@ -15,6 +18,9 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// The number of blocks to look for events in at once when scanning +const EventScanInterval = 10000 + // Minipool detail types type StatusDetails struct { Status rptypes.MinipoolStatus `json:"status"` @@ -562,19 +568,52 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) addressFilter := []common.Address{ mp.Address } topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} - logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, nil, nil, nil) + + // Grab the latest block number + currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + } + + // Grab the lowest block number worth querying from (should never have to go back this far in practice) + deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) + fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + } + + fromBlock := fromBlockBig.Uint64() + var log types.Log + found := false + + // Backwards scan through blocks to find the event + for i := currentBlock; i >= fromBlock; i -= EventScanInterval { + from := i - EventScanInterval + 1 + if from < fromBlock { from = fromBlock } + + fromBig := big.NewInt(0).SetUint64(from) + toBig := big.NewInt(0).SetUint64(i) + + logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + } + + if len(logs) > 0 { + log = logs[0] + found = true + break + } } - - // Confirm there's only one of them - if len(logs) != 1 { - return PrestakeData{}, fmt.Errorf("ALERT: There were %d prestake logs for minipool %s", len(logs), mp.Address.Hex()) + + if !found { + // This should never happen + return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) } // Decode the event prestakeEvent := new(minipoolPrestakeEvent) - mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", logs[0]) + mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) if err != nil { return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) } From 96a423a7eac07ba261cc6d13b5e01b4d4c5c0be3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 2 Nov 2021 22:46:04 -0400 Subject: [PATCH 416/878] Updated test methods with the new Stake signature --- tests/minipool/contract_test.go | 2 +- tests/testutils/minipool/minipool.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index c7808b6c2..7200b002e 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -203,7 +203,7 @@ func TestStake(t *testing.T) { if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } // Stake minipool - if _, err := mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { + if _, err := mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 8de6d3be9..a33a7e2b8 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -77,7 +77,7 @@ func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount if err != nil { return err } // Stake minipool & return - _, err = mp.Stake(validatorPubkey, validatorSignature, depositDataRoot, nodeAccount.GetTransactor()) + _, err = mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()) return err } From 42074930595e3fdfa97728f9d4206d424450b71e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 3 Nov 2021 01:14:54 -0400 Subject: [PATCH 417/878] Added a start block parameter to the total rewards calculations --- rewards/node.go | 4 ++-- rewards/trusted-node.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rewards/node.go b/rewards/node.go index 13d41259a..af9b9502a 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -72,7 +72,7 @@ func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int) (*big.Int, error) { +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -88,7 +88,7 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) if err != nil { return nil, err } diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 123df6d04..4e589a7b1 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -73,7 +73,7 @@ func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int) (*big.Int, error) { +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -89,7 +89,7 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, nil, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) if err != nil { return nil, err } From cad7c8cc803315c1fb90d93efd7f2b9d321cd213 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 4 Nov 2021 12:20:04 +1000 Subject: [PATCH 418/878] Add cut down participation metric collector --- node/node.go | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/node/node.go b/node/node.go index dda2f6e53..978f2e595 100644 --- a/node/node.go +++ b/node/node.go @@ -586,6 +586,128 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, interv return &participation, nil } +// Returns an array of members who submitted a balance since fromBlock +func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil +} + +// Returns a mapping of members and whether they have submitted balances this interval or not +func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency + submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range(members) { + participationTable[member.Address] = false + } + for _, submission := range(submissions) { + participationTable[submission] = true + } + return participationTable, nil +} + +// Returns an array of members who submitted prices since fromBlock +func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil +} + +// Returns a mapping of members and whether they have submitted prices this interval or not +func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency + submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range(members) { + participationTable[member.Address] = false + } + for _, submission := range(submissions) { + participationTable[submission] = true + } + return participationTable, nil +} + // Get contracts var rocketNodeManagerLock sync.Mutex func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From cf76bb9346466b180ae7ac2234c379b0ea489ca5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 5 Nov 2021 02:05:11 -0400 Subject: [PATCH 419/878] Added a license file --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From bdfcf0b7058988ba4935a77fe4a5d0d7e536df2d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 9 Nov 2021 14:31:35 -0500 Subject: [PATCH 420/878] Testing removal of user-specified gas price during TX simulation --- rocketpool/contract.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 75bffa14a..9e83949c9 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -65,8 +65,16 @@ func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, return response, fmt.Errorf("Error getting transaction gas info: Could not encode input data: %w", err) } + // Temporarily set the gas price to 0 for simulation + userGasPrice := opts.GasPrice + opts.GasPrice = big.NewInt(0) + // Estimate gas limit estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, input) + + // Replace the gas price + opts.GasPrice = userGasPrice + if err != nil { return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) } From f9dc0ce0d1cd28c21767fbcaf88a59138c6bd5de Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 10 Nov 2021 22:33:52 -0500 Subject: [PATCH 421/878] Added a retry loop to WaitForTransaction to fix waiting on a node that hasn't seen a TX yet --- utils/wait.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/utils/wait.go b/utils/wait.go index 1ac20b788..47ae50f8b 100644 --- a/utils/wait.go +++ b/utils/wait.go @@ -3,6 +3,8 @@ package utils import ( "context" "errors" + "fmt" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -13,10 +15,23 @@ import ( // Wait for a transaction to get mined func WaitForTransaction(client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { - // Get the transaction from its hash - tx, _, err := client.TransactionByHash(context.Background(), hash) - if err != nil { - return nil, err + var tx *types.Transaction + var err error + + // Get the transaction from its hash, retrying for 30 sec if it wasn't found + for i := 0; i < 30; i++ { + if i == 29 { + return nil, fmt.Errorf("Transaction not found after 30 seconds.") + } + + tx, _, err = client.TransactionByHash(context.Background(), hash) + if err != nil { + if err.Error() == "not found" { + time.Sleep(1 * time.Second) + continue; + } + return nil, err + } } // Wait for transaction to be mined From 4250dcd3d90101617a49c701388903b71cd7d88a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 15 Nov 2021 21:10:35 -0500 Subject: [PATCH 422/878] Removed gas price estimation --- rocketpool/contract.go | 45 ++++++--------------------------------- utils/eth/transactions.go | 14 ++---------- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 9e83949c9..172e40ea4 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -32,13 +32,10 @@ type Contract struct { } -// Response for gas prices and limits from network and from user request +// Response for gas limits from network and from user request type GasInfo struct { - EstGasPrice *big.Int `json:"estGasPrice"` EstGasLimit uint64 `json:"estGasLimit"` SafeGasLimit uint64 `json:"safeGasLimit"` - ReqGasPrice *big.Int `json:"reqGasPrice"` - ReqGasLimit uint64 `json:"reqGasLimit"` } @@ -50,14 +47,10 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, } -// Get Gas Price and Gas Limit for transaction +// Get Gas Limit for transaction func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, params ...interface{}) (GasInfo, error) { - // set user option for gas price and gas limit - response := GasInfo { - ReqGasPrice: opts.GasPrice, - ReqGasLimit: opts.GasLimit, - } + response := GasInfo{} // Pack transaction Info input, err := c.ABI.Pack(method, params...) @@ -65,29 +58,15 @@ func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, return response, fmt.Errorf("Error getting transaction gas info: Could not encode input data: %w", err) } - // Temporarily set the gas price to 0 for simulation - userGasPrice := opts.GasPrice - opts.GasPrice = big.NewInt(0) - // Estimate gas limit estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, input) - // Replace the gas price - opts.GasPrice = userGasPrice - if err != nil { return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) } response.EstGasLimit = estGasLimit response.SafeGasLimit = safeGasLimit - // Estimate gas price - estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) - if err != nil { - return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas price: %w", err) - } - response.EstGasPrice = estGasPrice - return response, err } @@ -119,14 +98,10 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in } -// Get gas price and gas limit for a transfer call +// Get gas limit for a transfer call func (c *Contract) GetTransferGasInfo(opts *bind.TransactOpts) (GasInfo, error) { - // set user option for gas price and gas limit - response := GasInfo { - ReqGasPrice: opts.GasPrice, - ReqGasLimit: opts.GasLimit, - } + response := GasInfo {} // Estimate gas limit estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) @@ -136,13 +111,6 @@ func (c *Contract) GetTransferGasInfo(opts *bind.TransactOpts) (GasInfo, error) response.EstGasLimit = estGasLimit response.SafeGasLimit = safeGasLimit - // Estimate gas price - estGasPrice, err := c.Client.SuggestGasPrice(context.Background()) - if err != nil { - return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas price: %w", err) - } - response.EstGasPrice = estGasPrice - return response, nil } @@ -177,10 +145,11 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint gasLimit, err := c.Client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, To: c.Address, - GasPrice: opts.GasPrice, + GasPrice: big.NewInt(0), // use 0 gwei for simulation Value: opts.Value, Data: input, }) + if err != nil { return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) } diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index cacbafe88..13e1dbbb6 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -16,10 +16,7 @@ import ( func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { // User-defined settings - response := rocketpool.GasInfo { - ReqGasPrice: opts.GasPrice, - ReqGasLimit: opts.GasLimit, - } + response := rocketpool.GasInfo{} // Set default value value := opts.Value @@ -27,18 +24,11 @@ func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Addre value = big.NewInt(0) } - // Get suggested gas price - gasPrice, err := client.SuggestGasPrice(context.Background()) - if err != nil { - return rocketpool.GasInfo{}, err - } - response.EstGasPrice = gasPrice - // Estimate gas limit gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, To: &toAddress, - GasPrice: gasPrice, + GasPrice: big.NewInt(0), // set to 0 for simulation Value: value, }) if err != nil { From b588ecff230c4c6df01829e253e7776e3e5c63f6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 16 Nov 2021 19:53:03 -0500 Subject: [PATCH 423/878] Updated dependencies --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index bfaad7358..854cd1c8b 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.11 - github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 // indirect + github.com/ethereum/go-ethereum v1.10.12 + github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/princjef/gomarkdoc v0.2.1 + github.com/princjef/gomarkdoc v0.3.0 github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 diff --git a/go.sum b/go.sum index 77db95c3d..05e459651 100644 --- a/go.sum +++ b/go.sum @@ -153,15 +153,15 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.11 h1:KKIcwpmur9iTaVbR2dxlHu+peHVhU+/KX//NWvT1n9U= -github.com/ethereum/go-ethereum v1.10.11/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.12 h1:el/KddB3gLEsnNgGQ3SQuZuiZjwnFTYHe5TwUet5Om4= +github.com/ethereum/go-ethereum v1.10.12/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 h1:6dVcS0LktRSyEEgldFY4N9J17WjUoiJStttH+RZj0Wo= -github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4= +github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 h1:nC0t8T3xV1VKkeuvshDianzS4j2AsLxaI1vSQEKjqiQ= +github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= @@ -464,8 +464,8 @@ github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUI github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/princjef/gomarkdoc v0.2.1 h1:/I0mbQUwpQ2yMC6Sd1ATep/icirzVpiRfhcuiSlOjDg= -github.com/princjef/gomarkdoc v0.2.1/go.mod h1:k16wbqWczV/LpfLxcv3G4y0qFtM2f4wicmmZBNzyFLc= +github.com/princjef/gomarkdoc v0.3.0 h1:1kOsinr3g4uqvnz3ohEi96G+mtygadzB6ATTJWP1bfE= +github.com/princjef/gomarkdoc v0.3.0/go.mod h1:k16wbqWczV/LpfLxcv3G4y0qFtM2f4wicmmZBNzyFLc= github.com/princjef/mageutil v0.1.0 h1:WXB92nDhPh8oKR7woRWCriDFeF75mYZ6JwDUxo8DJ34= github.com/princjef/mageutil v0.1.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= From 2c14deee795c9b252c7635ce27b3e1f37feafa8d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 16 Nov 2021 21:53:08 -0500 Subject: [PATCH 424/878] Fixed a missing loop escape --- utils/wait.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/wait.go b/utils/wait.go index 47ae50f8b..fd6f0249e 100644 --- a/utils/wait.go +++ b/utils/wait.go @@ -31,6 +31,8 @@ func WaitForTransaction(client *ethclient.Client, hash common.Hash) (*types.Rece continue; } return nil, err + } else { + break } } From 6e17cf29899165847a20713984d9c8badaf93bcf Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 22 Nov 2021 00:22:52 -0500 Subject: [PATCH 425/878] Upgraded ETH sends to 1559 --- tests/minipool/contract_test.go | 3 ++- tests/utils/eth/transactions_test.go | 3 ++- utils/eth/transactions.go | 25 +++++++++++++------------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 7200b002e..052e10c54 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/hex" "fmt" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -279,7 +280,7 @@ func TestClose(t *testing.T) { // Simulate a post-merge withdrawal by sending 16 ETH to the minipool opts := nodeAccount.GetTransactor() opts.Value = eth.EthToWei(16) - hash, err := eth.SendTransaction(rp.Client, mp.Address, opts) + hash, err := eth.SendTransaction(rp.Client, mp.Address, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 if err != nil { t.Errorf("Error sending ETH to minipool: %s", err.Error()) } diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index b5e6cb9c5..fae545602 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -2,6 +2,7 @@ package eth import ( "context" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -37,7 +38,7 @@ func TestSendTransaction(t *testing.T) { // Send transaction opts := userAccount.GetTransactor() opts.Value = sendAmount - hash, err := eth.SendTransaction(client, toAddress, opts) + hash, err := eth.SendTransaction(client, toAddress, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 if err != nil { t.Fatal(err) } diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 13e1dbbb6..1182363d3 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -42,7 +42,7 @@ func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Addre // Send a transaction to an address -func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func SendTransaction(client *ethclient.Client, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce @@ -62,22 +62,13 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b value = big.NewInt(0) } - // Get suggested gas price - gasPrice := opts.GasPrice - if gasPrice == nil { - gasPrice, err = client.SuggestGasPrice(context.Background()) - if err != nil { - return common.Hash{}, err - } - } - // Estimate gas limit gasLimit := opts.GasLimit if gasLimit == 0 { gasLimit, err = client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, To: &toAddress, - GasPrice: gasPrice, + GasPrice: big.NewInt(0), // use 0 gwei for simulation Value: value, }) if err != nil { @@ -86,7 +77,17 @@ func SendTransaction(client *ethclient.Client, toAddress common.Address, opts *b } // Initialize transaction - tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, []byte{}) + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: chainID, + Nonce: nonce, + GasTipCap: opts.GasTipCap, + GasFeeCap: opts.GasFeeCap, + Gas: gasLimit, + To: &toAddress, + Value: value, + Data: []byte{}, + AccessList: []types.AccessTuple{}, + }) // Sign transaction signedTx, err := opts.Signer(opts.From, tx) From 8d2fc817997bf27378af245f526f37681c5af352 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 28 Nov 2021 12:30:35 -0500 Subject: [PATCH 426/878] Updated to Geth v1.10.13 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 854cd1c8b..3558089aa 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.12 + github.com/ethereum/go-ethereum v1.10.13 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index 05e459651..fa8a94213 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.12 h1:el/KddB3gLEsnNgGQ3SQuZuiZjwnFTYHe5TwUet5Om4= -github.com/ethereum/go-ethereum v1.10.12/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.13 h1:DEYFP9zk+Gruf3ae1JOJVhNmxK28ee+sMELPLgYTXpA= +github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From 66488eeb46bf5d9c579b3706183e9ee03458ea38 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Dec 2021 21:10:53 -0500 Subject: [PATCH 427/878] Initial fallback support test --- minipool/minipool-contract.go | 21 +++++++---- rocketpool/contract.go | 48 ++++++++++++++++++++++--- rocketpool/rocketpool.go | 39 +++++++++++++++++--- tests/auction/main_test.go | 2 +- tests/dao/main_test.go | 2 +- tests/dao/trustednode/main_test.go | 18 +++++----- tests/deposit/main_test.go | 18 +++++----- tests/minipool/main_test.go | 18 +++++----- tests/network/main_test.go | 18 +++++----- tests/node/main_test.go | 18 +++++----- tests/rewards/main_test.go | 18 +++++----- tests/rocketpool/main_test.go | 16 ++++----- tests/settings/protocol/main_test.go | 18 +++++----- tests/settings/trustednode/main_test.go | 2 +- tests/tokens/main_test.go | 18 +++++----- utils/eth/logs.go | 12 +++++-- 16 files changed, 186 insertions(+), 100 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index cd12e7c7e..5e3e49c96 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,14 +1,16 @@ package minipool import ( - "context" - "fmt" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "math/big" + "context" + "fmt" + "math/big" + "strings" "sync" "time" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -579,7 +581,14 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + if strings.Contains(err.Error(), "dial tcp") && mp.RocketPool.FallbackClient != nil { + fromBlockBig, err = mp.RocketPool.FallbackRocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + } + } else { + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + } } fromBlock := fromBlockBig.Uint64() diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 172e40ea4..99a128b43 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -7,6 +7,7 @@ import ( "fmt" "math/big" "reflect" + "strings" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -26,9 +27,11 @@ const ( // Contract type wraps go-ethereum bound contract type Contract struct { Contract *bind.BoundContract + FallbackContract *bind.BoundContract Address *common.Address ABI *abi.ABI Client *ethclient.Client + FallbackClient *ethclient.Client } @@ -43,7 +46,16 @@ type GasInfo struct { func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { results := make([]interface{}, 1) results[0] = result - return c.Contract.Call(opts, &results, method, params...) + err := c.Contract.Call(opts, &results, method, params...) + if err != nil { + if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { + // This was a connection problem, try the fallback if possible + return c.FallbackContract.Call(opts, &results, method, params...) + } else { + return err + } + } + return nil } @@ -90,7 +102,12 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { - return common.Hash{}, err + if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { + // This was a connection problem, try the fallback if possible + tx, err = c.FallbackContract.Transact(opts, method, params...) + } else { + return common.Hash{}, err + } } return tx.Hash(), nil @@ -130,7 +147,12 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { // Send transaction tx, err := c.Contract.Transfer(opts) if err != nil { - return common.Hash{}, err + if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { + // This was a connection problem, try the fallback if possible + tx, err = c.FallbackContract.Transfer(opts) + } else { + return common.Hash{}, err + } } return tx.Hash(), nil @@ -151,7 +173,18 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint }) if err != nil { - return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) + if strings.Contains(err.Error(), "dial tcp") && c.FallbackClient != nil { + // This was a connection problem, try the fallback if possible + gasLimit, err = c.FallbackClient.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: c.Address, + GasPrice: big.NewInt(0), // use 0 gwei for simulation + Value: opts.Value, + Data: input, + }) + } else { + return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) + } } // Pad and return gas limit @@ -169,7 +202,12 @@ func (c *Contract) getTransactionReceipt(tx *types.Transaction) (*types.Receipt, // Wait for transaction to be mined txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) if err != nil { - return nil, err + if strings.Contains(err.Error(), "dial tcp") && c.FallbackClient != nil { + // This was a connection problem, try the fallback if possible + txReceipt, err = bind.WaitMined(context.Background(), c.FallbackClient, tx) + } else { + return nil, err + } } // Check transaction status diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 589c1a0b4..20a6e1220 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -46,17 +46,24 @@ type RocketPool struct { addressesLock sync.RWMutex abisLock sync.RWMutex contractsLock sync.RWMutex + + FallbackClient *ethclient.Client + FallbackRocketStorage *contracts.RocketStorage } // Create new contract manager -func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { +func NewRocketPool(client *ethclient.Client, fallbackClient *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { // Initialize RocketStorage contract rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) if err != nil { return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) } + fallbackRocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, fallbackClient) + if err != nil { + return nil, fmt.Errorf("Could not initialize fallback Rocket Pool storage contract: %w", err) + } // Create a Contract for it rsAbi, err := abi.JSON(strings.NewReader(contracts.RocketStorageABI)) @@ -65,9 +72,11 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address } contract := &Contract{ Contract: bind.NewBoundContract(rocketStorageAddress, rsAbi, client, client, client), + FallbackContract: bind.NewBoundContract(rocketStorageAddress, rsAbi, fallbackClient, fallbackClient, fallbackClient), Address: &rocketStorageAddress, ABI: &rsAbi, Client: client, + FallbackClient: fallbackClient, } // Create and return @@ -78,8 +87,10 @@ func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address addresses: make(map[string]cachedAddress), abis: make(map[string]cachedABI), contracts: make(map[string]cachedContract), + + FallbackClient: fallbackClient, + FallbackRocketStorage: fallbackRocketStorage, }, nil - } @@ -98,7 +109,15 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Get address address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) + // Try the fallback client + if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { + address, err = rp.FallbackRocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) + } + } else { + return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) + } } // Cache address @@ -153,7 +172,15 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Get ABI abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) + // Try the fallback client + if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { + abiEncoded, err = rp.FallbackRocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) + } + } else { + return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) + } } // Decode ABI @@ -236,9 +263,11 @@ func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { // Create contract contract := &Contract{ Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), + FallbackContract: bind.NewBoundContract(*address, *abi, rp.FallbackClient, rp.FallbackClient, rp.FallbackClient), Address: address, ABI: abi, Client: rp.Client, + FallbackClient: rp.FallbackClient, } // Cache contract @@ -290,9 +319,11 @@ func (rp *RocketPool) MakeContract(contractName string, address common.Address) // Create and return return &Contract{ Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + FallbackContract: bind.NewBoundContract(address, *abi, rp.FallbackClient, rp.FallbackClient, rp.FallbackClient), Address: &address, ABI: abi, Client: rp.Client, + FallbackClient: rp.FallbackClient, }, nil } diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 52477647d..d80981d8a 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -37,7 +37,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 9ddeb26ae..c7263e60d 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -36,7 +36,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index 601a15b4f..b85d1db13 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -1,17 +1,17 @@ package trustednode import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -36,7 +36,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 366e36115..7261ae6ab 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -1,17 +1,17 @@ package deposit import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 308421704..315ae6c62 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -1,17 +1,17 @@ package minipool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -35,7 +35,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 2661864dd..714375ce5 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -1,17 +1,17 @@ package network import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -34,7 +34,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 660e823c0..81bfa8ec2 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -1,17 +1,17 @@ package node import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index bdda658f5..70c2b326b 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -1,17 +1,17 @@ package rewards import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index ad4bfa018..624cba3d1 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -1,16 +1,16 @@ package rocketpool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) @@ -28,7 +28,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index 47ea2a8dc..424d6a708 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -1,17 +1,17 @@ package protocol import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 7f7d06d4e..07fb293c3 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -34,7 +34,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index b721902f6..aefabc3fc 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -1,17 +1,17 @@ package tokens import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -35,7 +35,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/utils/eth/logs.go b/utils/eth/logs.go index a79d156ec..b479a05c0 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -3,6 +3,7 @@ package eth import ( "context" "math/big" + "strings" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" @@ -56,8 +57,15 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil var err error deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlock, err = rp.RocketStorage.GetUint(nil, deployBlockHash) - if err != nil { - return nil, err + if err != nil { + if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { + fromBlock, err = rp.FallbackRocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return nil, err + } + } else { + return nil, err + } } } From f7fca9c51830f743f7be3582a9d7514e9b3cedc9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Dec 2021 00:46:18 -0500 Subject: [PATCH 428/878] Revert "Initial fallback support test" This reverts commit 66488eeb46bf5d9c579b3706183e9ee03458ea38. --- minipool/minipool-contract.go | 21 ++++------- rocketpool/contract.go | 48 +++---------------------- rocketpool/rocketpool.go | 39 +++----------------- tests/auction/main_test.go | 2 +- tests/dao/main_test.go | 2 +- tests/dao/trustednode/main_test.go | 18 +++++----- tests/deposit/main_test.go | 18 +++++----- tests/minipool/main_test.go | 18 +++++----- tests/network/main_test.go | 18 +++++----- tests/node/main_test.go | 18 +++++----- tests/rewards/main_test.go | 18 +++++----- tests/rocketpool/main_test.go | 16 ++++----- tests/settings/protocol/main_test.go | 18 +++++----- tests/settings/trustednode/main_test.go | 2 +- tests/tokens/main_test.go | 18 +++++----- utils/eth/logs.go | 12 ++----- 16 files changed, 100 insertions(+), 186 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 5e3e49c96..cd12e7c7e 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,16 +1,14 @@ package minipool import ( - "context" - "fmt" - "math/big" - "strings" + "context" + "fmt" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "math/big" "sync" "time" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -581,14 +579,7 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - if strings.Contains(err.Error(), "dial tcp") && mp.RocketPool.FallbackClient != nil { - fromBlockBig, err = mp.RocketPool.FallbackRocketStorage.GetUint(nil, deployBlockHash) - if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) - } - } else { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) - } + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } fromBlock := fromBlockBig.Uint64() diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 99a128b43..172e40ea4 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -7,7 +7,6 @@ import ( "fmt" "math/big" "reflect" - "strings" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,11 +26,9 @@ const ( // Contract type wraps go-ethereum bound contract type Contract struct { Contract *bind.BoundContract - FallbackContract *bind.BoundContract Address *common.Address ABI *abi.ABI Client *ethclient.Client - FallbackClient *ethclient.Client } @@ -46,16 +43,7 @@ type GasInfo struct { func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { results := make([]interface{}, 1) results[0] = result - err := c.Contract.Call(opts, &results, method, params...) - if err != nil { - if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { - // This was a connection problem, try the fallback if possible - return c.FallbackContract.Call(opts, &results, method, params...) - } else { - return err - } - } - return nil + return c.Contract.Call(opts, &results, method, params...) } @@ -102,12 +90,7 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { - if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { - // This was a connection problem, try the fallback if possible - tx, err = c.FallbackContract.Transact(opts, method, params...) - } else { - return common.Hash{}, err - } + return common.Hash{}, err } return tx.Hash(), nil @@ -147,12 +130,7 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { // Send transaction tx, err := c.Contract.Transfer(opts) if err != nil { - if strings.Contains(err.Error(), "dial tcp") && c.FallbackContract != nil { - // This was a connection problem, try the fallback if possible - tx, err = c.FallbackContract.Transfer(opts) - } else { - return common.Hash{}, err - } + return common.Hash{}, err } return tx.Hash(), nil @@ -173,18 +151,7 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint }) if err != nil { - if strings.Contains(err.Error(), "dial tcp") && c.FallbackClient != nil { - // This was a connection problem, try the fallback if possible - gasLimit, err = c.FallbackClient.EstimateGas(context.Background(), ethereum.CallMsg{ - From: opts.From, - To: c.Address, - GasPrice: big.NewInt(0), // use 0 gwei for simulation - Value: opts.Value, - Data: input, - }) - } else { - return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) - } + return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) } // Pad and return gas limit @@ -202,12 +169,7 @@ func (c *Contract) getTransactionReceipt(tx *types.Transaction) (*types.Receipt, // Wait for transaction to be mined txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) if err != nil { - if strings.Contains(err.Error(), "dial tcp") && c.FallbackClient != nil { - // This was a connection problem, try the fallback if possible - txReceipt, err = bind.WaitMined(context.Background(), c.FallbackClient, tx) - } else { - return nil, err - } + return nil, err } // Check transaction status diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 20a6e1220..589c1a0b4 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -46,24 +46,17 @@ type RocketPool struct { addressesLock sync.RWMutex abisLock sync.RWMutex contractsLock sync.RWMutex - - FallbackClient *ethclient.Client - FallbackRocketStorage *contracts.RocketStorage } // Create new contract manager -func NewRocketPool(client *ethclient.Client, fallbackClient *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { +func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { // Initialize RocketStorage contract rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) if err != nil { return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) } - fallbackRocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, fallbackClient) - if err != nil { - return nil, fmt.Errorf("Could not initialize fallback Rocket Pool storage contract: %w", err) - } // Create a Contract for it rsAbi, err := abi.JSON(strings.NewReader(contracts.RocketStorageABI)) @@ -72,11 +65,9 @@ func NewRocketPool(client *ethclient.Client, fallbackClient *ethclient.Client, r } contract := &Contract{ Contract: bind.NewBoundContract(rocketStorageAddress, rsAbi, client, client, client), - FallbackContract: bind.NewBoundContract(rocketStorageAddress, rsAbi, fallbackClient, fallbackClient, fallbackClient), Address: &rocketStorageAddress, ABI: &rsAbi, Client: client, - FallbackClient: fallbackClient, } // Create and return @@ -87,10 +78,8 @@ func NewRocketPool(client *ethclient.Client, fallbackClient *ethclient.Client, r addresses: make(map[string]cachedAddress), abis: make(map[string]cachedABI), contracts: make(map[string]cachedContract), - - FallbackClient: fallbackClient, - FallbackRocketStorage: fallbackRocketStorage, }, nil + } @@ -109,15 +98,7 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { // Get address address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) if err != nil { - // Try the fallback client - if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { - address, err = rp.FallbackRocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) - if err != nil { - return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) - } - } else { - return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) - } + return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) } // Cache address @@ -172,15 +153,7 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { // Get ABI abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { - // Try the fallback client - if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { - abiEncoded, err = rp.FallbackRocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) - if err != nil { - return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) - } - } else { - return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) - } + return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) } // Decode ABI @@ -263,11 +236,9 @@ func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { // Create contract contract := &Contract{ Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), - FallbackContract: bind.NewBoundContract(*address, *abi, rp.FallbackClient, rp.FallbackClient, rp.FallbackClient), Address: address, ABI: abi, Client: rp.Client, - FallbackClient: rp.FallbackClient, } // Cache contract @@ -319,11 +290,9 @@ func (rp *RocketPool) MakeContract(contractName string, address common.Address) // Create and return return &Contract{ Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), - FallbackContract: bind.NewBoundContract(address, *abi, rp.FallbackClient, rp.FallbackClient, rp.FallbackClient), Address: &address, ABI: abi, Client: rp.Client, - FallbackClient: rp.FallbackClient, }, nil } diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index d80981d8a..52477647d 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -37,7 +37,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index c7263e60d..9ddeb26ae 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -36,7 +36,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index b85d1db13..601a15b4f 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -1,17 +1,17 @@ package trustednode import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -36,7 +36,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 7261ae6ab..366e36115 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -1,17 +1,17 @@ package deposit import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 315ae6c62..308421704 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -1,17 +1,17 @@ package minipool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -35,7 +35,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 714375ce5..2661864dd 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -1,17 +1,17 @@ package network import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -34,7 +34,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 81bfa8ec2..660e823c0 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -1,17 +1,17 @@ package node import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index 70c2b326b..bdda658f5 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -1,17 +1,17 @@ package rewards import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index 624cba3d1..ad4bfa018 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -1,16 +1,16 @@ package rocketpool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) @@ -28,7 +28,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Run tests diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index 424d6a708..47ea2a8dc 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -1,17 +1,17 @@ package protocol import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 07fb293c3..7f7d06d4e 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -34,7 +34,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index aefabc3fc..b721902f6 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -1,17 +1,17 @@ package tokens import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) @@ -35,7 +35,7 @@ func TestMain(m *testing.M) { if err != nil { log.Fatal(err) } // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, nil, common.HexToAddress(tests.RocketStorageAddress)) + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) if err != nil { log.Fatal(err) } // Initialize accounts diff --git a/utils/eth/logs.go b/utils/eth/logs.go index b479a05c0..a79d156ec 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -3,7 +3,6 @@ package eth import ( "context" "math/big" - "strings" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" @@ -57,15 +56,8 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil var err error deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlock, err = rp.RocketStorage.GetUint(nil, deployBlockHash) - if err != nil { - if strings.Contains(err.Error(), "dial tcp") && rp.FallbackClient != nil { - fromBlock, err = rp.FallbackRocketStorage.GetUint(nil, deployBlockHash) - if err != nil { - return nil, err - } - } else { - return nil, err - } + if err != nil { + return nil, err } } From 6ef15cfa7550f6bedd32d8a5cc05a96ba0c3cf31 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Dec 2021 01:49:27 -0500 Subject: [PATCH 429/878] Round 2, created a proxy for ethclient that supports trying multiple endpoints --- rocketpool/contract.go | 4 +- rocketpool/rocketpool.go | 6 +- tests/auction/main_test.go | 7 +- tests/dao/main_test.go | 7 +- tests/dao/trustednode/main_test.go | 21 +- tests/deposit/main_test.go | 21 +- tests/minipool/main_test.go | 21 +- tests/network/main_test.go | 21 +- tests/node/main_test.go | 21 +- tests/rewards/main_test.go | 21 +- tests/rocketpool/main_test.go | 19 +- tests/settings/protocol/main_test.go | 21 +- tests/settings/trustednode/main_test.go | 7 +- tests/tokens/main_test.go | 20 +- tests/utils/eth/transactions_test.go | 5 +- utils/client/proxy.go | 289 ++++++++++++++++++++++++ utils/eth/transactions.go | 3 +- utils/wait.go | 4 +- 18 files changed, 398 insertions(+), 120 deletions(-) create mode 100644 utils/client/proxy.go diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 172e40ea4..976241efc 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/utils/client" ) // Transaction settings @@ -28,7 +28,7 @@ type Contract struct { Contract *bind.BoundContract Address *common.Address ABI *abi.ABI - Client *ethclient.Client + Client *client.EthClientProxy } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 589c1a0b4..35b43c0f4 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/contracts" + "github.com/rocket-pool/rocketpool-go/utils/client" ) // Cache settings @@ -37,7 +37,7 @@ type cachedContract struct { // Rocket Pool contract manager type RocketPool struct { - Client *ethclient.Client + Client *client.EthClientProxy RocketStorage *contracts.RocketStorage RocketStorageContract *Contract addresses map[string]cachedAddress @@ -50,7 +50,7 @@ type RocketPool struct { // Create new contract manager -func NewRocketPool(client *ethclient.Client, rocketStorageAddress common.Address) (*RocketPool, error) { +func NewRocketPool(client *client.EthClientProxy, rocketStorageAddress common.Address) (*RocketPool, error) { // Initialize RocketStorage contract rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 52477647d..81e125503 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -17,7 +17,7 @@ import ( var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -33,8 +33,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 9ddeb26ae..65672c255 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -17,7 +17,7 @@ import ( var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -32,8 +32,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index 601a15b4f..36dbd0a7d 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -1,22 +1,22 @@ package trustednode import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -32,8 +32,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 366e36115..54577e570 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -1,22 +1,22 @@ package deposit import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -29,8 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 308421704..ed9626344 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -1,22 +1,22 @@ package minipool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -31,8 +31,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 2661864dd..3880fc303 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -1,22 +1,22 @@ package network import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -30,8 +30,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index 660e823c0..dd796480d 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -1,22 +1,22 @@ package node import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -29,8 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index bdda658f5..61b46757f 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -1,22 +1,22 @@ package rewards import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -29,8 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index ad4bfa018..249189a74 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -1,21 +1,21 @@ package rocketpool import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ) @@ -24,8 +24,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index 47ea2a8dc..3943e8498 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -1,22 +1,22 @@ package protocol import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -27,8 +27,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 7f7d06d4e..5642883eb 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -16,7 +16,7 @@ import ( var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -30,8 +30,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index b721902f6..889d4c53f 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -1,22 +1,22 @@ package tokens import ( - "log" - "os" - "testing" + "log" + "os" + "testing" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *ethclient.Client + client *uc.EthClientProxy rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client, err = ethclient.Dial(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index fae545602..a76ff1272 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -24,8 +24,7 @@ func TestSendTransaction(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Initialize eth client - client, err := ethclient.Dial(tests.Eth1ProviderAddress) - if err != nil { t.Fatal(err) } + client := uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) // Initialize accounts userAccount, err := accounts.GetAccount(9) diff --git a/utils/client/proxy.go b/utils/client/proxy.go new file mode 100644 index 000000000..3adaa4c6c --- /dev/null +++ b/utils/client/proxy.go @@ -0,0 +1,289 @@ +package client + +import ( + "context" + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" +) + +// This type wraps multiple ETH clients, providing natural fallback support if one of them fails. +type EthClientProxy struct { + clientUrls []string + clients []*ethclient.Client +} + + +// This is a signature for a wrapped ethclient.Client function +type clientFunction func(*ethclient.Client) (interface{}, error) + + +// Creates a new Eth1ClientProxy instance based on the main and backup client URLs +func NewEth1ClientProxy(urls ...string) (*EthClientProxy) { + + // Try connecting to each client, but ignore errors - they'll be handled at runtime + clients := []*ethclient.Client{} + for _, url := range urls { + client, _ := ethclient.Dial(url) + clients = append(clients, client) + } + + return &EthClientProxy{ + clientUrls: urls, + clients: clients, + } + +} + + +/// ======================== +/// ContractCaller Functions +/// ======================== + + +// CodeAt returns the code of the given account. This is needed to differentiate +// between contract internal errors and the local chain being out of sync. +func (p *EthClientProxy) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.CodeAt(ctx, contract, blockNumber) + }) + return result.([]byte), err +} + + +// CallContract executes an Ethereum contract call with the specified data as the +// input. +func (p *EthClientProxy) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.CallContract(ctx, call, blockNumber) + }) + return result.([]byte), err +} + + +/// ============================ +/// ContractTransactor Functions +/// ============================ + + +// HeaderByNumber returns a block header from the current canonical chain. If number is +// nil, the latest known header is returned. +func (p *EthClientProxy) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.HeaderByNumber(ctx, number) + }) + return result.(*types.Header), err +} + + +// PendingCodeAt returns the code of the given account in the pending state. +func (p *EthClientProxy) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.PendingCodeAt(ctx, account) + }) + return result.([]byte), err +} + + +// PendingNonceAt retrieves the current pending nonce associated with an account. +func (p *EthClientProxy) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.PendingNonceAt(ctx, account) + }) + return result.(uint64), err +} + + +// SuggestGasPrice retrieves the currently suggested gas price to allow a timely +// execution of a transaction. +func (p *EthClientProxy) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SuggestGasPrice(ctx) + }) + return result.(*big.Int), err +} + + +// SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow +// a timely execution of a transaction. +func (p *EthClientProxy) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SuggestGasTipCap(ctx) + }) + return result.(*big.Int), err +} + + +// EstimateGas tries to estimate the gas needed to execute a specific +// transaction based on the current pending state of the backend blockchain. +// There is no guarantee that this is the true gas limit requirement as other +// transactions may be added or removed by miners, but it should provide a basis +// for setting a reasonable default. +func (p *EthClientProxy) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.EstimateGas(ctx, call) + }) + return result.(uint64), err +} + + +// SendTransaction injects the transaction into the pending pool for execution. +func (p *EthClientProxy) SendTransaction(ctx context.Context, tx *types.Transaction) error { + _, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return nil, client.SendTransaction(ctx, tx) + }) + return err +} + + +/// ========================== +/// ContractFilterer Functions +/// ========================== + + +// FilterLogs executes a log filter operation, blocking during execution and +// returning all the results in one batch. +// +// TODO(karalabe): Deprecate when the subscription one can return past data too. +func (p *EthClientProxy) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.FilterLogs(ctx, query) + }) + return result.([]types.Log), err +} + + +// SubscribeFilterLogs creates a background log filtering operation, returning +// a subscription immediately, which can be used to stream the found events. +func (p *EthClientProxy) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SubscribeFilterLogs(ctx, query, ch) + }) + return result.(ethereum.Subscription), err +} + + +/// ======================= +/// DeployBackend Functions +/// ======================= + + +// TransactionReceipt returns the receipt of a transaction by transaction hash. +// Note that the receipt is not available for pending transactions. +func (p *EthClientProxy) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.TransactionReceipt(ctx, txHash) + }) + return result.(*types.Receipt), err +} + + +/// ================ +/// Client functions +/// ================ + + +// BlockNumber returns the most recent block number +func (p *EthClientProxy) BlockNumber(ctx context.Context) (uint64, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.BlockNumber(ctx) + }) + return result.(uint64), err +} + + +// BalanceAt returns the wei balance of the given account. +// The block number can be nil, in which case the balance is taken from the latest known block. +func (p *EthClientProxy) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.BalanceAt(ctx, account, blockNumber) + }) + return result.(*big.Int), err +} + + +// TransactionByHash returns the transaction with the given hash. +func (p *EthClientProxy) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + tx, isPending, err := client.TransactionByHash(ctx, hash) + result := []interface{} { tx, isPending } + return result, err + }) + + // TODO: Can we just use the named return values inside the closer to skip this? + resultArray := result.([]interface{}) + tx = resultArray[0].(*types.Transaction) + isPending = resultArray[1].(bool) + return tx, isPending, err +} + + +/// ================== +/// Internal functions +/// ================== + + +// Attempts to run a function progressively through each client until one succeeds or they all fail. +func (p *EthClientProxy) runFunction(function clientFunction) (interface{}, error) { + + // A cumulative error string as each client gets tried + errorString := "" + + for i := 0; i < len(p.clients); i++ { + client, clientErr := p.getClient(i) + if client != nil { + + // This client is available, try running the function + result, err := function(client) + if err != nil { + + // If it's disconnected, log it and try the next client + errorString += fmt.Sprintf("\nError with client %d: %s", i, err.Error()) + if isDisconnected(err) { + p.clients[i] = nil + + // If it's a different error, just return it + } else { + return nil, fmt.Errorf(errorString) + } + + // If there's no error, return the result + } else { + return result, nil + } + + // Note a client failure and try the next one + } else { + errorString += fmt.Sprintf("\nError with client %d: %s", i, clientErr.Error()) + } + } + + // If none of the clients worked, return the aggregated error string + errorString += "\nNone of the clients were available." + return nil, fmt.Errorf(errorString) + +} + + +// Returns true if the error was a connection failure and a backup client is available +func isDisconnected(err error) (bool) { + return strings.Contains(err.Error(), "dial tcp") +} + + +// Get the client at the given index, trying a reconnect if it's disconnected +func (p *EthClientProxy) getClient(index int) (*ethclient.Client, error) { + // Try connecting to the client if it's dead + var err error + if p.clients[index] == nil { + p.clients[index], err = ethclient.Dial(p.clientUrls[index]) + } + // Return the client regardless of its state + return p.clients[index], err +} + diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 1182363d3..8194a9867 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/client" ) // Estimate the gas of SendTransaction @@ -42,7 +43,7 @@ func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Addre // Send a transaction to an address -func SendTransaction(client *ethclient.Client, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SendTransaction(client *client.EthClientProxy, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce diff --git a/utils/wait.go b/utils/wait.go index fd6f0249e..90aa404ff 100644 --- a/utils/wait.go +++ b/utils/wait.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/rocket-pool/rocketpool-go/utils/client" ) // Wait for a transaction to get mined -func WaitForTransaction(client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { +func WaitForTransaction(client *client.EthClientProxy, hash common.Hash) (*types.Receipt, error) { var tx *types.Transaction var err error From 5601c9a15468c3d6f40ca4ccf607b52100e9cd86 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Dec 2021 02:15:43 -0500 Subject: [PATCH 430/878] Added NonceAt and SyncProgress to the proxy --- utils/client/proxy.go | 20 ++++++++++++++++++++ utils/eth/transactions.go | 3 +-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/utils/client/proxy.go b/utils/client/proxy.go index 3adaa4c6c..9bd525da8 100644 --- a/utils/client/proxy.go +++ b/utils/client/proxy.go @@ -223,6 +223,26 @@ func (p *EthClientProxy) TransactionByHash(ctx context.Context, hash common.Hash } +// NonceAt returns the account nonce of the given account. +// The block number can be nil, in which case the nonce is taken from the latest known block. +func (p *EthClientProxy) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.NonceAt(ctx, account, blockNumber) + }) + return result.(uint64), err +} + + +// SyncProgress retrieves the current progress of the sync algorithm. If there's +// no sync currently running, it returns nil. +func (p *EthClientProxy) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SyncProgress(ctx) + }) + return result.(*ethereum.SyncProgress), err +} + + /// ================== /// Internal functions /// ================== diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 8194a9867..4e66e2715 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -8,13 +8,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/client" ) // Estimate the gas of SendTransaction -func EstimateSendTransactionGas(client *ethclient.Client, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSendTransactionGas(client *client.EthClientProxy, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { // User-defined settings response := rocketpool.GasInfo{} From 1b1ad7f179224a9469feec3e328b4091f8533c45 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Dec 2021 20:26:31 -0500 Subject: [PATCH 431/878] Added reconnect delays to the client proxy --- tests/auction/main_test.go | 2 +- tests/dao/main_test.go | 2 +- tests/dao/trustednode/main_test.go | 2 +- tests/deposit/main_test.go | 2 +- tests/minipool/main_test.go | 2 +- tests/network/main_test.go | 2 +- tests/node/main_test.go | 2 +- tests/rewards/main_test.go | 2 +- tests/rocketpool/main_test.go | 2 +- tests/settings/protocol/main_test.go | 2 +- tests/settings/trustednode/main_test.go | 2 +- tests/tokens/main_test.go | 2 +- tests/utils/eth/transactions_test.go | 2 +- utils/client/proxy.go | 39 ++++++++++++++++++++++--- 14 files changed, 48 insertions(+), 17 deletions(-) diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index 81e125503..a9874e599 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -33,7 +33,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 65672c255..853cb1fde 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -32,7 +32,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index 36dbd0a7d..1bd59f3b1 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -32,7 +32,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index 54577e570..ef3f3bb6c 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -29,7 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index ed9626344..61e853e3c 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 3880fc303..3cf32edc0 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -30,7 +30,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index dd796480d..c2f003db3 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -29,7 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index 61b46757f..c5db5bddb 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -29,7 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index 249189a74..18bdbed4d 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -24,7 +24,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index 3943e8498..57b83707a 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -27,7 +27,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 5642883eb..d722227dc 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -30,7 +30,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 889d4c53f..5bb80fafa 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } // Initialize contract manager diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index a76ff1272..e4e01d7d6 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -24,7 +24,7 @@ func TestSendTransaction(t *testing.T) { t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) // Initialize eth client - client := uc.NewEth1ClientProxy(tests.Eth1ProviderAddress) + client := uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) // Initialize accounts userAccount, err := accounts.GetAccount(9) diff --git a/utils/client/proxy.go b/utils/client/proxy.go index 9bd525da8..7194d54f9 100644 --- a/utils/client/proxy.go +++ b/utils/client/proxy.go @@ -5,6 +5,7 @@ import ( "fmt" "math/big" "strings" + "time" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" @@ -16,6 +17,8 @@ import ( type EthClientProxy struct { clientUrls []string clients []*ethclient.Client + timeouts []time.Time + reconnectDelay time.Duration } @@ -24,18 +27,32 @@ type clientFunction func(*ethclient.Client) (interface{}, error) // Creates a new Eth1ClientProxy instance based on the main and backup client URLs -func NewEth1ClientProxy(urls ...string) (*EthClientProxy) { +func NewEth1ClientProxy(reconnectDelay time.Duration, urls ...string) (*EthClientProxy) { - // Try connecting to each client, but ignore errors - they'll be handled at runtime clients := []*ethclient.Client{} + timeouts := []time.Time{} + + // Clamp the delay + if reconnectDelay < 0 { + reconnectDelay = 0 + } + + // Try connecting to each client, but ignore errors - they'll be handled at runtime for _, url := range urls { - client, _ := ethclient.Dial(url) + client, err := ethclient.Dial(url) + if err != nil { + timeouts = append(timeouts, time.Now()) + } else { + timeouts = append(timeouts, time.Time{}) + } clients = append(clients, client) } return &EthClientProxy{ clientUrls: urls, clients: clients, + timeouts: timeouts, + reconnectDelay: reconnectDelay, } } @@ -266,6 +283,7 @@ func (p *EthClientProxy) runFunction(function clientFunction) (interface{}, erro errorString += fmt.Sprintf("\nError with client %d: %s", i, err.Error()) if isDisconnected(err) { p.clients[i] = nil + p.timeouts[i] = time.Now() // If it's a different error, just return it } else { @@ -301,8 +319,21 @@ func (p *EthClientProxy) getClient(index int) (*ethclient.Client, error) { // Try connecting to the client if it's dead var err error if p.clients[index] == nil { - p.clients[index], err = ethclient.Dial(p.clientUrls[index]) + + // Check if enough time has passed + if time.Since(p.timeouts[index]) > p.reconnectDelay { + p.clients[index], err = ethclient.Dial(p.clientUrls[index]) + + // If the connection failed, reset the timer + if err != nil { + p.timeouts[index] = time.Now() + } + + } else { + err = fmt.Errorf("Connection failure, waiting %s to reconnect", p.reconnectDelay) + } } + // Return the client regardless of its state return p.clients[index], err } From 47613d067e734d5af8aea0da2b78e2236a01f9e6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 18 Dec 2021 22:00:55 -0500 Subject: [PATCH 432/878] Added better error handling to the client proxy, so it doesn't try to cast things that are nil --- utils/client/proxy.go | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/utils/client/proxy.go b/utils/client/proxy.go index 7194d54f9..1fdb28a72 100644 --- a/utils/client/proxy.go +++ b/utils/client/proxy.go @@ -69,6 +69,9 @@ func (p *EthClientProxy) CodeAt(ctx context.Context, contract common.Address, bl result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.CodeAt(ctx, contract, blockNumber) }) + if err != nil { + return nil, err + } return result.([]byte), err } @@ -79,6 +82,9 @@ func (p *EthClientProxy) CallContract(ctx context.Context, call ethereum.CallMsg result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.CallContract(ctx, call, blockNumber) }) + if err != nil { + return nil, err + } return result.([]byte), err } @@ -94,6 +100,9 @@ func (p *EthClientProxy) HeaderByNumber(ctx context.Context, number *big.Int) (* result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.HeaderByNumber(ctx, number) }) + if err != nil { + return nil, err + } return result.(*types.Header), err } @@ -103,6 +112,9 @@ func (p *EthClientProxy) PendingCodeAt(ctx context.Context, account common.Addre result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.PendingCodeAt(ctx, account) }) + if err != nil { + return nil, err + } return result.([]byte), err } @@ -112,6 +124,9 @@ func (p *EthClientProxy) PendingNonceAt(ctx context.Context, account common.Addr result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.PendingNonceAt(ctx, account) }) + if err != nil { + return 0, err + } return result.(uint64), err } @@ -122,6 +137,9 @@ func (p *EthClientProxy) SuggestGasPrice(ctx context.Context) (*big.Int, error) result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.SuggestGasPrice(ctx) }) + if err != nil { + return nil, err + } return result.(*big.Int), err } @@ -132,6 +150,9 @@ func (p *EthClientProxy) SuggestGasTipCap(ctx context.Context) (*big.Int, error) result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.SuggestGasTipCap(ctx) }) + if err != nil { + return nil, err + } return result.(*big.Int), err } @@ -145,6 +166,9 @@ func (p *EthClientProxy) EstimateGas(ctx context.Context, call ethereum.CallMsg) result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.EstimateGas(ctx, call) }) + if err != nil { + return 0, err + } return result.(uint64), err } @@ -171,6 +195,9 @@ func (p *EthClientProxy) FilterLogs(ctx context.Context, query ethereum.FilterQu result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.FilterLogs(ctx, query) }) + if err != nil { + return nil, err + } return result.([]types.Log), err } @@ -181,6 +208,9 @@ func (p *EthClientProxy) SubscribeFilterLogs(ctx context.Context, query ethereum result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.SubscribeFilterLogs(ctx, query, ch) }) + if err != nil { + return nil, err + } return result.(ethereum.Subscription), err } @@ -196,6 +226,9 @@ func (p *EthClientProxy) TransactionReceipt(ctx context.Context, txHash common.H result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.TransactionReceipt(ctx, txHash) }) + if err != nil { + return nil, err + } return result.(*types.Receipt), err } @@ -210,6 +243,9 @@ func (p *EthClientProxy) BlockNumber(ctx context.Context) (uint64, error) { result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.BlockNumber(ctx) }) + if err != nil { + return 0, err + } return result.(uint64), err } @@ -220,6 +256,9 @@ func (p *EthClientProxy) BalanceAt(ctx context.Context, account common.Address, result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.BalanceAt(ctx, account, blockNumber) }) + if err != nil { + return nil, err + } return result.(*big.Int), err } @@ -231,6 +270,9 @@ func (p *EthClientProxy) TransactionByHash(ctx context.Context, hash common.Hash result := []interface{} { tx, isPending } return result, err }) + if err != nil { + return nil, false, err + } // TODO: Can we just use the named return values inside the closer to skip this? resultArray := result.([]interface{}) @@ -246,6 +288,9 @@ func (p *EthClientProxy) NonceAt(ctx context.Context, account common.Address, bl result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.NonceAt(ctx, account, blockNumber) }) + if err != nil { + return 0, err + } return result.(uint64), err } @@ -256,6 +301,9 @@ func (p *EthClientProxy) SyncProgress(ctx context.Context) (*ethereum.SyncProgre result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { return client.SyncProgress(ctx) }) + if err != nil { + return nil, err + } return result.(*ethereum.SyncProgress), err } From 0cec01318f920fed644e975055163b3008155e61 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 28 Dec 2021 22:27:50 -0500 Subject: [PATCH 433/878] Updated to geth v1.10.14 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3558089aa..6ab43ede1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.13 + github.com/ethereum/go-ethereum v1.10.14 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index fa8a94213..c55422af8 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.13 h1:DEYFP9zk+Gruf3ae1JOJVhNmxK28ee+sMELPLgYTXpA= -github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.14 h1:EJ/ucQzFlgKgwblIwU8R6ABnZ9kgUnIG2+Q1tiSrt4M= +github.com/ethereum/go-ethereum v1.10.14/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From 0f7b2e4dbd57c42c0dd0d53c63de6a376032197a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 4 Jan 2022 22:56:01 -0500 Subject: [PATCH 434/878] GetMinipoolCountsPerStatus() is now batched to prevent Geth timeouts --- minipool/minipool.go | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 962467824..dcdbb82ac 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -330,16 +330,47 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin // Get the minipool count by status -func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, offset, limit uint64, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { +func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) if err != nil { return MinipoolCountsPerStatus{}, err } - minipoolCounts := new(MinipoolCountsPerStatus) - if err := rocketMinipoolManager.Call(opts, minipoolCounts, "getMinipoolCountPerStatus", big.NewInt(int64(offset)), big.NewInt(int64(limit))); err != nil { - return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + + totalMinipools := int64(totalMinipoolsUint) + minipoolCounts := MinipoolCountsPerStatus{} + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of addresses + offset := big.NewInt(i) + newMinipoolCounts := new(MinipoolCountsPerStatus) + if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { + return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + } + if newMinipoolCounts != nil { + if newMinipoolCounts.Initialized != nil { + minipoolCounts.Initialized.Add(minipoolCounts.Initialized, newMinipoolCounts.Initialized) + } + if newMinipoolCounts.Prelaunch != nil { + minipoolCounts.Prelaunch.Add(minipoolCounts.Prelaunch, newMinipoolCounts.Prelaunch) + } + if newMinipoolCounts.Staking != nil { + minipoolCounts.Staking.Add(minipoolCounts.Staking, newMinipoolCounts.Staking) + } + if newMinipoolCounts.Dissolved != nil { + minipoolCounts.Dissolved.Add(minipoolCounts.Dissolved, newMinipoolCounts.Dissolved) + } + if newMinipoolCounts.Withdrawable != nil { + minipoolCounts.Withdrawable.Add(minipoolCounts.Withdrawable, newMinipoolCounts.Withdrawable) + } + } } - return *minipoolCounts, nil + return minipoolCounts, nil } From 6f14857bdd0a1022d319b5e95ab4428fc150b774 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 5 Jan 2022 20:59:21 -0500 Subject: [PATCH 435/878] Fixed minipool count initialization --- minipool/minipool.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index dcdbb82ac..872582302 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -343,10 +343,16 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } totalMinipools := int64(totalMinipoolsUint) - minipoolCounts := MinipoolCountsPerStatus{} + minipoolCounts := MinipoolCountsPerStatus{ + Initialized: big.NewInt(0), + Prelaunch: big.NewInt(0), + Staking: big.NewInt(0), + Dissolved: big.NewInt(0), + Withdrawable: big.NewInt(0), + } limit := big.NewInt(MinipoolPrelaunchBatchSize) for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { - // Get a batch of addresses + // Get a batch of counts offset := big.NewInt(i) newMinipoolCounts := new(MinipoolCountsPerStatus) if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { From 5e206622d7c3864375a2a6bb3b7736ae537d7dd4 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 5 Jan 2022 22:02:12 -0500 Subject: [PATCH 436/878] Updated to Geth v1.10.15 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6ab43ede1..42e4312f7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.14 + github.com/ethereum/go-ethereum v1.10.15 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index c55422af8..80d749891 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.14 h1:EJ/ucQzFlgKgwblIwU8R6ABnZ9kgUnIG2+Q1tiSrt4M= -github.com/ethereum/go-ethereum v1.10.14/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.15 h1:E9o0kMbD8HXhp7g6UwIwntY05WTDheCGziMhegcBsQw= +github.com/ethereum/go-ethereum v1.10.15/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From 07b59fcd52bc13723b58a3b640f28a722a758a2c Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 6 Jan 2022 13:13:58 +1000 Subject: [PATCH 437/878] Add mutex lock around threaded map access --- minipool/minipool.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 872582302..debf7d386 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -215,6 +215,7 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com } // Load pubkeys in batches + var lock = sync.RWMutex{} pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { @@ -236,7 +237,9 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com if err != nil { return err } + lock.Lock() pubkeys[mi] = pubkey + lock.Unlock() return nil }) } From 91602780d8dc50bf861537386db028b44ba72b56 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Thu, 6 Jan 2022 13:27:32 +1000 Subject: [PATCH 438/878] Add missing contract method getClaimingContractTotalClaimed method on rocketRewardsPool --- rewards/node.go | 7 ++++++- rewards/rewards.go | 14 ++++++++++++++ rewards/trusted-node.go | 7 +++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/rewards/node.go b/rewards/node.go index af9b9502a..6f7d2c244 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -51,7 +51,6 @@ func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common. return getClaimRewardsAmount(rocketClaimNode, "node", claimerAddress, opts) } - // Estimate the gas of ClaimNodeRewards func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketClaimNode, err := getRocketClaimNode(rp) @@ -115,6 +114,12 @@ func GetNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Ad return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts) } + +// Get the total rewards claimed for this claiming contract this interval +func GetNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + return getClaimingContractTotalClaimed(rp, "rocketClaimNode", opts) +} + // Get contracts var rocketClaimNodeLock sync.Mutex func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { diff --git a/rewards/rewards.go b/rewards/rewards.go index 8e4c4bbb2..38c9455cb 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -69,6 +69,20 @@ func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsCont } +// Get the total amount claimed in the current interval by the given claiming contract +func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + totalClaimed := new(*big.Int) + if err := rocketRewardsPool.Call(opts, totalClaimed, "getClaimingContractTotalClaimed", claimsContract); err != nil { + return nil, fmt.Errorf("Could not get total claimed for %s: %w", claimsContract, err) + } + return *totalClaimed, nil +} + + // Estimate the gas of claim func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return claimsContract.GetTransactionGasInfo(opts, "claim") diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index 4e589a7b1..bf9b94b51 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -116,6 +116,13 @@ func GetTrustedNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress co return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts) } + +// Get the total rewards claimed for this claiming contract this interval +func GetTrustedNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + return getClaimingContractTotalClaimed(rp, "rocketClaimTrustedNode", opts) +} + + // Get contracts var rocketClaimTrustedNodeLock sync.Mutex func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { From 0650afc655d1556bc29ad53246c8b1df0441c950 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 10 Mar 2022 02:40:17 -0500 Subject: [PATCH 439/878] Updated to geth v1.10.16, reduced the minipool prelaunch batch to 250 --- go.mod | 2 +- go.sum | 7 +++++++ minipool/minipool.go | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 42e4312f7..c2b1e278f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.15 + github.com/ethereum/go-ethereum v1.10.16 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index 80d749891..ac980060f 100644 --- a/go.sum +++ b/go.sum @@ -130,6 +130,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= @@ -155,6 +157,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.10.15 h1:E9o0kMbD8HXhp7g6UwIwntY05WTDheCGziMhegcBsQw= github.com/ethereum/go-ethereum v1.10.15/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= +github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -266,6 +270,7 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -318,6 +323,7 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= @@ -338,6 +344,7 @@ github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= diff --git a/minipool/minipool.go b/minipool/minipool.go index debf7d386..084ecf2ed 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -15,7 +15,7 @@ import ( // Settings const ( - MinipoolPrelaunchBatchSize = 750 + MinipoolPrelaunchBatchSize = 250 MinipoolAddressBatchSize = 50 MinipoolDetailsBatchSize = 20 ) From c2e404d95175a2664acb20821b27746ef739b92c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 10 Mar 2022 02:48:37 -0500 Subject: [PATCH 440/878] Formatted the source tree --- auction/auction.go | 949 +++++++------- dao/proposal-payload.go | 101 +- dao/proposals.go | 1082 ++++++++-------- dao/protocol/dao.go | 128 +- dao/trustednode/actions.go | 128 +- dao/trustednode/dao.go | 688 +++++----- dao/trustednode/proposals.go | 426 +++--- deposit/deposit.go | 106 +- docs/docgen.go | 136 +- minipool/minipool-contract.go | 813 ++++++------ minipool/minipool.go | 833 ++++++------ minipool/queue.go | 286 ++-- minipool/status.go | 38 +- network/balances.go | 152 ++- network/fees.go | 78 +- network/prices.go | 114 +- node/deposit.go | 59 +- node/node.go | 1182 +++++++++-------- node/staking.go | 239 ++-- rewards/node.go | 142 +- rewards/rewards.go | 151 +-- rewards/trusted-node.go | 149 +-- rocketpool/abi.go | 91 +- rocketpool/contract.go | 269 ++-- rocketpool/rocketpool.go | 489 ++++--- settings/protocol/auction.go | 156 ++- settings/protocol/deposit.go | 114 +- settings/protocol/inflation.go | 51 +- settings/protocol/minipool.go | 182 ++- settings/protocol/network.go | 219 ++-- settings/protocol/node.go | 93 +- settings/protocol/rewards.go | 87 +- settings/trustednode/members.go | 201 ++- settings/trustednode/minipool.go | 65 +- settings/trustednode/proposals.go | 146 +-- storage/rocket-storage.go | 49 +- tests/auction/auction_test.go | 539 ++++---- tests/auction/main_test.go | 91 +- tests/config.go | 38 +- tests/dao/main_test.go | 83 +- tests/dao/proposals_test.go | 344 ++--- tests/dao/trustednode/dao_test.go | 281 ++-- tests/dao/trustednode/main_test.go | 85 +- tests/dao/trustednode/proposals_test.go | 479 ++++--- tests/deposit/deposit_test.go | 147 ++- tests/deposit/main_test.go | 59 +- tests/minipool/contract_test.go | 1222 ++++++++++-------- tests/minipool/main_test.go | 77 +- tests/minipool/minipool_test.go | 210 +-- tests/minipool/queue_test.go | 379 +++--- tests/minipool/status_test.go | 78 +- tests/network/balances_test.go | 106 +- tests/network/fees_test.go | 146 ++- tests/network/main_test.go | 67 +- tests/network/prices_test.go | 66 +- tests/node/deposit_test.go | 76 +- tests/node/main_test.go | 59 +- tests/node/node_test.go | 253 ++-- tests/node/staking_test.go | 427 +++--- tests/rewards/main_test.go | 59 +- tests/rewards/node_test.go | 250 ++-- tests/rewards/trusted_node_test.go | 206 +-- tests/rocketpool/main_test.go | 25 +- tests/rocketpool/rocketpool_test.go | 228 ++-- tests/settings/protocol/auction_test.go | 148 +-- tests/settings/protocol/deposit_test.go | 112 +- tests/settings/protocol/inflation_test.go | 58 +- tests/settings/protocol/main_test.go | 35 +- tests/settings/protocol/minipool_test.go | 128 +- tests/settings/protocol/network_test.go | 222 ++-- tests/settings/protocol/node_test.go | 100 +- tests/settings/protocol/rewards_test.go | 78 +- tests/settings/trustednode/main_test.go | 67 +- tests/settings/trustednode/members_test.go | 259 ++-- tests/settings/trustednode/proposals_test.go | 275 ++-- tests/testutils/accounts/accounts.go | 54 +- tests/testutils/auction/auction.go | 75 +- tests/testutils/dao/proposals.go | 70 +- tests/testutils/evm/mining.go | 50 +- tests/testutils/evm/snapshots.go | 42 +- tests/testutils/minipool/minipool.go | 142 +- tests/testutils/node/deposit.go | 82 +- tests/testutils/node/node.go | 86 +- tests/testutils/node/staking.go | 44 +- tests/testutils/tokens/reth/reth.go | 30 +- tests/testutils/tokens/rpl/rpl.go | 59 +- tests/testutils/validator/deposit-data.go | 61 +- tests/tokens/main_test.go | 81 +- tests/tokens/reth_test.go | 367 +++--- tests/tokens/rpl_fixed_test.go | 190 +-- tests/tokens/rpl_test.go | 328 +++-- tests/tokens/tokens_test.go | 94 +- tests/utils/eth/transactions_test.go | 74 +- tests/utils/eth/units_test.go | 50 +- tests/utils/stage4_bootstrap.go | 27 +- tokens/reth.go | 245 ++-- tokens/rpl-fixed.go | 108 +- tokens/rpl.go | 188 ++- tokens/tokens.go | 186 ++- types/beacon.go | 103 +- types/dao.go | 64 +- types/minipool.go | 113 +- utils/address_generation.go | 78 +- utils/client/proxy.go | 455 +++---- utils/deposit_retrieval.go | 176 ++- utils/eth/logs.go | 13 +- utils/eth/transactions.go | 164 ++- utils/eth/units.go | 66 +- utils/strings/sanitize.go | 18 +- utils/wait.go | 71 +- 110 files changed, 11195 insertions(+), 10613 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index d3daea283..c5c855eda 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -15,605 +15,592 @@ import ( // Settings const LotDetailsBatchSize = 10 - // Lot details type LotDetails struct { - Index uint64 `json:"index"` - Exists bool `json:"exists"` - StartBlock uint64 `json:"startBlock"` - EndBlock uint64 `json:"endBlock"` - StartPrice *big.Int `json:"startPrice"` - ReservePrice *big.Int `json:"reservePrice"` - PriceAtCurrentBlock *big.Int `json:"priceAtCurrentBlock"` - PriceByTotalBids *big.Int `json:"priceByTotalBids"` - CurrentPrice *big.Int `json:"currentPrice"` - TotalRPLAmount *big.Int `json:"totalRplAmount"` - ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` - RemainingRPLAmount *big.Int `json:"remainingRplAmount"` - TotalBidAmount *big.Int `json:"totalBidAmount"` - AddressBidAmount *big.Int `json:"addressBidAmount"` - Cleared bool `json:"cleared"` - RPLRecovered bool `json:"rplRecovered"` + Index uint64 `json:"index"` + Exists bool `json:"exists"` + StartBlock uint64 `json:"startBlock"` + EndBlock uint64 `json:"endBlock"` + StartPrice *big.Int `json:"startPrice"` + ReservePrice *big.Int `json:"reservePrice"` + PriceAtCurrentBlock *big.Int `json:"priceAtCurrentBlock"` + PriceByTotalBids *big.Int `json:"priceByTotalBids"` + CurrentPrice *big.Int `json:"currentPrice"` + TotalRPLAmount *big.Int `json:"totalRplAmount"` + ClaimedRPLAmount *big.Int `json:"claimedRplAmount"` + RemainingRPLAmount *big.Int `json:"remainingRplAmount"` + TotalBidAmount *big.Int `json:"totalBidAmount"` + AddressBidAmount *big.Int `json:"addressBidAmount"` + Cleared bool `json:"cleared"` + RPLRecovered bool `json:"rplRecovered"` } - // Get all lot details func GetLots(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]LotDetails, error) { - // Get lot count - lotCount, err := GetLotCount(rp, opts) - if err != nil { - return []LotDetails{}, err - } - - // Load lot details in batches - details := make([]LotDetails, lotCount) - for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { - - // Get batch start & end index - lsi := bsi - lei := bsi + LotDetailsBatchSize - if lei > lotCount { lei = lotCount } - - // Load details - var wg errgroup.Group - for li := lsi; li < lei; li++ { - li := li - wg.Go(func() error { - lotDetails, err := GetLotDetails(rp, li, opts) - if err == nil { details[li] = lotDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []LotDetails{}, err - } - - } - - // Return - return details, nil + // Get lot count + lotCount, err := GetLotCount(rp, opts) + if err != nil { + return []LotDetails{}, err + } + + // Load lot details in batches + details := make([]LotDetails, lotCount) + for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { + + // Get batch start & end index + lsi := bsi + lei := bsi + LotDetailsBatchSize + if lei > lotCount { + lei = lotCount + } + + // Load details + var wg errgroup.Group + for li := lsi; li < lei; li++ { + li := li + wg.Go(func() error { + lotDetails, err := GetLotDetails(rp, li, opts) + if err == nil { + details[li] = lotDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []LotDetails{}, err + } + + } + + // Return + return details, nil } - // Get all lot details with bids from an address func GetLotsWithBids(rp *rocketpool.RocketPool, bidder common.Address, opts *bind.CallOpts) ([]LotDetails, error) { - // Get lot count - lotCount, err := GetLotCount(rp, opts) - if err != nil { - return []LotDetails{}, err - } - - // Load lot details in batches - details := make([]LotDetails, lotCount) - for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { - - // Get batch start & end index - lsi := bsi - lei := bsi + LotDetailsBatchSize - if lei > lotCount { lei = lotCount } - - // Load details - var wg errgroup.Group - for li := lsi; li < lei; li++ { - li := li - wg.Go(func() error { - lotDetails, err := GetLotDetailsWithBids(rp, li, bidder, opts) - if err == nil { details[li] = lotDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []LotDetails{}, err - } - - } - - // Return - return details, nil + // Get lot count + lotCount, err := GetLotCount(rp, opts) + if err != nil { + return []LotDetails{}, err + } + + // Load lot details in batches + details := make([]LotDetails, lotCount) + for bsi := uint64(0); bsi < lotCount; bsi += LotDetailsBatchSize { + + // Get batch start & end index + lsi := bsi + lei := bsi + LotDetailsBatchSize + if lei > lotCount { + lei = lotCount + } + + // Load details + var wg errgroup.Group + for li := lsi; li < lei; li++ { + li := li + wg.Go(func() error { + lotDetails, err := GetLotDetailsWithBids(rp, li, bidder, opts) + if err == nil { + details[li] = lotDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []LotDetails{}, err + } + + } + + // Return + return details, nil } - // Get a lot's details func GetLotDetails(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (LotDetails, error) { - // Data - var wg errgroup.Group - var exists bool - var startBlock uint64 - var endBlock uint64 - var startPrice *big.Int - var reservePrice *big.Int - var priceAtCurrentBlock *big.Int - var priceByTotalBids *big.Int - var currentPrice *big.Int - var totalRplAmount *big.Int - var claimedRplAmount *big.Int - var remainingRplAmount *big.Int - var totalBidAmount *big.Int - var cleared bool - var rplRecovered bool - - // Load data - wg.Go(func() error { - var err error - exists, err = GetLotExists(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - startBlock, err = GetLotStartBlock(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - endBlock, err = GetLotEndBlock(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - startPrice, err = GetLotStartPrice(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - reservePrice, err = GetLotReservePrice(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - priceAtCurrentBlock, err = GetLotPriceAtCurrentBlock(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - priceByTotalBids, err = GetLotPriceByTotalBids(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - currentPrice, err = GetLotCurrentPrice(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - totalRplAmount, err = GetLotTotalRPLAmount(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - claimedRplAmount, err = GetLotClaimedRPLAmount(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - remainingRplAmount, err = GetLotRemainingRPLAmount(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - totalBidAmount, err = GetLotTotalBidAmount(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - cleared, err = GetLotIsCleared(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - rplRecovered, err = GetLotRPLRecovered(rp, lotIndex, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return LotDetails{}, err - } - - // Return - return LotDetails{ - Index: lotIndex, - Exists: exists, - StartBlock: startBlock, - EndBlock: endBlock, - StartPrice: startPrice, - ReservePrice: reservePrice, - PriceAtCurrentBlock: priceAtCurrentBlock, - PriceByTotalBids: priceByTotalBids, - CurrentPrice: currentPrice, - TotalRPLAmount: totalRplAmount, - ClaimedRPLAmount: claimedRplAmount, - RemainingRPLAmount: remainingRplAmount, - TotalBidAmount: totalBidAmount, - Cleared: cleared, - RPLRecovered: rplRecovered, - }, nil + // Data + var wg errgroup.Group + var exists bool + var startBlock uint64 + var endBlock uint64 + var startPrice *big.Int + var reservePrice *big.Int + var priceAtCurrentBlock *big.Int + var priceByTotalBids *big.Int + var currentPrice *big.Int + var totalRplAmount *big.Int + var claimedRplAmount *big.Int + var remainingRplAmount *big.Int + var totalBidAmount *big.Int + var cleared bool + var rplRecovered bool + + // Load data + wg.Go(func() error { + var err error + exists, err = GetLotExists(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + startBlock, err = GetLotStartBlock(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + endBlock, err = GetLotEndBlock(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + startPrice, err = GetLotStartPrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + reservePrice, err = GetLotReservePrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + priceAtCurrentBlock, err = GetLotPriceAtCurrentBlock(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + priceByTotalBids, err = GetLotPriceByTotalBids(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + currentPrice, err = GetLotCurrentPrice(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + totalRplAmount, err = GetLotTotalRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + claimedRplAmount, err = GetLotClaimedRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + remainingRplAmount, err = GetLotRemainingRPLAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + totalBidAmount, err = GetLotTotalBidAmount(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + cleared, err = GetLotIsCleared(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + rplRecovered, err = GetLotRPLRecovered(rp, lotIndex, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return LotDetails{}, err + } + + // Return + return LotDetails{ + Index: lotIndex, + Exists: exists, + StartBlock: startBlock, + EndBlock: endBlock, + StartPrice: startPrice, + ReservePrice: reservePrice, + PriceAtCurrentBlock: priceAtCurrentBlock, + PriceByTotalBids: priceByTotalBids, + CurrentPrice: currentPrice, + TotalRPLAmount: totalRplAmount, + ClaimedRPLAmount: claimedRplAmount, + RemainingRPLAmount: remainingRplAmount, + TotalBidAmount: totalBidAmount, + Cleared: cleared, + RPLRecovered: rplRecovered, + }, nil } - // Get a lot's details with address bid amounts func GetLotDetailsWithBids(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (LotDetails, error) { - // Data - var wg errgroup.Group - var details LotDetails - var addressBidAmount *big.Int + // Data + var wg errgroup.Group + var details LotDetails + var addressBidAmount *big.Int - // Load data - wg.Go(func() error { - var err error - details, err = GetLotDetails(rp, lotIndex, opts) - return err - }) - wg.Go(func() error { - var err error - addressBidAmount, err = GetLotAddressBidAmount(rp, lotIndex, bidder, opts) - return err - }) + // Load data + wg.Go(func() error { + var err error + details, err = GetLotDetails(rp, lotIndex, opts) + return err + }) + wg.Go(func() error { + var err error + addressBidAmount, err = GetLotAddressBidAmount(rp, lotIndex, bidder, opts) + return err + }) - // Wait for data - if err := wg.Wait(); err != nil { - return LotDetails{}, err - } + // Wait for data + if err := wg.Wait(); err != nil { + return LotDetails{}, err + } - // Return - details.AddressBidAmount = addressBidAmount - return details, nil + // Return + details.AddressBidAmount = addressBidAmount + return details, nil } - // Get the total RPL balance of the auction contract func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - totalRplBalance := new(*big.Int) - if err := rocketAuctionManager.Call(opts, totalRplBalance, "getTotalRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract total RPL balance: %w", err) - } - return *totalRplBalance, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + totalRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, totalRplBalance, "getTotalRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract total RPL balance: %w", err) + } + return *totalRplBalance, nil } - // Get the allotted RPL balance of the auction contract func GetAllottedRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - allottedRplBalance := new(*big.Int) - if err := rocketAuctionManager.Call(opts, allottedRplBalance, "getAllottedRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract allotted RPL balance: %w", err) - } - return *allottedRplBalance, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + allottedRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, allottedRplBalance, "getAllottedRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract allotted RPL balance: %w", err) + } + return *allottedRplBalance, nil } - // Get the remaining RPL balance of the auction contract func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - remainingRplBalance := new(*big.Int) - if err := rocketAuctionManager.Call(opts, remainingRplBalance, "getRemainingRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract remaining RPL balance: %w", err) - } - return *remainingRplBalance, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + remainingRplBalance := new(*big.Int) + if err := rocketAuctionManager.Call(opts, remainingRplBalance, "getRemainingRPLBalance"); err != nil { + return nil, fmt.Errorf("Could not get auction contract remaining RPL balance: %w", err) + } + return *remainingRplBalance, nil } - // Get the number of lots for auction func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return 0, err - } - lotCount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotCount, "getLotCount"); err != nil { - return 0, fmt.Errorf("Could not get lot count: %w", err) - } - return (*lotCount).Uint64(), nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotCount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotCount, "getLotCount"); err != nil { + return 0, fmt.Errorf("Could not get lot count: %w", err) + } + return (*lotCount).Uint64(), nil } - // Lot details func GetLotExists(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return false, err - } - lotExists := new(bool) - if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d exists status: %w", lotIndex, err) - } - return *lotExists, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotExists := new(bool) + if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d exists status: %w", lotIndex, err) + } + return *lotExists, nil } func GetLotStartBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return 0, err - } - lotStartBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock", big.NewInt(int64(lotIndex))); err != nil { - return 0, fmt.Errorf("Could not get lot %d start block: %w", lotIndex, err) - } - return (*lotStartBlock).Uint64(), nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotStartBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock", big.NewInt(int64(lotIndex))); err != nil { + return 0, fmt.Errorf("Could not get lot %d start block: %w", lotIndex, err) + } + return (*lotStartBlock).Uint64(), nil } func GetLotEndBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return 0, err - } - lotEndBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock", big.NewInt(int64(lotIndex))); err != nil { - return 0, fmt.Errorf("Could not get lot %d end block: %w", lotIndex, err) - } - return (*lotEndBlock).Uint64(), nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, err + } + lotEndBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock", big.NewInt(int64(lotIndex))); err != nil { + return 0, fmt.Errorf("Could not get lot %d end block: %w", lotIndex, err) + } + return (*lotEndBlock).Uint64(), nil } func GetLotStartPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotStartPrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d start price: %w", lotIndex, err) - } - return *lotStartPrice, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotStartPrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d start price: %w", lotIndex, err) + } + return *lotStartPrice, nil } func GetLotReservePrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotReservePrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d reserve price: %w", lotIndex, err) - } - return *lotReservePrice, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotReservePrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d reserve price: %w", lotIndex, err) + } + return *lotReservePrice, nil } func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotTotalRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d total RPL amount: %w", lotIndex, err) - } - return *lotTotalRplAmount, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotTotalRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d total RPL amount: %w", lotIndex, err) + } + return *lotTotalRplAmount, nil } func GetLotTotalBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotTotalBidAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d total ETH bid amount: %w", lotIndex, err) - } - return *lotTotalBidAmount, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotTotalBidAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d total ETH bid amount: %w", lotIndex, err) + } + return *lotTotalBidAmount, nil } func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return false, err - } - lotRplRecovered := new(bool) - if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d RPL recovered status: %w", lotIndex, err) - } - return *lotRplRecovered, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotRplRecovered := new(bool) + if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d RPL recovered status: %w", lotIndex, err) + } + return *lotRplRecovered, nil } func GetLotPriceAtCurrentBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotPriceAtCurrentBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceAtCurrentBlock, "getLotPriceAtCurrentBlock", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price by current block: %w", lotIndex, err) - } - return *lotPriceAtCurrentBlock, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceAtCurrentBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceAtCurrentBlock, "getLotPriceAtCurrentBlock", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price by current block: %w", lotIndex, err) + } + return *lotPriceAtCurrentBlock, nil } func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotPriceByTotalBids := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price by total bids: %w", lotIndex, err) - } - return *lotPriceByTotalBids, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceByTotalBids := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price by total bids: %w", lotIndex, err) + } + return *lotPriceByTotalBids, nil } func GetLotCurrentPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotCurrentPrice := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d current price: %w", lotIndex, err) - } - return *lotCurrentPrice, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotCurrentPrice := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d current price: %w", lotIndex, err) + } + return *lotCurrentPrice, nil } func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotClaimedRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d claimed RPL amount: %w", lotIndex, err) - } - return *lotClaimedRplAmount, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotClaimedRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d claimed RPL amount: %w", lotIndex, err) + } + return *lotClaimedRplAmount, nil } func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotRemainingRplAmount := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d remaining RPL amount: %w", lotIndex, err) - } - return *lotRemainingRplAmount, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotRemainingRplAmount := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount", big.NewInt(int64(lotIndex))); err != nil { + return nil, fmt.Errorf("Could not get lot %d remaining RPL amount: %w", lotIndex, err) + } + return *lotRemainingRplAmount, nil } func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return false, err - } - lotIsCleared := new(bool) - if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d cleared status: %w", lotIndex, err) - } - return *lotIsCleared, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return false, err + } + lotIsCleared := new(bool) + if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared", big.NewInt(int64(lotIndex))); err != nil { + return false, fmt.Errorf("Could not get lot %d cleared status: %w", lotIndex, err) + } + return *lotIsCleared, nil } - // Get the price of a lot at a specific block func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lotPriceAtBlock := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) - } - return *lotPriceAtBlock, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lotPriceAtBlock := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { + return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) + } + return *lotPriceAtBlock, nil } - // Get the ETH amount bid on a lot by an address func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return nil, err - } - lot := new(*big.Int) - if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { - return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) - } - return *lot, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return nil, err + } + lot := new(*big.Int) + if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { + return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) + } + return *lot, nil } - // Estimate the gas of CreateLot func EstimateCreateLotGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketAuctionManager.GetTransactionGasInfo(opts, "createLot") + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "createLot") } - // Create a new lot func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return 0, common.Hash{}, err - } - lotCount, err := GetLotCount(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - hash, err := rocketAuctionManager.Transact(opts, "createLot") - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not create lot: %w", err) - } - return lotCount, hash, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return 0, common.Hash{}, err + } + lotCount, err := GetLotCount(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + hash, err := rocketAuctionManager.Transact(opts, "createLot") + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not create lot: %w", err) + } + return lotCount, hash, nil } - // Estimate the gas of PlaceBid func EstimatePlaceBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketAuctionManager.GetTransactionGasInfo(opts, "placeBid", big.NewInt(int64(lotIndex))) + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "placeBid", big.NewInt(int64(lotIndex))) } - // Place a bid on a lot func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) - } - return hash, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) + } + return hash, nil } - // Estimate the gas of ClaimBid func EstimateClaimBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketAuctionManager.GetTransactionGasInfo(opts, "claimBid", big.NewInt(int64(lotIndex))) + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "claimBid", big.NewInt(int64(lotIndex))) } - // Claim RPL from a lot that was bid on func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) - } - return hash, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) + } + return hash, nil } - // Estimate the gas of RecoverUnclaimedRPL func EstimateRecoverUnclaimedRPLGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketAuctionManager.GetTransactionGasInfo(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketAuctionManager.GetTransactionGasInfo(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) } - // Recover unclaimed RPL from a lot func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) - } - return hash, nil + rocketAuctionManager, err := getRocketAuctionManager(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) + } + return hash, nil } - // Get contracts var rocketAuctionManagerLock sync.Mutex + func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketAuctionManagerLock.Lock() - defer rocketAuctionManagerLock.Unlock() - return rp.GetContract("rocketAuctionManager") + rocketAuctionManagerLock.Lock() + defer rocketAuctionManagerLock.Unlock() + return rp.GetContract("rocketAuctionManager") } - diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go index 4869286db..b7aa1c739 100644 --- a/dao/proposal-payload.go +++ b/dao/proposal-payload.go @@ -1,64 +1,63 @@ package dao import ( - "encoding/hex" - "fmt" - "strings" - "sync" + "encoding/hex" + "fmt" + "strings" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - strutils "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/rocketpool-go/rocketpool" + strutils "github.com/rocket-pool/rocketpool-go/utils/strings" ) - // Get the string representation of a proposal payload var getProposalPayloadStringLock sync.Mutex -func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload []byte) (string, error) { - - // Lock while getting proposal payload string - getProposalPayloadStringLock.Lock() - defer getProposalPayloadStringLock.Unlock() - - // Get proposal DAO contract ABI - daoContractAbi, err := rp.GetABI(daoName) - if err != nil { - return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) - } - // Get proposal payload method - method, err := daoContractAbi.MethodById(payload) - if err != nil { - return "", fmt.Errorf("Could not get proposal payload method: %w", err) - } - - // Get proposal payload argument values - args, err := method.Inputs.UnpackValues(payload[4:]) - if err != nil { - return "", fmt.Errorf("Could not get proposal payload arguments: %w", err) - } - - // Format argument values as strings - argStrs := []string{} - for ai, arg := range args { - switch method.Inputs[ai].Type.T { - case abi.AddressTy: - argStrs = append(argStrs, arg.(common.Address).Hex()) - case abi.HashTy: - argStrs = append(argStrs, arg.(common.Hash).Hex()) - case abi.FixedBytesTy: - fallthrough - case abi.BytesTy: - argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) - default: - argStrs = append(argStrs, fmt.Sprintf("%v", arg)) - } - } +func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload []byte) (string, error) { - // Build & return payload string - return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil + // Lock while getting proposal payload string + getProposalPayloadStringLock.Lock() + defer getProposalPayloadStringLock.Unlock() + + // Get proposal DAO contract ABI + daoContractAbi, err := rp.GetABI(daoName) + if err != nil { + return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) + } + + // Get proposal payload method + method, err := daoContractAbi.MethodById(payload) + if err != nil { + return "", fmt.Errorf("Could not get proposal payload method: %w", err) + } + + // Get proposal payload argument values + args, err := method.Inputs.UnpackValues(payload[4:]) + if err != nil { + return "", fmt.Errorf("Could not get proposal payload arguments: %w", err) + } + + // Format argument values as strings + argStrs := []string{} + for ai, arg := range args { + switch method.Inputs[ai].Type.T { + case abi.AddressTy: + argStrs = append(argStrs, arg.(common.Address).Hex()) + case abi.HashTy: + argStrs = append(argStrs, arg.(common.Hash).Hex()) + case abi.FixedBytesTy: + fallthrough + case abi.BytesTy: + argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) + default: + argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + } + } + + // Build & return payload string + return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil } - diff --git a/dao/proposals.go b/dao/proposals.go index 1e6cc6e5c..74bf1ad5f 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -1,641 +1,647 @@ package dao import ( - "fmt" - "math/big" - "sync" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "golang.org/x/sync/errgroup" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/strings" ) - // Settings const ( - ProposalDAONamesBatchSize = 50 - ProposalDetailsBatchSize = 10 + ProposalDAONamesBatchSize = 50 + ProposalDetailsBatchSize = 10 ) - // Proposal details type ProposalDetails struct { - ID uint64 `json:"id"` - DAO string `json:"dao"` - ProposerAddress common.Address `json:"proposerAddress"` - Message string `json:"message"` - CreatedTime uint64 `json:"createdTime"` - StartTime uint64 `json:"startTime"` - EndTime uint64 `json:"endTime"` - ExpiryTime uint64 `json:"expiryTime"` - VotesRequired float64 `json:"votesRequired"` - VotesFor float64 `json:"votesFor"` - VotesAgainst float64 `json:"votesAgainst"` - MemberVoted bool `json:"memberVoted"` - MemberSupported bool `json:"memberSupported"` - IsCancelled bool `json:"isCancelled"` - IsExecuted bool `json:"isExecuted"` - Payload []byte `json:"payload"` - PayloadStr string `json:"payloadStr"` - State rptypes.ProposalState `json:"state"` + ID uint64 `json:"id"` + DAO string `json:"dao"` + ProposerAddress common.Address `json:"proposerAddress"` + Message string `json:"message"` + CreatedTime uint64 `json:"createdTime"` + StartTime uint64 `json:"startTime"` + EndTime uint64 `json:"endTime"` + ExpiryTime uint64 `json:"expiryTime"` + VotesRequired float64 `json:"votesRequired"` + VotesFor float64 `json:"votesFor"` + VotesAgainst float64 `json:"votesAgainst"` + MemberVoted bool `json:"memberVoted"` + MemberSupported bool `json:"memberSupported"` + IsCancelled bool `json:"isCancelled"` + IsExecuted bool `json:"isExecuted"` + Payload []byte `json:"payload"` + PayloadStr string `json:"payloadStr"` + State rptypes.ProposalState `json:"state"` } - // Get all proposal details func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Get proposal count - proposalCount, err := GetProposalCount(rp, opts) - if err != nil { - return []ProposalDetails{}, err - } - - // Load proposal details in batches - details := make([]ProposalDetails, proposalCount) - for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDetailsBatchSize - if pei > proposalCount { pei = proposalCount } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDetails, err := GetProposalDetails(rp, pi + 1, opts) // Proposals are 1-indexed - if err == nil { details[pi] = proposalDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []ProposalDetails{}, err - } - - } - - // Return - return details, nil + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, proposalCount) + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { + pei = proposalCount + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, pi+1, opts) // Proposals are 1-indexed + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil } - // Get all proposal details with member data func GetProposalsWithMember(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Get proposal count - proposalCount, err := GetProposalCount(rp, opts) - if err != nil { - return []ProposalDetails{}, err - } - - // Load proposal details in batches - details := make([]ProposalDetails, proposalCount) - for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDetailsBatchSize - if pei > proposalCount { pei = proposalCount } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDetails, err := GetProposalDetailsWithMember(rp, pi + 1, memberAddress, opts) // Proposals are 1-indexed - if err == nil { details[pi] = proposalDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []ProposalDetails{}, err - } - - } - - // Return - return details, nil + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, proposalCount) + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { + pei = proposalCount + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetailsWithMember(rp, pi+1, memberAddress, opts) // Proposals are 1-indexed + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil } - // Get DAO proposal details func GetDAOProposals(rp *rocketpool.RocketPool, daoName string, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Get DAO proposal IDs - proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) - if err != nil { - return []ProposalDetails{}, err - } - - // Load proposal details in batches - details := make([]ProposalDetails, len(proposalIds)) - for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDetailsBatchSize - if pei > len(proposalIds) { pei = len(proposalIds) } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDetails, err := GetProposalDetails(rp, proposalIds[pi], opts) - if err == nil { details[pi] = proposalDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []ProposalDetails{}, err - } - - } - - // Return - return details, nil + // Get DAO proposal IDs + proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, len(proposalIds)) + for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > len(proposalIds) { + pei = len(proposalIds) + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, proposalIds[pi], opts) + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil } - // Get DAO proposal details with member data func GetDAOProposalsWithMember(rp *rocketpool.RocketPool, daoName string, memberAddress common.Address, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Get DAO proposal IDs - proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) - if err != nil { - return []ProposalDetails{}, err - } - - // Load proposal details in batches - details := make([]ProposalDetails, len(proposalIds)) - for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDetailsBatchSize - if pei > len(proposalIds) { pei = len(proposalIds) } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDetails, err := GetProposalDetailsWithMember(rp, proposalIds[pi], memberAddress, opts) - if err == nil { details[pi] = proposalDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []ProposalDetails{}, err - } - - } - - // Return - return details, nil + // Get DAO proposal IDs + proposalIds, err := GetDAOProposalIDs(rp, daoName, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, len(proposalIds)) + for bsi := 0; bsi < len(proposalIds); bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > len(proposalIds) { + pei = len(proposalIds) + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetailsWithMember(rp, proposalIds[pi], memberAddress, opts) + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil } - // Get the IDs of proposals filtered by a DAO func GetDAOProposalIDs(rp *rocketpool.RocketPool, daoName string, opts *bind.CallOpts) ([]uint64, error) { - // Get proposal count - proposalCount, err := GetProposalCount(rp, opts) - if err != nil { - return []uint64{}, err - } - - // Load proposal DAO names in batches - proposalDaoNames := make([]string, proposalCount) - for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDAONamesBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDAONamesBatchSize - if pei > proposalCount { pei = proposalCount } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDaoName, err := GetProposalDAO(rp, pi + 1, opts) // Proposals are 1-indexed - if err == nil { proposalDaoNames[pi] = proposalDaoName } - return err - }) - } - if err := wg.Wait(); err != nil { - return []uint64{}, err - } - - } - - // Get & return IDs for DAO proposals - ids := []uint64{} - for pi, proposalDaoName := range proposalDaoNames { - if proposalDaoName == daoName { - ids = append(ids, uint64(pi + 1)) // Proposals are 1-indexed - } - } - return ids, nil + // Get proposal count + proposalCount, err := GetProposalCount(rp, opts) + if err != nil { + return []uint64{}, err + } + + // Load proposal DAO names in batches + proposalDaoNames := make([]string, proposalCount) + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDAONamesBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDAONamesBatchSize + if pei > proposalCount { + pei = proposalCount + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDaoName, err := GetProposalDAO(rp, pi+1, opts) // Proposals are 1-indexed + if err == nil { + proposalDaoNames[pi] = proposalDaoName + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []uint64{}, err + } + + } + + // Get & return IDs for DAO proposals + ids := []uint64{} + for pi, proposalDaoName := range proposalDaoNames { + if proposalDaoName == daoName { + ids = append(ids, uint64(pi+1)) // Proposals are 1-indexed + } + } + return ids, nil } - // Get a proposal's details func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { - // Data - var wg errgroup.Group - var dao string - var proposerAddress common.Address - var message string - var createdTime uint64 - var startTime uint64 - var endTime uint64 - var expiryTime uint64 - var votesRequired float64 - var votesFor float64 - var votesAgainst float64 - var isCancelled bool - var isExecuted bool - var payload []byte - var state rptypes.ProposalState - - // Load data - wg.Go(func() error { - var err error - dao, err = GetProposalDAO(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - proposerAddress, err = GetProposalProposerAddress(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - message, err = GetProposalMessage(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - createdTime, err = GetProposalCreatedTime(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - startTime, err = GetProposalStartTime(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - endTime, err = GetProposalEndTime(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - expiryTime, err = GetProposalExpiryTime(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - votesRequired, err = GetProposalVotesRequired(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - votesFor, err = GetProposalVotesFor(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - votesAgainst, err = GetProposalVotesAgainst(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - isCancelled, err = GetProposalIsCancelled(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - isExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - payload, err = GetProposalPayload(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - state, err = GetProposalState(rp, proposalId, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return ProposalDetails{}, err - } - - // Get proposal payload string - payloadStr, err := GetProposalPayloadString(rp, dao, payload) - if err != nil { - payloadStr = "(unknown)" - } - - // Return - return ProposalDetails{ - ID: proposalId, - DAO: dao, - ProposerAddress: proposerAddress, - Message: message, - CreatedTime: createdTime, - StartTime: startTime, - EndTime: endTime, - ExpiryTime: expiryTime, - VotesRequired: votesRequired, - VotesFor: votesFor, - VotesAgainst: votesAgainst, - IsCancelled: isCancelled, - IsExecuted: isExecuted, - Payload: payload, - PayloadStr: payloadStr, - State: state, - }, nil + // Data + var wg errgroup.Group + var dao string + var proposerAddress common.Address + var message string + var createdTime uint64 + var startTime uint64 + var endTime uint64 + var expiryTime uint64 + var votesRequired float64 + var votesFor float64 + var votesAgainst float64 + var isCancelled bool + var isExecuted bool + var payload []byte + var state rptypes.ProposalState + + // Load data + wg.Go(func() error { + var err error + dao, err = GetProposalDAO(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + proposerAddress, err = GetProposalProposerAddress(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + message, err = GetProposalMessage(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + createdTime, err = GetProposalCreatedTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + startTime, err = GetProposalStartTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + endTime, err = GetProposalEndTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + expiryTime, err = GetProposalExpiryTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesRequired, err = GetProposalVotesRequired(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesFor, err = GetProposalVotesFor(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + votesAgainst, err = GetProposalVotesAgainst(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + isCancelled, err = GetProposalIsCancelled(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + isExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + payload, err = GetProposalPayload(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + state, err = GetProposalState(rp, proposalId, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Get proposal payload string + payloadStr, err := GetProposalPayloadString(rp, dao, payload) + if err != nil { + payloadStr = "(unknown)" + } + + // Return + return ProposalDetails{ + ID: proposalId, + DAO: dao, + ProposerAddress: proposerAddress, + Message: message, + CreatedTime: createdTime, + StartTime: startTime, + EndTime: endTime, + ExpiryTime: expiryTime, + VotesRequired: votesRequired, + VotesFor: votesFor, + VotesAgainst: votesAgainst, + IsCancelled: isCancelled, + IsExecuted: isExecuted, + Payload: payload, + PayloadStr: payloadStr, + State: state, + }, nil } - // Get a proposal's details with member data func GetProposalDetailsWithMember(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (ProposalDetails, error) { - // Data - var wg errgroup.Group - var details ProposalDetails - var memberVoted bool - var memberSupported bool - - // Load data - wg.Go(func() error { - var err error - details, err = GetProposalDetails(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - memberVoted, err = GetProposalMemberVoted(rp, proposalId, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - memberSupported, err = GetProposalMemberSupported(rp, proposalId, memberAddress, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return ProposalDetails{}, err - } - - // Return - details.MemberVoted = memberVoted - details.MemberSupported = memberSupported - return details, nil + // Data + var wg errgroup.Group + var details ProposalDetails + var memberVoted bool + var memberSupported bool + + // Load data + wg.Go(func() error { + var err error + details, err = GetProposalDetails(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + memberVoted, err = GetProposalMemberVoted(rp, proposalId, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + memberSupported, err = GetProposalMemberSupported(rp, proposalId, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Return + details.MemberVoted = memberVoted + details.MemberSupported = memberSupported + return details, nil } - // Get the proposal count func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - proposalCount := new(*big.Int) - if err := rocketDAOProposal.Call(opts, proposalCount, "getTotal"); err != nil { - return 0, fmt.Errorf("Could not get proposal count: %w", err) - } - return (*proposalCount).Uint64(), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + proposalCount := new(*big.Int) + if err := rocketDAOProposal.Call(opts, proposalCount, "getTotal"); err != nil { + return 0, fmt.Errorf("Could not get proposal count: %w", err) + } + return (*proposalCount).Uint64(), nil } - // Proposal details func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return "", err - } - daoName := new(string) - if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { - return "", fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) - } - return strings.Sanitize(*daoName), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return "", err + } + daoName := new(string) + if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { + return "", fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) + } + return strings.Sanitize(*daoName), nil } func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return common.Address{}, err - } - proposerAddress := new(common.Address) - if err := rocketDAOProposal.Call(opts, proposerAddress, "getProposer", big.NewInt(int64(proposalId))); err != nil { - return common.Address{}, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) - } - return *proposerAddress, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return common.Address{}, err + } + proposerAddress := new(common.Address) + if err := rocketDAOProposal.Call(opts, proposerAddress, "getProposer", big.NewInt(int64(proposalId))); err != nil { + return common.Address{}, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) + } + return *proposerAddress, nil } func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return "", err - } - message := new(string) - if err := rocketDAOProposal.Call(opts, message, "getMessage", big.NewInt(int64(proposalId))); err != nil { - return "", fmt.Errorf("Could not get proposal %d message: %w", proposalId, err) - } - return strings.Sanitize(*message), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return "", err + } + message := new(string) + if err := rocketDAOProposal.Call(opts, message, "getMessage", big.NewInt(int64(proposalId))); err != nil { + return "", fmt.Errorf("Could not get proposal %d message: %w", proposalId, err) + } + return strings.Sanitize(*message), nil } func GetProposalCreatedTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - createdTime := new(*big.Int) - if err := rocketDAOProposal.Call(opts, createdTime, "getCreated", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d created time: %w", proposalId, err) - } - return (*createdTime).Uint64(), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + createdTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, createdTime, "getCreated", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d created time: %w", proposalId, err) + } + return (*createdTime).Uint64(), nil } func GetProposalStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - startTime := new(*big.Int) - if err := rocketDAOProposal.Call(opts, startTime, "getStart", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d start time: %w", proposalId, err) - } - return (*startTime).Uint64(), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + startTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, startTime, "getStart", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d start time: %w", proposalId, err) + } + return (*startTime).Uint64(), nil } func GetProposalEndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - endTime := new(*big.Int) - if err := rocketDAOProposal.Call(opts, endTime, "getEnd", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d end time: %w", proposalId, err) - } - return (*endTime).Uint64(), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + endTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, endTime, "getEnd", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d end time: %w", proposalId, err) + } + return (*endTime).Uint64(), nil } func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - expiryTime := new(*big.Int) - if err := rocketDAOProposal.Call(opts, expiryTime, "getExpires", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d expiry time: %w", proposalId, err) - } - return (*expiryTime).Uint64(), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + expiryTime := new(*big.Int) + if err := rocketDAOProposal.Call(opts, expiryTime, "getExpires", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d expiry time: %w", proposalId, err) + } + return (*expiryTime).Uint64(), nil } func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - votesRequired := new(*big.Int) - if err := rocketDAOProposal.Call(opts, votesRequired, "getVotesRequired", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes required: %w", proposalId, err) - } - return eth.WeiToEth(*votesRequired), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesRequired := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesRequired, "getVotesRequired", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes required: %w", proposalId, err) + } + return eth.WeiToEth(*votesRequired), nil } func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - votesFor := new(*big.Int) - if err := rocketDAOProposal.Call(opts, votesFor, "getVotesFor", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes for: %w", proposalId, err) - } - return eth.WeiToEth(*votesFor), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesFor := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesFor, "getVotesFor", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes for: %w", proposalId, err) + } + return eth.WeiToEth(*votesFor), nil } func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - votesAgainst := new(*big.Int) - if err := rocketDAOProposal.Call(opts, votesAgainst, "getVotesAgainst", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes against: %w", proposalId, err) - } - return eth.WeiToEth(*votesAgainst), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + votesAgainst := new(*big.Int) + if err := rocketDAOProposal.Call(opts, votesAgainst, "getVotesAgainst", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d votes against: %w", proposalId, err) + } + return eth.WeiToEth(*votesAgainst), nil } func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return false, err - } - cancelled := new(bool) - if err := rocketDAOProposal.Call(opts, cancelled, "getCancelled", big.NewInt(int64(proposalId))); err != nil { - return false, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) - } - return *cancelled, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + cancelled := new(bool) + if err := rocketDAOProposal.Call(opts, cancelled, "getCancelled", big.NewInt(int64(proposalId))); err != nil { + return false, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) + } + return *cancelled, nil } func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return false, err - } - executed := new(bool) - if err := rocketDAOProposal.Call(opts, executed, "getExecuted", big.NewInt(int64(proposalId))); err != nil { - return false, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) - } - return *executed, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + executed := new(bool) + if err := rocketDAOProposal.Call(opts, executed, "getExecuted", big.NewInt(int64(proposalId))); err != nil { + return false, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) + } + return *executed, nil } func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return []byte{}, err - } - payload := new([]byte) - if err := rocketDAOProposal.Call(opts, payload, "getPayload", big.NewInt(int64(proposalId))); err != nil { - return []byte{}, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) - } - return *payload, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return []byte{}, err + } + payload := new([]byte) + if err := rocketDAOProposal.Call(opts, payload, "getPayload", big.NewInt(int64(proposalId))); err != nil { + return []byte{}, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) + } + return *payload, nil } func GetProposalPayloadStr(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - dao, err := GetProposalDAO(rp, proposalId, opts) - if err != nil { - return "", err - } - payload, err := GetProposalPayload(rp, proposalId, opts) - if err != nil { - return "", err - } - payloadStr, err := GetProposalPayloadString(rp, dao, payload) - if err != nil { - payloadStr = "(unknown)" - } - return payloadStr, nil + dao, err := GetProposalDAO(rp, proposalId, opts) + if err != nil { + return "", err + } + payload, err := GetProposalPayload(rp, proposalId, opts) + if err != nil { + return "", err + } + payloadStr, err := GetProposalPayloadString(rp, dao, payload) + if err != nil { + payloadStr = "(unknown)" + } + return payloadStr, nil } func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (rptypes.ProposalState, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return 0, err - } - state := new(uint8) - if err := rocketDAOProposal.Call(opts, state, "getState", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d state: %w", proposalId, err) - } - return rptypes.ProposalState(*state), nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return 0, err + } + state := new(uint8) + if err := rocketDAOProposal.Call(opts, state, "getState", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("Could not get proposal %d state: %w", proposalId, err) + } + return rptypes.ProposalState(*state), nil } - // Get whether a member has voted on a proposal func GetProposalMemberVoted(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return false, err - } - voted := new(bool) - if err := rocketDAOProposal.Call(opts, voted, "getReceiptHasVoted", big.NewInt(int64(proposalId)), memberAddress); err != nil { - return false, fmt.Errorf("Could not get proposal %d member %s voted status: %w", proposalId, memberAddress.Hex(), err) - } - return *voted, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + voted := new(bool) + if err := rocketDAOProposal.Call(opts, voted, "getReceiptHasVoted", big.NewInt(int64(proposalId)), memberAddress); err != nil { + return false, fmt.Errorf("Could not get proposal %d member %s voted status: %w", proposalId, memberAddress.Hex(), err) + } + return *voted, nil } - // Get whether a member has voted in support of a proposal func GetProposalMemberSupported(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) - if err != nil { - return false, err - } - supported := new(bool) - if err := rocketDAOProposal.Call(opts, supported, "getReceiptSupported", big.NewInt(int64(proposalId)), memberAddress); err != nil { - return false, fmt.Errorf("Could not get proposal %d member %s supported status: %w", proposalId, memberAddress.Hex(), err) - } - return *supported, nil + rocketDAOProposal, err := getRocketDAOProposal(rp) + if err != nil { + return false, err + } + supported := new(bool) + if err := rocketDAOProposal.Call(opts, supported, "getReceiptSupported", big.NewInt(int64(proposalId)), memberAddress); err != nil { + return false, fmt.Errorf("Could not get proposal %d member %s supported status: %w", proposalId, memberAddress.Hex(), err) + } + return *supported, nil } - // Get contracts var rocketDAOProposalLock sync.Mutex + func getRocketDAOProposal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProposalLock.Lock() - defer rocketDAOProposalLock.Unlock() - return rp.GetContract("rocketDAOProposal") + rocketDAOProposalLock.Lock() + defer rocketDAOProposalLock.Unlock() + return rp.GetContract("rocketDAOProposal") } - diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 1abbf8494..59bbf34da 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -14,105 +14,97 @@ import ( // Estimate the gas of BootstrapBool func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) } - // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return hash, nil + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + } + return hash, nil } - // Estimate the gas of BootstrapUint func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) } - // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return hash, nil + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + } + return hash, nil } - // Estimate the gas of BootstrapAddress func EstimateBootstrapAddressGas(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingAddress", contractName, settingPath, value) + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingAddress", contractName, settingPath, value) } - // Bootstrap an address setting func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return hash, nil + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) + } + return hash, nil } - // Estimate the gas of BootstrapClaimer func EstimateBootstrapClaimerGas(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) } - // Bootstrap a rewards claimer func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) - } - return hash, nil + rocketDAOProtocol, err := getRocketDAOProtocol(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) + } + return hash, nil } - // Get contracts var rocketDAOProtocolLock sync.Mutex + func getRocketDAOProtocol(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAOProtocolLock.Lock() - defer rocketDAOProtocolLock.Unlock() - return rp.GetContract("rocketDAOProtocol") + rocketDAOProtocolLock.Lock() + defer rocketDAOProtocolLock.Unlock() + return rp.GetContract("rocketDAOProtocol") } - diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index 74aef9236..4e8a97409 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -12,107 +12,99 @@ import ( // Estimate the gas of Join func EstimateJoinGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionJoin") + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionJoin") } - // Join the trusted node DAO // Requires an executed invite proposal func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not join the trusted node DAO: %w", err) - } - return hash, nil + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not join the trusted node DAO: %w", err) + } + return hash, nil } - // Estimate the gas of Leave func EstimateLeaveGas(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionLeave", rplBondRefundAddress) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionLeave", rplBondRefundAddress) } - // Leave the trusted node DAO // Requires an executed leave proposal func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not leave the trusted node DAO: %w", err) - } - return hash, nil + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not leave the trusted node DAO: %w", err) + } + return hash, nil } - // Estimate the gas of MakeChallenge func EstimateMakeChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeMake", memberAddress) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeMake", memberAddress) } - // Make a challenge against a node func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) - } - return hash, nil + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) + } + return hash, nil } - // Estimate the gas of DecideChallenge func EstimateDecideChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeDecide", memberAddress) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedActions.GetTransactionGasInfo(opts, "actionChallengeDecide", memberAddress) } - // Decide a challenge against a node func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) - } - return hash, nil + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) + } + return hash, nil } - // Get contracts var rocketDAONodeTrustedActionsLock sync.Mutex + func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAONodeTrustedActionsLock.Lock() - defer rocketDAONodeTrustedActionsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedActions") + rocketDAONodeTrustedActionsLock.Lock() + defer rocketDAONodeTrustedActionsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedActions") } - diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 3fdc2fa70..3f4fc9cb8 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -15,459 +15,447 @@ import ( // Settings const ( - MemberAddressBatchSize = 50 - MemberDetailsBatchSize = 20 + MemberAddressBatchSize = 50 + MemberDetailsBatchSize = 20 ) - // Proposal details type MemberDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - ID string `json:"id"` - Url string `json:"url"` - JoinedTime uint64 `json:"joinedTime"` - LastProposalTime uint64 `json:"lastProposalTime"` - RPLBondAmount *big.Int `json:"rplBondAmount"` - UnbondedValidatorCount uint64 `json:"unbondedValidatorCount"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + ID string `json:"id"` + Url string `json:"url"` + JoinedTime uint64 `json:"joinedTime"` + LastProposalTime uint64 `json:"lastProposalTime"` + RPLBondAmount *big.Int `json:"rplBondAmount"` + UnbondedValidatorCount uint64 `json:"unbondedValidatorCount"` } - // Get all member details func GetMembers(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MemberDetails, error) { - // Get member addresses - memberAddresses, err := GetMemberAddresses(rp, opts) - if err != nil { - return []MemberDetails{}, err - } - - // Load member details in batches - details := make([]MemberDetails, len(memberAddresses)) - for bsi := 0; bsi < len(memberAddresses); bsi += MemberDetailsBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MemberDetailsBatchSize - if mei > len(memberAddresses) { mei = len(memberAddresses) } - - // Load details - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - memberAddress := memberAddresses[mi] - memberDetails, err := GetMemberDetails(rp, memberAddress, opts) - if err == nil { details[mi] = memberDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []MemberDetails{}, err - } - - } - - // Return - return details, nil + // Get member addresses + memberAddresses, err := GetMemberAddresses(rp, opts) + if err != nil { + return []MemberDetails{}, err + } + + // Load member details in batches + details := make([]MemberDetails, len(memberAddresses)) + for bsi := 0; bsi < len(memberAddresses); bsi += MemberDetailsBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MemberDetailsBatchSize + if mei > len(memberAddresses) { + mei = len(memberAddresses) + } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + memberAddress := memberAddresses[mi] + memberDetails, err := GetMemberDetails(rp, memberAddress, opts) + if err == nil { + details[mi] = memberDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MemberDetails{}, err + } + + } + + // Return + return details, nil } - // Get all member addresses func GetMemberAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - // Get member count - memberCount, err := GetMemberCount(rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Load member addresses in batches - addresses := make([]common.Address, memberCount) - for bsi := uint64(0); bsi < memberCount; bsi += MemberAddressBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MemberAddressBatchSize - if mei > memberCount { mei = memberCount } - - // Load addresses - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetMemberAt(rp, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil + // Get member count + memberCount, err := GetMemberCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load member addresses in batches + addresses := make([]common.Address, memberCount) + for bsi := uint64(0); bsi < memberCount; bsi += MemberAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MemberAddressBatchSize + if mei > memberCount { + mei = memberCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMemberAt(rp, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil } - // Get a member's details func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (MemberDetails, error) { - // Data - var wg errgroup.Group - var exists bool - var id string - var url string - var joinedTime uint64 - var lastProposalTime uint64 - var rplBondAmount *big.Int - var unbondedValidatorCount uint64 - - // Load data - wg.Go(func() error { - var err error - exists, err = GetMemberExists(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - id, err = GetMemberID(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - url, err = GetMemberUrl(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - joinedTime, err = GetMemberJoinedTime(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - lastProposalTime, err = GetMemberLastProposalTime(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - rplBondAmount, err = GetMemberRPLBondAmount(rp, memberAddress, opts) - return err - }) - wg.Go(func() error { - var err error - unbondedValidatorCount, err = GetMemberUnbondedValidatorCount(rp, memberAddress, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return MemberDetails{}, err - } - - // Return - return MemberDetails{ - Address: memberAddress, - Exists: exists, - ID: id, - Url: url, - JoinedTime: joinedTime, - LastProposalTime: lastProposalTime, - RPLBondAmount: rplBondAmount, - UnbondedValidatorCount: unbondedValidatorCount, - }, nil + // Data + var wg errgroup.Group + var exists bool + var id string + var url string + var joinedTime uint64 + var lastProposalTime uint64 + var rplBondAmount *big.Int + var unbondedValidatorCount uint64 + + // Load data + wg.Go(func() error { + var err error + exists, err = GetMemberExists(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + id, err = GetMemberID(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + url, err = GetMemberUrl(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + joinedTime, err = GetMemberJoinedTime(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + lastProposalTime, err = GetMemberLastProposalTime(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + rplBondAmount, err = GetMemberRPLBondAmount(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + unbondedValidatorCount, err = GetMemberUnbondedValidatorCount(rp, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return MemberDetails{}, err + } + + // Return + return MemberDetails{ + Address: memberAddress, + Exists: exists, + ID: id, + Url: url, + JoinedTime: joinedTime, + LastProposalTime: lastProposalTime, + RPLBondAmount: rplBondAmount, + UnbondedValidatorCount: unbondedValidatorCount, + }, nil } - // Get the minimum member count func GetMinimumMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - minMemberCount := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, minMemberCount, "getMemberMinRequired"); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO minimum member count: %w", err) - } - return (*minMemberCount).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + minMemberCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, minMemberCount, "getMemberMinRequired"); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO minimum member count: %w", err) + } + return (*minMemberCount).Uint64(), nil } - // Get the member count func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - memberCount := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, memberCount, "getMemberCount"); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member count: %w", err) - } - return (*memberCount).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + memberCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, memberCount, "getMemberCount"); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member count: %w", err) + } + return (*memberCount).Uint64(), nil } - // Get a member address by index func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Address{}, err - } - memberAddress := new(common.Address) - if err := rocketDAONodeTrusted.Call(opts, memberAddress, "getMemberAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %d address: %w", index, err) - } - return *memberAddress, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Address{}, err + } + memberAddress := new(common.Address) + if err := rocketDAONodeTrusted.Call(opts, memberAddress, "getMemberAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %d address: %w", index, err) + } + return *memberAddress, nil } - // Member details func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return false, err - } - exists := new(bool) - if err := rocketDAONodeTrusted.Call(opts, exists, "getMemberIsValid", memberAddress); err != nil { - return false, fmt.Errorf("Could not get trusted node DAO member %s exists status: %w", memberAddress.Hex(), err) - } - return *exists, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketDAONodeTrusted.Call(opts, exists, "getMemberIsValid", memberAddress); err != nil { + return false, fmt.Errorf("Could not get trusted node DAO member %s exists status: %w", memberAddress.Hex(), err) + } + return *exists, nil } func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return "", err - } - id := new(string) - if err := rocketDAONodeTrusted.Call(opts, id, "getMemberID", memberAddress); err != nil { - return "", fmt.Errorf("Could not get trusted node DAO member %s ID: %w", memberAddress.Hex(), err) - } - return strings.Sanitize(*id), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return "", err + } + id := new(string) + if err := rocketDAONodeTrusted.Call(opts, id, "getMemberID", memberAddress); err != nil { + return "", fmt.Errorf("Could not get trusted node DAO member %s ID: %w", memberAddress.Hex(), err) + } + return strings.Sanitize(*id), nil } func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return "", err - } - url := new(string) - if err := rocketDAONodeTrusted.Call(opts, url, "getMemberUrl", memberAddress); err != nil { - return "", fmt.Errorf("Could not get trusted node DAO member %s URL: %w", memberAddress.Hex(), err) - } - return strings.Sanitize(*url), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return "", err + } + url := new(string) + if err := rocketDAONodeTrusted.Call(opts, url, "getMemberUrl", memberAddress); err != nil { + return "", fmt.Errorf("Could not get trusted node DAO member %s URL: %w", memberAddress.Hex(), err) + } + return strings.Sanitize(*url), nil } func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - joinedTime := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, joinedTime, "getMemberJoinedTime", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s joined time: %w", memberAddress.Hex(), err) - } - return (*joinedTime).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + joinedTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, joinedTime, "getMemberJoinedTime", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s joined time: %w", memberAddress.Hex(), err) + } + return (*joinedTime).Uint64(), nil } func GetMemberLastProposalTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - lastProposalTime := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, lastProposalTime, "getMemberLastProposalTime", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal time: %w", memberAddress.Hex(), err) - } - return (*lastProposalTime).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + lastProposalTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, lastProposalTime, "getMemberLastProposalTime", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal time: %w", memberAddress.Hex(), err) + } + return (*lastProposalTime).Uint64(), nil } func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return nil, err - } - rplBondAmount := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, rplBondAmount, "getMemberRPLBondAmount", memberAddress); err != nil { - return nil, fmt.Errorf("Could not get trusted node DAO member %s RPL bond amount: %w", memberAddress.Hex(), err) - } - return *rplBondAmount, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return nil, err + } + rplBondAmount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, rplBondAmount, "getMemberRPLBondAmount", memberAddress); err != nil { + return nil, fmt.Errorf("Could not get trusted node DAO member %s RPL bond amount: %w", memberAddress.Hex(), err) + } + return *rplBondAmount, nil } func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - unbondedValidatorCount := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, unbondedValidatorCount, "getMemberUnbondedValidatorCount", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s unbonded validator count: %w", memberAddress.Hex(), err) - } - return (*unbondedValidatorCount).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + unbondedValidatorCount := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, unbondedValidatorCount, "getMemberUnbondedValidatorCount", memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO member %s unbonded validator count: %w", memberAddress.Hex(), err) + } + return (*unbondedValidatorCount).Uint64(), nil } - // Get the time that a proposal for a member was executed at func GetMemberInviteProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedTime(rp, "invited", memberAddress, opts) + return GetMemberProposalExecutedTime(rp, "invited", memberAddress, opts) } func GetMemberLeaveProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedTime(rp, "leave", memberAddress, opts) + return GetMemberProposalExecutedTime(rp, "leave", memberAddress, opts) } func GetMemberReplaceProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - return GetMemberProposalExecutedTime(rp, "replace", memberAddress, opts) + return GetMemberProposalExecutedTime(rp, "replace", memberAddress, opts) } func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return 0, err - } - proposalExecutedTime := new(*big.Int) - if err := rocketDAONodeTrusted.Call(opts, proposalExecutedTime, "getMemberProposalExecutedTime", proposalType, memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) - } - return (*proposalExecutedTime).Uint64(), nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return 0, err + } + proposalExecutedTime := new(*big.Int) + if err := rocketDAONodeTrusted.Call(opts, proposalExecutedTime, "getMemberProposalExecutedTime", proposalType, memberAddress); err != nil { + return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) + } + return (*proposalExecutedTime).Uint64(), nil } - // Get a member's replacement address if being replaced func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Address{}, err - } - replacementAddress := new(common.Address) - if err := rocketDAONodeTrusted.Call(opts, replacementAddress, "getMemberReplacedAddress", "new", memberAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %s replacement address: %w", memberAddress.Hex(), err) - } - return *replacementAddress, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Address{}, err + } + replacementAddress := new(common.Address) + if err := rocketDAONodeTrusted.Call(opts, replacementAddress, "getMemberReplacedAddress", "new", memberAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %s replacement address: %w", memberAddress.Hex(), err) + } + return *replacementAddress, nil } - // Get whether a member has an active challenge against them func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return false, err - } - isChallenged := new(bool) - if err := rocketDAONodeTrusted.Call(opts, isChallenged, "getMemberIsChallenged", memberAddress); err != nil { - return false, fmt.Errorf("Could not get trusted node DAO member %s is challenged status: %w", memberAddress.Hex(), err) - } - return *isChallenged, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return false, err + } + isChallenged := new(bool) + if err := rocketDAONodeTrusted.Call(opts, isChallenged, "getMemberIsChallenged", memberAddress); err != nil { + return false, fmt.Errorf("Could not get trusted node DAO member %s is challenged status: %w", memberAddress.Hex(), err) + } + return *isChallenged, nil } - // Estimate the gas of BootstrapBool func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) } - // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) - } - return hash, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + } + return hash, nil } - // Estimate the gas of BootstrapUint func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) } - // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) - } - return hash, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) + } + return hash, nil } - // Estimate the gas of BootstrapMember func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - url = strings.Sanitize(url) - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, url, nodeAddress) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + url = strings.Sanitize(url) + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, url, nodeAddress) } - // Bootstrap a DAO member func BootstrapMember(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Hash{}, err - } - url = strings.Sanitize(url) - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) - } - return hash, nil + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Hash{}, err + } + url = strings.Sanitize(url) + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) + } + return hash, nil } - // Estimate the gas of BootstrapUpgrade func EstimateBootstrapUpgradeGas(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return rocketpool.GasInfo{}, err - } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return rocketpool.GasInfo{}, err + } + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) } - // Bootstrap a contract upgrade func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return common.Hash{}, err - } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) - } - return hash, nil + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return common.Hash{}, err + } + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) + } + return hash, nil } - // Get contracts var rocketDAONodeTrustedLock sync.Mutex + func getRocketDAONodeTrusted(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAONodeTrustedLock.Lock() - defer rocketDAONodeTrustedLock.Unlock() - return rp.GetContract("rocketDAONodeTrusted") + rocketDAONodeTrustedLock.Lock() + defer rocketDAONodeTrustedLock.Unlock() + return rp.GetContract("rocketDAONodeTrusted") } - diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index c6a98f2f6..662806bbe 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -15,318 +15,296 @@ import ( // Estimate the gas of ProposeInviteMember func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - newMemberUrl = strings.Sanitize(newMemberUrl) - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to invite a new member to the trusted node DAO func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - newMemberUrl = strings.Sanitize(newMemberUrl) - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeMemberLeave func EstimateProposeMemberLeaveGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal for a member to leave the trusted node DAO func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeReplaceMember func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - newMemberUrl = strings.Sanitize(newMemberUrl) - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to replace a member in the trusted node DAO func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - newMemberUrl = strings.Sanitize(newMemberUrl) - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + newMemberUrl = strings.Sanitize(newMemberUrl) + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeKickMember func EstimateProposeKickMemberGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to kick a member from the trusted node DAO func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeSetBool func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to update a bool trusted node DAO setting func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeSetUint func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to update a uint trusted node DAO setting func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of ProposeUpgradeContract func EstimateProposeUpgradeContractGas(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return rocketpool.GasInfo{}, err - } - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return rocketpool.GasInfo{}, err + } + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) } - // Submit a proposal to upgrade a contract func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return 0, common.Hash{}, err - } - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) + compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) + if err != nil { + return 0, common.Hash{}, err + } + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) } - // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "propose", message, payload) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "propose", message, payload) } - // Submit a trusted node DAO proposal // Returns the ID of the new proposal func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return 0, common.Hash{}, err - } - proposalCount, err := dao.GetProposalCount(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) - } - return proposalCount + 1, hash, nil + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return 0, common.Hash{}, err + } + proposalCount, err := dao.GetProposalCount(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) + } + return proposalCount + 1, hash, nil } - // Estimate the gas of CancelProposal func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) } - // Cancel a submitted proposal func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) - } - return hash, nil + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) + } + return hash, nil } - // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) } - // Vote on a submitted proposal func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) - } - return hash, nil + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) + } + return hash, nil } - // Estimate the gas of ExecuteProposal func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAONodeTrustedProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) } - // Execute a submitted proposal func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) - } - return hash, nil + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) + } + return hash, nil } - // Get contracts var rocketDAONodeTrustedProposalsLock sync.Mutex + func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAONodeTrustedProposalsLock.Lock() - defer rocketDAONodeTrustedProposalsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedProposals") + rocketDAONodeTrustedProposalsLock.Lock() + defer rocketDAONodeTrustedProposalsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedProposals") } - diff --git a/deposit/deposit.go b/deposit/deposit.go index 41b1de9e4..7cfa6ce29 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -13,85 +13,79 @@ import ( // Get the deposit pool balance func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return nil, err - } - balance := new(*big.Int) - if err := rocketDepositPool.Call(opts, balance, "getBalance"); err != nil { - return nil, fmt.Errorf("Could not get deposit pool balance: %w", err) - } - return *balance, nil + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketDepositPool.Call(opts, balance, "getBalance"); err != nil { + return nil, fmt.Errorf("Could not get deposit pool balance: %w", err) + } + return *balance, nil } - // Get the excess deposit pool balance func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return nil, err - } - excessBalance := new(*big.Int) - if err := rocketDepositPool.Call(opts, excessBalance, "getExcessBalance"); err != nil { - return nil, fmt.Errorf("Could not get deposit pool excess balance: %w", err) - } - return *excessBalance, nil + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + excessBalance := new(*big.Int) + if err := rocketDepositPool.Call(opts, excessBalance, "getExcessBalance"); err != nil { + return nil, fmt.Errorf("Could not get deposit pool excess balance: %w", err) + } + return *excessBalance, nil } - // Estimate the gas of Deposit func EstimateDepositGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDepositPool.GetTransactionGasInfo(opts, "deposit") + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "deposit") } - // Make a deposit func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDepositPool.Transact(opts, "deposit") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not deposit: %w", err) - } - return hash, nil + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDepositPool.Transact(opts, "deposit") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not deposit: %w", err) + } + return hash, nil } - // Estimate the gas of AssignDeposits func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits") + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits") } - // Assign deposits func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDepositPool, err := getRocketDepositPool(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketDepositPool.Transact(opts, "assignDeposits") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not assign deposits: %w", err) - } - return hash, nil + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDepositPool.Transact(opts, "assignDeposits") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not assign deposits: %w", err) + } + return hash, nil } - // Get contracts var rocketDepositPoolLock sync.Mutex + func getRocketDepositPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDepositPoolLock.Lock() - defer rocketDepositPoolLock.Unlock() - return rp.GetContract("rocketDepositPool") + rocketDepositPoolLock.Lock() + defer rocketDepositPoolLock.Unlock() + return rp.GetContract("rocketDepositPool") } - diff --git a/docs/docgen.go b/docs/docgen.go index 3d0aba6a1..06f77312e 100644 --- a/docs/docgen.go +++ b/docs/docgen.go @@ -15,79 +15,79 @@ const branch string = "release" func main() { - // gomarkdoc's logger - log := logger.New(logger.DebugLevel) + // gomarkdoc's logger + log := logger.New(logger.DebugLevel) - // Make a new doc renderer - renderer, err := gomarkdoc.NewRenderer() - if err != nil { - fmt.Printf("Error creating renderer: %s\n", err.Error()) - os.Exit(1) - } + // Make a new doc renderer + renderer, err := gomarkdoc.NewRenderer() + if err != nil { + fmt.Printf("Error creating renderer: %s\n", err.Error()) + os.Exit(1) + } - // Get the working directory - wd, err := os.Getwd() - if err != nil { - fmt.Printf("Error getting working directory: %s\n", err.Error()) - os.Exit(1) - } + // Get the working directory + wd, err := os.Getwd() + if err != nil { + fmt.Printf("Error getting working directory: %s\n", err.Error()) + os.Exit(1) + } - // These are all of the packages to generate the source for - packages := map[string]string{ - "auction": "%s/../auction", - "contracts": "%s/../contracts", - "dao": "%s/../dao", - "dao-protocol": "%s/../dao/protocol", - "dao-trustednode": "%s/../dao/trustednode", - "deposit": "%s/../deposit", - "minipool": "%s/../minipool", - "network": "%s/../network", - "node": "%s/../node", - "rewards": "%s/../rewards", - "rocketpool": "%s/../rocketpool", - "settings-protocol": "%s/../settings/protocol", - "settings-trustednode": "%s/../settings/trustednode", - "storage": "%s/../storage", - "tokens": "%s/../tokens", - "types": "%s/../types", - "utils": "%s/../utils", - "utils-eth": "%s/../utils/eth", - "utils-strings": "%s/../utils/strings", - } + // These are all of the packages to generate the source for + packages := map[string]string{ + "auction": "%s/../auction", + "contracts": "%s/../contracts", + "dao": "%s/../dao", + "dao-protocol": "%s/../dao/protocol", + "dao-trustednode": "%s/../dao/trustednode", + "deposit": "%s/../deposit", + "minipool": "%s/../minipool", + "network": "%s/../network", + "node": "%s/../node", + "rewards": "%s/../rewards", + "rocketpool": "%s/../rocketpool", + "settings-protocol": "%s/../settings/protocol", + "settings-trustednode": "%s/../settings/trustednode", + "storage": "%s/../storage", + "tokens": "%s/../tokens", + "types": "%s/../types", + "utils": "%s/../utils", + "utils-eth": "%s/../utils/eth", + "utils-strings": "%s/../utils/strings", + } - // Build the documentation file for each package - for filename, path := range packages { + // Build the documentation file for each package + for filename, path := range packages { - // Load the source dir - builder, err := build.ImportDir(fmt.Sprintf(path, wd), build.ImportComment) - if err != nil { - fmt.Printf("Error loading package builder for %s: %s\n", filename, err.Error()) - os.Exit(1) - } + // Load the source dir + builder, err := build.ImportDir(fmt.Sprintf(path, wd), build.ImportComment) + if err != nil { + fmt.Printf("Error loading package builder for %s: %s\n", filename, err.Error()) + os.Exit(1) + } - // Create a package from the source - pkg, err := lang.NewPackageFromBuild(log, builder, lang.PackageWithRepositoryOverrides(&lang.Repo{ - Remote: repo, - DefaultBranch: branch, - })) - if err != nil { - fmt.Printf("Error creating package %s: %s\n", filename, err.Error()) - os.Exit(1) - } + // Create a package from the source + pkg, err := lang.NewPackageFromBuild(log, builder, lang.PackageWithRepositoryOverrides(&lang.Repo{ + Remote: repo, + DefaultBranch: branch, + })) + if err != nil { + fmt.Printf("Error creating package %s: %s\n", filename, err.Error()) + os.Exit(1) + } - // Render the documentation for the package - packageContents, err := renderer.Package(pkg) - if err != nil { - fmt.Printf("Error exporting package %s: %s\n", filename, err.Error()) - os.Exit(1) - } + // Render the documentation for the package + packageContents, err := renderer.Package(pkg) + if err != nil { + fmt.Printf("Error exporting package %s: %s\n", filename, err.Error()) + os.Exit(1) + } - // Write the docs out to the appropriate file - err = os.WriteFile(fmt.Sprintf("%s/%s.md", wd, filename), []byte(packageContents), 0644) - if err != nil { - fmt.Printf("Error writing file for package %s: %s\n", filename, err.Error()) - os.Exit(1) - } - } - -} \ No newline at end of file + // Write the docs out to the appropriate file + err = os.WriteFile(fmt.Sprintf("%s/%s.md", wd, filename), []byte(packageContents), 0644) + if err != nil { + fmt.Printf("Error writing file for package %s: %s\n", filename, err.Error()) + os.Exit(1) + } + } + +} diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index cd12e7c7e..4ba4bb317 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -1,11 +1,11 @@ package minipool import ( - "context" - "fmt" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "math/big" + "context" + "fmt" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "math/big" "sync" "time" @@ -23,620 +23,583 @@ const EventScanInterval = 10000 // Minipool detail types type StatusDetails struct { - Status rptypes.MinipoolStatus `json:"status"` - StatusBlock uint64 `json:"statusBlock"` - StatusTime time.Time `json:"statusTime"` + Status rptypes.MinipoolStatus `json:"status"` + StatusBlock uint64 `json:"statusBlock"` + StatusTime time.Time `json:"statusTime"` } type NodeDetails struct { - Address common.Address `json:"address"` - Fee float64 `json:"fee"` - DepositBalance *big.Int `json:"depositBalance"` - RefundBalance *big.Int `json:"refundBalance"` - DepositAssigned bool `json:"depositAssigned"` + Address common.Address `json:"address"` + Fee float64 `json:"fee"` + DepositBalance *big.Int `json:"depositBalance"` + RefundBalance *big.Int `json:"refundBalance"` + DepositAssigned bool `json:"depositAssigned"` } type UserDetails struct { - DepositBalance *big.Int `json:"depositBalance"` - DepositAssigned bool `json:"depositAssigned"` - DepositAssignedTime time.Time `json:"depositAssignedTime"` + DepositBalance *big.Int `json:"depositBalance"` + DepositAssigned bool `json:"depositAssigned"` + DepositAssignedTime time.Time `json:"depositAssignedTime"` } - // The data from a minipool's MinipoolPrestaked event type minipoolPrestakeEvent struct { - Pubkey []byte `abi:"validatorPubkey"` - Signature []byte `abi:"validatorSignature"` - DepositDataRoot [32]byte `abi:"depositDataRoot"` - Amount *big.Int `abi:"amount"` - WithdrawalCredentials []byte `abi:"withdrawalCredentials"` - Time *big.Int `abi:"time"` + Pubkey []byte `abi:"validatorPubkey"` + Signature []byte `abi:"validatorSignature"` + DepositDataRoot [32]byte `abi:"depositDataRoot"` + Amount *big.Int `abi:"amount"` + WithdrawalCredentials []byte `abi:"withdrawalCredentials"` + Time *big.Int `abi:"time"` } - // Formatted MinipoolPrestaked event data type PrestakeData struct { - Pubkey rptypes.ValidatorPubkey `json:"pubkey"` - WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` - Amount *big.Int `json:"amount"` - Signature rptypes.ValidatorSignature `json:"signature"` - DepositDataRoot common.Hash `json:"depositDataRoot"` - Time time.Time `json:"time"` + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount *big.Int `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + DepositDataRoot common.Hash `json:"depositDataRoot"` + Time time.Time `json:"time"` } - // Minipool contract type Minipool struct { - Address common.Address - Contract *rocketpool.Contract - RocketPool *rocketpool.RocketPool + Address common.Address + Contract *rocketpool.Contract + RocketPool *rocketpool.RocketPool } - // Create new minipool contract func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, error) { - // Get contract - contract, err := getMinipoolContract(rp, address) - if err != nil { - return nil, err - } + // Get contract + contract, err := getMinipoolContract(rp, address) + if err != nil { + return nil, err + } - // Create and return - return &Minipool{ - Address: address, - Contract: contract, - RocketPool: rp, - }, nil + // Create and return + return &Minipool{ + Address: address, + Contract: contract, + RocketPool: rp, + }, nil } - // Get status details func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { - // Data - var wg errgroup.Group - var status rptypes.MinipoolStatus - var statusBlock uint64 - var statusTime time.Time - - // Load data - wg.Go(func() error { - var err error - status, err = mp.GetStatus(opts) - return err - }) - wg.Go(func() error { - var err error - statusBlock, err = mp.GetStatusBlock(opts) - return err - }) - wg.Go(func() error { - var err error - statusTime, err = mp.GetStatusTime(opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return StatusDetails{}, err - } - - // Return - return StatusDetails{ - Status: status, - StatusBlock: statusBlock, - StatusTime: statusTime, - }, nil + // Data + var wg errgroup.Group + var status rptypes.MinipoolStatus + var statusBlock uint64 + var statusTime time.Time + + // Load data + wg.Go(func() error { + var err error + status, err = mp.GetStatus(opts) + return err + }) + wg.Go(func() error { + var err error + statusBlock, err = mp.GetStatusBlock(opts) + return err + }) + wg.Go(func() error { + var err error + statusTime, err = mp.GetStatusTime(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return StatusDetails{}, err + } + + // Return + return StatusDetails{ + Status: status, + StatusBlock: statusBlock, + StatusTime: statusTime, + }, nil } func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { - status := new(uint8) - if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) - } - return rptypes.MinipoolStatus(*status), nil + status := new(uint8) + if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + } + return rptypes.MinipoolStatus(*status), nil } func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { - statusBlock := new(*big.Int) - if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) - } - return (*statusBlock).Uint64(), nil + statusBlock := new(*big.Int) + if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) + } + return (*statusBlock).Uint64(), nil } func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { - statusTime := new(*big.Int) - if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) - } - return time.Unix((*statusTime).Int64(), 0), nil + statusTime := new(*big.Int) + if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) + } + return time.Unix((*statusTime).Int64(), 0), nil } func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { - finalised := new(bool) - if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { - return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) - } - return *finalised, nil + finalised := new(bool) + if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { + return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) + } + return *finalised, nil } - // Get deposit type func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { - depositType := new(uint8) - if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) - } - return rptypes.MinipoolDeposit(*depositType), nil + depositType := new(uint8) + if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + } + return rptypes.MinipoolDeposit(*depositType), nil } - // Get node details func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { - // Data - var wg errgroup.Group - var address common.Address - var fee float64 - var depositBalance *big.Int - var refundBalance *big.Int - var depositAssigned bool - - // Load data - wg.Go(func() error { - var err error - address, err = mp.GetNodeAddress(opts) - return err - }) - wg.Go(func() error { - var err error - fee, err = mp.GetNodeFee(opts) - return err - }) - wg.Go(func() error { - var err error - depositBalance, err = mp.GetNodeDepositBalance(opts) - return err - }) - wg.Go(func() error { - var err error - refundBalance, err = mp.GetNodeRefundBalance(opts) - return err - }) - wg.Go(func() error { - var err error - depositAssigned, err = mp.GetNodeDepositAssigned(opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return NodeDetails{}, err - } - - // Return - return NodeDetails{ - Address: address, - Fee: fee, - DepositBalance: depositBalance, - RefundBalance: refundBalance, - DepositAssigned: depositAssigned, - }, nil + // Data + var wg errgroup.Group + var address common.Address + var fee float64 + var depositBalance *big.Int + var refundBalance *big.Int + var depositAssigned bool + + // Load data + wg.Go(func() error { + var err error + address, err = mp.GetNodeAddress(opts) + return err + }) + wg.Go(func() error { + var err error + fee, err = mp.GetNodeFee(opts) + return err + }) + wg.Go(func() error { + var err error + depositBalance, err = mp.GetNodeDepositBalance(opts) + return err + }) + wg.Go(func() error { + var err error + refundBalance, err = mp.GetNodeRefundBalance(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetNodeDepositAssigned(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return NodeDetails{}, err + } + + // Return + return NodeDetails{ + Address: address, + Fee: fee, + DepositBalance: depositBalance, + RefundBalance: refundBalance, + DepositAssigned: depositAssigned, + }, nil } func (mp *Minipool) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { - nodeAddress := new(common.Address) - if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) - } - return *nodeAddress, nil + nodeAddress := new(common.Address) + if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) + } + return *nodeAddress, nil } func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { - nodeFee := new(*big.Int) - if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) - } - return eth.WeiToEth(*nodeFee), nil + nodeFee := new(*big.Int) + if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + } + return eth.WeiToEth(*nodeFee), nil } func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { - nodeDepositBalance := new(*big.Int) - if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) - } - return *nodeDepositBalance, nil + nodeDepositBalance := new(*big.Int) + if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) + } + return *nodeDepositBalance, nil } func (mp *Minipool) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { - nodeRefundBalance := new(*big.Int) - if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) - } - return *nodeRefundBalance, nil + nodeRefundBalance := new(*big.Int) + if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) + } + return *nodeRefundBalance, nil } func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { - nodeDepositAssigned := new(bool) - if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) - } - return *nodeDepositAssigned, nil + nodeDepositAssigned := new(bool) + if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) + } + return *nodeDepositAssigned, nil } - // Get user deposit details func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { - // Data - var wg errgroup.Group - var depositBalance *big.Int - var depositAssigned bool - var depositAssignedTime time.Time - - // Load data - wg.Go(func() error { - var err error - depositBalance, err = mp.GetUserDepositBalance(opts) - return err - }) - wg.Go(func() error { - var err error - depositAssigned, err = mp.GetUserDepositAssigned(opts) - return err - }) - wg.Go(func() error { - var err error - depositAssignedTime, err = mp.GetUserDepositAssignedTime(opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return UserDetails{}, err - } - - // Return - return UserDetails{ - DepositBalance: depositBalance, - DepositAssigned: depositAssigned, - DepositAssignedTime: depositAssignedTime, - }, nil + // Data + var wg errgroup.Group + var depositBalance *big.Int + var depositAssigned bool + var depositAssignedTime time.Time + + // Load data + wg.Go(func() error { + var err error + depositBalance, err = mp.GetUserDepositBalance(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetUserDepositAssigned(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssignedTime, err = mp.GetUserDepositAssignedTime(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return UserDetails{}, err + } + + // Return + return UserDetails{ + DepositBalance: depositBalance, + DepositAssigned: depositAssigned, + DepositAssignedTime: depositAssignedTime, + }, nil } func (mp *Minipool) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { - userDepositBalance := new(*big.Int) - if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) - } - return *userDepositBalance, nil + userDepositBalance := new(*big.Int) + if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) + } + return *userDepositBalance, nil } func (mp *Minipool) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { - userDepositAssigned := new(bool) - if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) - } - return *userDepositAssigned, nil + userDepositAssigned := new(bool) + if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) + } + return *userDepositAssigned, nil } func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { - depositAssignedTime := new(*big.Int) - if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) - } - return time.Unix((*depositAssignedTime).Int64(), 0), nil + depositAssignedTime := new(*big.Int) + if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) + } + return time.Unix((*depositAssignedTime).Int64(), 0), nil } - // Estimate the gas of Refund func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "refund") + return mp.Contract.GetTransactionGasInfo(opts, "refund") } - // Refund node ETH from the minipool func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "refund") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "refund") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of DistributeBalance func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } - // Distribute the minipool's ETH balance to the node operator and rETH staking pool. // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "distributeBalance") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "distributeBalance") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of DistributeBalanceAndFinalise func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") } - // Distribute the minipool's ETH balance to the node operator and rETH staking pool, // then finalises the minipool // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of Stake func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } - // Progress the prelaunch minipool to staking func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of Dissolve func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "dissolve") + return mp.Contract.GetTransactionGasInfo(opts, "dissolve") } - // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "dissolve") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "dissolve") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of Close func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "close") + return mp.Contract.GetTransactionGasInfo(opts, "close") } - // Withdraw node balances from the dissolved minipool and close it func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "close") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "close") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of Finalise func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "finalise") + return mp.Contract.GetTransactionGasInfo(opts, "finalise") } - // Finalise a minipool to get the RPL stake back func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "finalise") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "finalise") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of DelegateUpgrade func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") + return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") } - // Upgrade this minipool to the latest network delegate contract func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "delegateUpgrade") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "delegateUpgrade") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of DelegateRollback func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") + return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") } - // Rollback to previous delegate contract func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "delegateRollback") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "delegateRollback") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Estimate the gas of SetUseLatestDelegate func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) + return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) } - // If set to true, will automatically use the latest delegate contract func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil + hash, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Getter for useLatestDelegate setting func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { - setting := new(bool) - if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { - return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return *setting, nil + setting := new(bool) + if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { + return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *setting, nil } - // Returns the address of the minipool's stored delegate func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { - address := new(common.Address) - if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return *address, nil + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil } - // Returns the address of the minipool's previous delegate (or address(0) if not set) func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { - address := new(common.Address) - if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return *address, nil + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil } - // Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { - address := new(common.Address) - if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) - } - return *address, nil + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil } - // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { - nodeAmount := new(*big.Int) - if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool node portion: %w", err) - } - return *nodeAmount, nil + nodeAmount := new(*big.Int) + if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool node portion: %w", err) + } + return *nodeAmount, nil } - // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { - userAmount := new(*big.Int) - if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool user portion: %w", err) - } - return *userAmount, nil + userAmount := new(*big.Int) + if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool user portion: %w", err) + } + return *userAmount, nil } - // Estimate the gas requiired to vote to scrub a minipool func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") + return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } - // Vote to scrub a minipool -func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "voteScrub") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) - } - return hash, nil +func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := mp.Contract.Transact(opts, "voteScrub") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) + } + return hash, nil } - // Get the data from this minipool's MinipoolPrestaked event func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { - addressFilter := []common.Address{ mp.Address } - topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} - - // Grab the latest block number - currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) - if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) - } - - // Grab the lowest block number worth querying from (should never have to go back this far in practice) - deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) - fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) - if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) - } - - fromBlock := fromBlockBig.Uint64() - var log types.Log - found := false - - // Backwards scan through blocks to find the event - for i := currentBlock; i >= fromBlock; i -= EventScanInterval { - from := i - EventScanInterval + 1 - if from < fromBlock { from = fromBlock } - - fromBig := big.NewInt(0).SetUint64(from) - toBig := big.NewInt(0).SetUint64(i) - - logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) - if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) - } - - if len(logs) > 0 { - log = logs[0] - found = true - break - } - } - - if !found { - // This should never happen - return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) - } - - // Decode the event - prestakeEvent := new(minipoolPrestakeEvent) - mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) - if err != nil { - return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) - } - - // Convert the event to a more useable struct - prestakeData := PrestakeData { - Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), - WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), - Amount: prestakeEvent.Amount, - Signature: rptypes.BytesToValidatorSignature(prestakeEvent.Signature), - DepositDataRoot: prestakeEvent.DepositDataRoot, - Time: time.Unix(prestakeEvent.Time.Int64(), 0), - } - return prestakeData, nil + addressFilter := []common.Address{mp.Address} + topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} + + // Grab the latest block number + currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + } + + // Grab the lowest block number worth querying from (should never have to go back this far in practice) + deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) + fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + } + + fromBlock := fromBlockBig.Uint64() + var log types.Log + found := false + + // Backwards scan through blocks to find the event + for i := currentBlock; i >= fromBlock; i -= EventScanInterval { + from := i - EventScanInterval + 1 + if from < fromBlock { + from = fromBlock + } + + fromBig := big.NewInt(0).SetUint64(from) + toBig := big.NewInt(0).SetUint64(i) + + logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + } + + if len(logs) > 0 { + log = logs[0] + found = true + break + } + } + + if !found { + // This should never happen + return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + } + + // Decode the event + prestakeEvent := new(minipoolPrestakeEvent) + mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + } + + // Convert the event to a more useable struct + prestakeData := PrestakeData{ + Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), + WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), + Amount: prestakeEvent.Amount, + Signature: rptypes.BytesToValidatorSignature(prestakeEvent.Signature), + DepositDataRoot: prestakeEvent.DepositDataRoot, + Time: time.Unix(prestakeEvent.Time.Int64(), 0), + } + return prestakeData, nil } - // Get a minipool contract var rocketMinipoolLock sync.Mutex + func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { - rocketMinipoolLock.Lock() - defer rocketMinipoolLock.Unlock() - return rp.MakeContract("rocketMinipool", minipoolAddress) + rocketMinipoolLock.Lock() + defer rocketMinipoolLock.Unlock() + return rp.MakeContract("rocketMinipool", minipoolAddress) } - - diff --git a/minipool/minipool.go b/minipool/minipool.go index 084ecf2ed..aceca5d5e 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -15,547 +15,534 @@ import ( // Settings const ( - MinipoolPrelaunchBatchSize = 250 - MinipoolAddressBatchSize = 50 - MinipoolDetailsBatchSize = 20 + MinipoolPrelaunchBatchSize = 250 + MinipoolAddressBatchSize = 50 + MinipoolDetailsBatchSize = 20 ) - // Minipool details type MinipoolDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` } - // The counts of minipools per status type MinipoolCountsPerStatus struct { - Initialized *big.Int `abi:"initialisedCount"` - Prelaunch *big.Int `abi:"prelaunchCount"` - Staking *big.Int `abi:"stakingCount"` - Withdrawable *big.Int `abi:"withdrawableCount"` - Dissolved *big.Int `abi:"dissolvedCount"` + Initialized *big.Int `abi:"initialisedCount"` + Prelaunch *big.Int `abi:"prelaunchCount"` + Staking *big.Int `abi:"stakingCount"` + Withdrawable *big.Int `abi:"withdrawableCount"` + Dissolved *big.Int `abi:"dissolvedCount"` } - // Get all minipool details func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { - minipoolAddresses, err := GetMinipoolAddresses(rp, opts) - if err != nil { - return []MinipoolDetails{}, err - } - return loadMinipoolDetails(rp, minipoolAddresses, opts); + minipoolAddresses, err := GetMinipoolAddresses(rp, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts) } - // Get a node's minipool details func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { - minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) - if err != nil { - return []MinipoolDetails{}, err - } - return loadMinipoolDetails(rp, minipoolAddresses, opts); + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts) } - // Load minipool details func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { - // Load minipool details in batches - details := make([]MinipoolDetails, len(minipoolAddresses)) - for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MinipoolDetailsBatchSize - if mei > len(minipoolAddresses) { mei = len(minipoolAddresses) } - - // Load details - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - minipoolAddress := minipoolAddresses[mi] - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) - if err == nil { details[mi] = minipoolDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []MinipoolDetails{}, err - } - - } - - // Return - return details, nil + // Load minipool details in batches + details := make([]MinipoolDetails, len(minipoolAddresses)) + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolDetailsBatchSize + if mei > len(minipoolAddresses) { + mei = len(minipoolAddresses) + } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress := minipoolAddresses[mi] + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) + if err == nil { + details[mi] = minipoolDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MinipoolDetails{}, err + } + + } + + // Return + return details, nil } - // Get all minipool addresses func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - // Get minipool count - minipoolCount, err := GetMinipoolCount(rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Load minipool addresses in batches - addresses := make([]common.Address, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MinipoolAddressBatchSize - if mei > minipoolCount { mei = minipoolCount } - - // Load addresses - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetMinipoolAt(rp, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil + // Get minipool count + minipoolCount, err := GetMinipoolCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load minipool addresses in batches + addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMinipoolAt(rp, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil } - // Get the addresses of all minipools in prelaunch status func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return []common.Address{}, err - } - - // Get the total number of minipools - totalMinipoolsUint, err := GetMinipoolCount(rp, nil) - if err != nil { - return []common.Address{}, err - } - - totalMinipools := int64(totalMinipoolsUint) - addresses := []common.Address{} - limit := big.NewInt(MinipoolPrelaunchBatchSize) - for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { - // Get a batch of addresses - offset := big.NewInt(i) - newAddresses := new([]common.Address) - if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { - return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) - } - addresses = append(addresses, *newAddresses...) - } - - return addresses, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []common.Address{}, err + } + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return []common.Address{}, err + } + + totalMinipools := int64(totalMinipoolsUint) + addresses := []common.Address{} + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of addresses + offset := big.NewInt(i) + newAddresses := new([]common.Address) + if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { + return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + } + addresses = append(addresses, *newAddresses...) + } + + return addresses, nil } - // Get a node's minipool addresses func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { - // Get minipool count - minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) - if err != nil { - return []common.Address{}, err - } - - // Load minipool addresses in batches - addresses := make([]common.Address, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MinipoolAddressBatchSize - if mei > minipoolCount { mei = minipoolCount } - - // Load addresses - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) - if err == nil { addresses[mi] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil + // Get minipool count + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []common.Address{}, err + } + + // Load minipool addresses in batches + addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil } - // Get a node's validating minipool pubkeys func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) { - // Get minipool count - minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts) - if err != nil { - return []rptypes.ValidatorPubkey{}, err - } - - // Load pubkeys in batches - var lock = sync.RWMutex{} - pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) - for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { - - // Get batch start & end index - msi := bsi - mei := bsi + MinipoolAddressBatchSize - if mei > minipoolCount { mei = minipoolCount } - - // Load pubkeys - var wg errgroup.Group - for mi := msi; mi < mei; mi++ { - mi := mi - wg.Go(func() error { - minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) - if err != nil { - return err - } - pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) - if err != nil { - return err - } - lock.Lock() - pubkeys[mi] = pubkey - lock.Unlock() - return nil - }) - } - if err := wg.Wait(); err != nil { - return []rptypes.ValidatorPubkey{}, err - } - - } - - // Return - return pubkeys, nil + // Get minipool count + minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + // Load pubkeys in batches + var lock = sync.RWMutex{} + pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load pubkeys + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) + if err != nil { + return err + } + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) + if err != nil { + return err + } + lock.Lock() + pubkeys[mi] = pubkey + lock.Unlock() + return nil + }) + } + if err := wg.Wait(); err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + } + + // Return + return pubkeys, nil } - // Get a minipool's details func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (MinipoolDetails, error) { - // Data - var wg errgroup.Group - var exists bool - var pubkey rptypes.ValidatorPubkey - - // Load data - wg.Go(func() error { - var err error - exists, err = GetMinipoolExists(rp, minipoolAddress, opts) - return err - }) - wg.Go(func() error { - var err error - pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return MinipoolDetails{}, err - } - - // Return - return MinipoolDetails{ - Address: minipoolAddress, - Exists: exists, - Pubkey: pubkey, - }, nil + // Data + var wg errgroup.Group + var exists bool + var pubkey rptypes.ValidatorPubkey + + // Load data + wg.Go(func() error { + var err error + exists, err = GetMinipoolExists(rp, minipoolAddress, opts) + return err + }) + wg.Go(func() error { + var err error + pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return MinipoolDetails{}, err + } + + // Return + return MinipoolDetails{ + Address: minipoolAddress, + Exists: exists, + Pubkey: pubkey, + }, nil } - // Get the minipool count func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get minipool count: %w", err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil } - // Get the number of finalised minipools in the network func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil } - // Get the number of active minipools in the network func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil } - // Get the minipool count by status func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return MinipoolCountsPerStatus{}, err - } - - // Get the total number of minipools - totalMinipoolsUint, err := GetMinipoolCount(rp, nil) - if err != nil { - return MinipoolCountsPerStatus{}, err - } - - totalMinipools := int64(totalMinipoolsUint) - minipoolCounts := MinipoolCountsPerStatus{ - Initialized: big.NewInt(0), - Prelaunch: big.NewInt(0), - Staking: big.NewInt(0), - Dissolved: big.NewInt(0), - Withdrawable: big.NewInt(0), - } - limit := big.NewInt(MinipoolPrelaunchBatchSize) - for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { - // Get a batch of counts - offset := big.NewInt(i) - newMinipoolCounts := new(MinipoolCountsPerStatus) - if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { - return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) - } - if newMinipoolCounts != nil { - if newMinipoolCounts.Initialized != nil { - minipoolCounts.Initialized.Add(minipoolCounts.Initialized, newMinipoolCounts.Initialized) - } - if newMinipoolCounts.Prelaunch != nil { - minipoolCounts.Prelaunch.Add(minipoolCounts.Prelaunch, newMinipoolCounts.Prelaunch) - } - if newMinipoolCounts.Staking != nil { - minipoolCounts.Staking.Add(minipoolCounts.Staking, newMinipoolCounts.Staking) - } - if newMinipoolCounts.Dissolved != nil { - minipoolCounts.Dissolved.Add(minipoolCounts.Dissolved, newMinipoolCounts.Dissolved) - } - if newMinipoolCounts.Withdrawable != nil { - minipoolCounts.Withdrawable.Add(minipoolCounts.Withdrawable, newMinipoolCounts.Withdrawable) - } - } - } - return minipoolCounts, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + + totalMinipools := int64(totalMinipoolsUint) + minipoolCounts := MinipoolCountsPerStatus{ + Initialized: big.NewInt(0), + Prelaunch: big.NewInt(0), + Staking: big.NewInt(0), + Dissolved: big.NewInt(0), + Withdrawable: big.NewInt(0), + } + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of counts + offset := big.NewInt(i) + newMinipoolCounts := new(MinipoolCountsPerStatus) + if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { + return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + } + if newMinipoolCounts != nil { + if newMinipoolCounts.Initialized != nil { + minipoolCounts.Initialized.Add(minipoolCounts.Initialized, newMinipoolCounts.Initialized) + } + if newMinipoolCounts.Prelaunch != nil { + minipoolCounts.Prelaunch.Add(minipoolCounts.Prelaunch, newMinipoolCounts.Prelaunch) + } + if newMinipoolCounts.Staking != nil { + minipoolCounts.Staking.Add(minipoolCounts.Staking, newMinipoolCounts.Staking) + } + if newMinipoolCounts.Dissolved != nil { + minipoolCounts.Dissolved.Add(minipoolCounts.Dissolved, newMinipoolCounts.Dissolved) + } + if newMinipoolCounts.Withdrawable != nil { + minipoolCounts.Withdrawable.Add(minipoolCounts.Withdrawable, newMinipoolCounts.Withdrawable) + } + } + } + return minipoolCounts, nil } - // Get a minipool address by index func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) - } - return *minipoolAddress, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + } + return *minipoolAddress, nil } - // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil } - // Get the number of minipools owned by a node that are not finalised func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil } - // Get the number of minipools owned by a node that are finalised func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil } - // Get a node's minipool address by index func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) - } - return *minipoolAddress, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil } - // Get a node's validating minipool count func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return 0, err - } - minipoolCount := new(*big.Int) - if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) - } - return (*minipoolCount).Uint64(), nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil } - // Get a node's validating minipool address by index func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) - } - return *minipoolAddress, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil } - // Get a minipool address by validator pubkey func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAddress := new(common.Address) - if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { - return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) - } - return *minipoolAddress, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { + return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) + } + return *minipoolAddress, nil } - // Check whether a minipool exists func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return false, err - } - exists := new(bool) - if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) - } - return *exists, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) + } + return *exists, nil } - // Get a minipool's validator pubkey func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (rptypes.ValidatorPubkey, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return rptypes.ValidatorPubkey{}, err - } - pubkey := new(rptypes.ValidatorPubkey) - if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { - return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) - } - return *pubkey, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return rptypes.ValidatorPubkey{}, err + } + pubkey := new(rptypes.ValidatorPubkey) + if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { + return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) + } + return *pubkey, nil } - // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return []byte{}, err - } - bytecode := new([]byte) - if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) - } - return *bytecode, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []byte{}, err + } + bytecode := new([]byte) + if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + } + return *bytecode, nil } - // Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Hash{}, err - } - withdrawalCredentials := new(common.Hash) - if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { - return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) - } - return *withdrawalCredentials, nil + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Hash{}, err + } + withdrawalCredentials := new(common.Hash) + if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { + return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) + } + return *withdrawalCredentials, nil } - // Get contracts var rocketMinipoolManagerLock sync.Mutex + func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolManagerLock.Lock() - defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") } - diff --git a/minipool/queue.go b/minipool/queue.go index a761c7b19..0a266c7d0 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -1,199 +1,189 @@ package minipool import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" ) - // Minipool queue lengths type QueueLengths struct { - Total uint64 - FullDeposit uint64 - HalfDeposit uint64 - EmptyDeposit uint64 + Total uint64 + FullDeposit uint64 + HalfDeposit uint64 + EmptyDeposit uint64 } - // Minipool queue capacity type QueueCapacity struct { - Total *big.Int - Effective *big.Int - NextMinipool *big.Int + Total *big.Int + Effective *big.Int + NextMinipool *big.Int } - // Get minipool queue lengths func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengths, error) { - // Data - var wg errgroup.Group - var total uint64 - var fullDeposit uint64 - var halfDeposit uint64 - var emptyDeposit uint64 - - // Load data - wg.Go(func() error { - var err error - total, err = GetQueueTotalLength(rp, opts) - return err - }) - wg.Go(func() error { - var err error - fullDeposit, err = GetQueueLength(rp, rptypes.Full, opts) - return err - }) - wg.Go(func() error { - var err error - halfDeposit, err = GetQueueLength(rp, rptypes.Half, opts) - return err - }) - wg.Go(func() error { - var err error - emptyDeposit, err = GetQueueLength(rp, rptypes.Empty, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return QueueLengths{}, err - } - - // Return - return QueueLengths{ - Total: total, - FullDeposit: fullDeposit, - HalfDeposit: halfDeposit, - EmptyDeposit: emptyDeposit, - }, nil + // Data + var wg errgroup.Group + var total uint64 + var fullDeposit uint64 + var halfDeposit uint64 + var emptyDeposit uint64 + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalLength(rp, opts) + return err + }) + wg.Go(func() error { + var err error + fullDeposit, err = GetQueueLength(rp, rptypes.Full, opts) + return err + }) + wg.Go(func() error { + var err error + halfDeposit, err = GetQueueLength(rp, rptypes.Half, opts) + return err + }) + wg.Go(func() error { + var err error + emptyDeposit, err = GetQueueLength(rp, rptypes.Empty, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueLengths{}, err + } + + // Return + return QueueLengths{ + Total: total, + FullDeposit: fullDeposit, + HalfDeposit: halfDeposit, + EmptyDeposit: emptyDeposit, + }, nil } - // Get minipool queue capacity func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapacity, error) { - // Data - var wg errgroup.Group - var total *big.Int - var effective *big.Int - var nextMinipool *big.Int - - // Load data - wg.Go(func() error { - var err error - total, err = GetQueueTotalCapacity(rp, opts) - return err - }) - wg.Go(func() error { - var err error - effective, err = GetQueueEffectiveCapacity(rp, opts) - return err - }) - wg.Go(func() error { - var err error - nextMinipool, err = GetQueueNextCapacity(rp, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return QueueCapacity{}, err - } - - // Return - return QueueCapacity{ - Total: total, - Effective: effective, - NextMinipool: nextMinipool, - }, nil + // Data + var wg errgroup.Group + var total *big.Int + var effective *big.Int + var nextMinipool *big.Int + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalCapacity(rp, opts) + return err + }) + wg.Go(func() error { + var err error + effective, err = GetQueueEffectiveCapacity(rp, opts) + return err + }) + wg.Go(func() error { + var err error + nextMinipool, err = GetQueueNextCapacity(rp, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueCapacity{}, err + } + + // Return + return QueueCapacity{ + Total: total, + Effective: effective, + NextMinipool: nextMinipool, + }, nil } - // Get the total length of the minipool queue func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return 0, err - } - length := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { - return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) - } - return (*length).Uint64(), nil + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { + return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) + } + return (*length).Uint64(), nil } - // Get the length of a single minipool queue func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDeposit, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return 0, err - } - length := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { - return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) - } - return (*length).Uint64(), nil + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { + return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) + } + return (*length).Uint64(), nil } - // Get the total capacity of the minipool queue func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) - } - return *capacity, nil + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + } + return *capacity, nil } - // Get the total effective capacity of the minipool queue (used in node demand calculation) func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) - } - return *capacity, nil + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) + } + return *capacity, nil } - // Get the capacity of the next minipool in the queue func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) - } - return *capacity, nil + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) + } + return *capacity, nil } - // Get contracts var rocketMinipoolQueueLock sync.Mutex + func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolQueueLock.Lock() - defer rocketMinipoolQueueLock.Unlock() - return rp.GetContract("rocketMinipoolQueue") + rocketMinipoolQueueLock.Lock() + defer rocketMinipoolQueueLock.Unlock() + return rp.GetContract("rocketMinipoolQueue") } - diff --git a/minipool/status.go b/minipool/status.go index c8ff63903..912c97916 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -12,33 +12,31 @@ import ( // Estimate the gas of SubmitMinipoolWithdrawable func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketMinipoolStatus.GetTransactionGasInfo(opts, "submitMinipoolWithdrawable", minipoolAddress) + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketMinipoolStatus.GetTransactionGasInfo(opts, "submitMinipoolWithdrawable", minipoolAddress) } - // Submit a minipool withdrawable event func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) - } - return hash, nil + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) + } + return hash, nil } - // Get contracts var rocketMinipoolStatusLock sync.Mutex + func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolStatusLock.Lock() - defer rocketMinipoolStatusLock.Unlock() - return rp.GetContract("rocketMinipoolStatus") + rocketMinipoolStatusLock.Lock() + defer rocketMinipoolStatusLock.Unlock() + return rp.GetContract("rocketMinipoolStatus") } - diff --git a/network/balances.go b/network/balances.go index 934436279..8bb012cd2 100644 --- a/network/balances.go +++ b/network/balances.go @@ -14,117 +14,109 @@ import ( // Get the block number which network balances are current for func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return 0, err - } - balancesBlock := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network balances block: %w", err) - } - return (*balancesBlock).Uint64(), nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return 0, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network balances block: %w", err) + } + return (*balancesBlock).Uint64(), nil } - // Get the current network total ETH balance func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - totalEthBalance := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, totalEthBalance, "getTotalETHBalance"); err != nil { - return nil, fmt.Errorf("Could not get network total ETH balance: %w", err) - } - return *totalEthBalance, nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + totalEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalEthBalance, "getTotalETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network total ETH balance: %w", err) + } + return *totalEthBalance, nil } - // Get the current network staking ETH balance func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - stakingEthBalance := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, stakingEthBalance, "getStakingETHBalance"); err != nil { - return nil, fmt.Errorf("Could not get network staking ETH balance: %w", err) - } - return *stakingEthBalance, nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + stakingEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, stakingEthBalance, "getStakingETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network staking ETH balance: %w", err) + } + return *stakingEthBalance, nil } - // Get the current network total rETH supply func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - totalRethSupply := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, totalRethSupply, "getTotalRETHSupply"); err != nil { - return nil, fmt.Errorf("Could not get network total rETH supply: %w", err) - } - return *totalRethSupply, nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + totalRethSupply := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalRethSupply, "getTotalRETHSupply"); err != nil { + return nil, fmt.Errorf("Could not get network total rETH supply: %w", err) + } + return *totalRethSupply, nil } - // Get the current network ETH utilization rate func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return 0, err - } - ethUtilizationRate := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, ethUtilizationRate, "getETHUtilizationRate"); err != nil { - return 0, fmt.Errorf("Could not get network ETH utilization rate: %w", err) - } - return eth.WeiToEth(*ethUtilizationRate), nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return 0, err + } + ethUtilizationRate := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, ethUtilizationRate, "getETHUtilizationRate"); err != nil { + return 0, fmt.Errorf("Could not get network ETH utilization rate: %w", err) + } + return eth.WeiToEth(*ethUtilizationRate), nil } - // Estimate the gas of SubmitBalances func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) } - // Submit network balances for an epoch func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) - } - return hash, nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) + } + return hash, nil } - // Returns the latest block number that oracles should be reporting balances for func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - latestReportableBlock := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("Could not get latest reportable block: %w", err) - } - return *latestReportableBlock, nil + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil } - // Get contracts var rocketNetworkBalancesLock sync.Mutex + func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkBalancesLock.Lock() - defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances") + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances") } - diff --git a/network/fees.go b/network/fees.go index 94cbe0c5a..60c47b5d7 100644 --- a/network/fees.go +++ b/network/fees.go @@ -1,64 +1,60 @@ package network import ( - "fmt" - "math/big" - "sync" + "fmt" + "math/big" + "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - // Get the current network node demand in ETH func GetNodeDemand(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) - if err != nil { - return nil, err - } - nodeDemand := new(*big.Int) - if err := rocketNetworkFees.Call(opts, nodeDemand, "getNodeDemand"); err != nil { - return nil, fmt.Errorf("Could not get network node demand: %w", err) - } - return *nodeDemand, nil + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return nil, err + } + nodeDemand := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeDemand, "getNodeDemand"); err != nil { + return nil, fmt.Errorf("Could not get network node demand: %w", err) + } + return *nodeDemand, nil } - // Get the current network node commission rate func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) - if err != nil { - return 0, err - } - nodeFee := new(*big.Int) - if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get network node fee: %w", err) - } - return eth.WeiToEth(*nodeFee), nil + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return 0, err + } + nodeFee := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get network node fee: %w", err) + } + return eth.WeiToEth(*nodeFee), nil } - // Get the network node fee for a node demand value func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bind.CallOpts) (float64, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) - if err != nil { - return 0, err - } - nodeFee := new(*big.Int) - if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFeeByDemand", nodeDemand); err != nil { - return 0, fmt.Errorf("Could not get node fee by node demand: %w", err) - } - return eth.WeiToEth(*nodeFee), nil + rocketNetworkFees, err := getRocketNetworkFees(rp) + if err != nil { + return 0, err + } + nodeFee := new(*big.Int) + if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFeeByDemand", nodeDemand); err != nil { + return 0, fmt.Errorf("Could not get node fee by node demand: %w", err) + } + return eth.WeiToEth(*nodeFee), nil } - // Get contracts var rocketNetworkFeesLock sync.Mutex + func getRocketNetworkFees(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkFeesLock.Lock() - defer rocketNetworkFeesLock.Unlock() - return rp.GetContract("rocketNetworkFees") + rocketNetworkFeesLock.Lock() + defer rocketNetworkFeesLock.Unlock() + return rp.GetContract("rocketNetworkFees") } - diff --git a/network/prices.go b/network/prices.go index 8a1c2e47f..490ccf295 100644 --- a/network/prices.go +++ b/network/prices.go @@ -13,89 +13,83 @@ import ( // Get the block number which network prices are current for func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return 0, err - } - pricesBlock := new(*big.Int) - if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network prices block: %w", err) - } - return (*pricesBlock).Uint64(), nil + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return 0, err + } + pricesBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network prices block: %w", err) + } + return (*pricesBlock).Uint64(), nil } - // Get the current network RPL price in ETH func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return nil, err - } - rplPrice := new(*big.Int) - if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { - return nil, fmt.Errorf("Could not get network RPL price: %w", err) - } - return *rplPrice, nil + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + rplPrice := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { + return nil, fmt.Errorf("Could not get network RPL price: %w", err) + } + return *rplPrice, nil } - // Estimate the gas of SubmitPrices func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, effectiveRplStake *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) } - // Submit network prices and total effective RPL stake for an epoch func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRplStake *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) - } - return hash, nil + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) + } + return hash, nil } - // Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return false, err - } - isInConsensus := new(bool) - if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { - return false, fmt.Errorf("Could not get consensus status: %w", err) - } - return *isInConsensus, nil + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return false, err + } + isInConsensus := new(bool) + if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { + return false, fmt.Errorf("Could not get consensus status: %w", err) + } + return *isInConsensus, nil } - // Returns the latest block number that oracles should be reporting prices for func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return nil, err - } - latestReportableBlock := new(*big.Int) - if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("Could not get latest reportable block: %w", err) - } - return *latestReportableBlock, nil + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil } - // Get contracts var rocketNetworkPricesLock sync.Mutex + func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkPricesLock.Lock() - defer rocketNetworkPricesLock.Unlock() - return rp.GetContract("rocketNetworkPrices") + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + return rp.GetContract("rocketNetworkPrices") } - diff --git a/node/deposit.go b/node/deposit.go index 97b987b3d..6bd14abab 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -15,48 +15,45 @@ import ( // Estimate the gas of Deposit func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) } - // Make a node deposit func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) - } - return hash, nil + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) + } + return hash, nil } - // Get the type of a deposit based on the amount func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) - if err != nil { - return rptypes.Empty, err - } - - depositType := new(uint8) - if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { - return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) - } - return rptypes.MinipoolDeposit(*depositType), nil + rocketNodeDeposit, err := getRocketNodeDeposit(rp) + if err != nil { + return rptypes.Empty, err + } + + depositType := new(uint8) + if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { + return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) + } + return rptypes.MinipoolDeposit(*depositType), nil } - // Get contracts var rocketNodeDepositLock sync.Mutex + func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNodeDepositLock.Lock() - defer rocketNodeDepositLock.Unlock() - return rp.GetContract("rocketNodeDeposit") + rocketNodeDepositLock.Lock() + defer rocketNodeDepositLock.Unlock() + return rp.GetContract("rocketNodeDeposit") } - diff --git a/node/node.go b/node/node.go index 978f2e595..3d3eac142 100644 --- a/node/node.go +++ b/node/node.go @@ -24,715 +24,713 @@ import ( // Settings const ( - NodeAddressBatchSize = 50 - NodeDetailsBatchSize = 20 + NodeAddressBatchSize = 50 + NodeDetailsBatchSize = 20 ) - // Node details type NodeDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - WithdrawalAddress common.Address `json:"withdrawalAddress"` - PendingWithdrawalAddress common.Address `json:"pendingWithdrawalAddress"` - TimezoneLocation string `json:"timezoneLocation"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + WithdrawalAddress common.Address `json:"withdrawalAddress"` + PendingWithdrawalAddress common.Address `json:"pendingWithdrawalAddress"` + TimezoneLocation string `json:"timezoneLocation"` } - // Count of nodes belonging to a timezone type TimezoneCount struct { - Timezone string `abi:"timezone"` - Count *big.Int `abi:"count"` + Timezone string `abi:"timezone"` + Count *big.Int `abi:"count"` } // The results of the trusted node participation calculation type TrustedNodeParticipation struct { - StartBlock uint64 - UpdateFrequency uint64 - UpdateCount uint64 - Probability float64 - ExpectedSubmissions float64 - ActualSubmissions map[common.Address]float64 - Participation map[common.Address][]bool + StartBlock uint64 + UpdateFrequency uint64 + UpdateCount uint64 + Probability float64 + ExpectedSubmissions float64 + ActualSubmissions map[common.Address]float64 + Participation map[common.Address][]bool } - // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { - // Get node addresses - nodeAddresses, err := GetNodeAddresses(rp, opts) - if err != nil { - return []NodeDetails{}, err - } - - // Load node details in batches - details := make([]NodeDetails, len(nodeAddresses)) - for bsi := 0; bsi < len(nodeAddresses); bsi += NodeDetailsBatchSize { - - // Get batch start & end index - nsi := bsi - nei := bsi + NodeDetailsBatchSize - if nei > len(nodeAddresses) { nei = len(nodeAddresses) } - - // Load details - var wg errgroup.Group - for ni := nsi; ni < nei; ni++ { - ni := ni - wg.Go(func() error { - nodeAddress := nodeAddresses[ni] - nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) - if err == nil { details[ni] = nodeDetails } - return err - }) - } - if err := wg.Wait(); err != nil { - return []NodeDetails{}, err - } - - } - - // Return - return details, nil + // Get node addresses + nodeAddresses, err := GetNodeAddresses(rp, opts) + if err != nil { + return []NodeDetails{}, err + } + + // Load node details in batches + details := make([]NodeDetails, len(nodeAddresses)) + for bsi := 0; bsi < len(nodeAddresses); bsi += NodeDetailsBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeDetailsBatchSize + if nei > len(nodeAddresses) { + nei = len(nodeAddresses) + } + + // Load details + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + nodeAddress := nodeAddresses[ni] + nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) + if err == nil { + details[ni] = nodeDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []NodeDetails{}, err + } + + } + + // Return + return details, nil } - // Get all node addresses func GetNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - // Get node count - nodeCount, err := GetNodeCount(rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Load node addresses in batches - addresses := make([]common.Address, nodeCount) - for bsi := uint64(0); bsi < nodeCount; bsi += NodeAddressBatchSize { - - // Get batch start & end index - nsi := bsi - nei := bsi + NodeAddressBatchSize - if nei > nodeCount { nei = nodeCount } - - // Load addresses - var wg errgroup.Group - for ni := nsi; ni < nei; ni++ { - ni := ni - wg.Go(func() error { - address, err := GetNodeAt(rp, ni, opts) - if err == nil { addresses[ni] = address } - return err - }) - } - if err := wg.Wait(); err != nil { - return []common.Address{}, err - } - - } - - // Return - return addresses, nil + // Get node count + nodeCount, err := GetNodeCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load node addresses in batches + addresses := make([]common.Address, nodeCount) + for bsi := uint64(0); bsi < nodeCount; bsi += NodeAddressBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeAddressBatchSize + if nei > nodeCount { + nei = nodeCount + } + + // Load addresses + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + address, err := GetNodeAt(rp, ni, opts) + if err == nil { + addresses[ni] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil } - // Get a node's details func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NodeDetails, error) { - // Data - var wg errgroup.Group - var exists bool - var withdrawalAddress common.Address - var pendingWithdrawalAddress common.Address - var timezoneLocation string - - // Load data - wg.Go(func() error { - var err error - exists, err = GetNodeExists(rp, nodeAddress, opts) - return err - }) - wg.Go(func() error { - var err error - withdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) - return err - }) - wg.Go(func() error { - var err error - pendingWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) - return err - }) - wg.Go(func() error { - var err error - timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return NodeDetails{}, err - } - - // Return - return NodeDetails{ - Address: nodeAddress, - Exists: exists, - WithdrawalAddress: withdrawalAddress, - PendingWithdrawalAddress: pendingWithdrawalAddress, - TimezoneLocation: timezoneLocation, - }, nil + // Data + var wg errgroup.Group + var exists bool + var withdrawalAddress common.Address + var pendingWithdrawalAddress common.Address + var timezoneLocation string + + // Load data + wg.Go(func() error { + var err error + exists, err = GetNodeExists(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + withdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + pendingWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return NodeDetails{}, err + } + + // Return + return NodeDetails{ + Address: nodeAddress, + Exists: exists, + WithdrawalAddress: withdrawalAddress, + PendingWithdrawalAddress: pendingWithdrawalAddress, + TimezoneLocation: timezoneLocation, + }, nil } - // Get the number of nodes in the network func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return 0, err - } - nodeCount := new(*big.Int) - if err := rocketNodeManager.Call(opts, nodeCount, "getNodeCount"); err != nil { - return 0, fmt.Errorf("Could not get node count: %w", err) - } - return (*nodeCount).Uint64(), nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + nodeCount := new(*big.Int) + if err := rocketNodeManager.Call(opts, nodeCount, "getNodeCount"); err != nil { + return 0, fmt.Errorf("Could not get node count: %w", err) + } + return (*nodeCount).Uint64(), nil } - // Get a breakdown of the number of nodes per timezone func GetNodeCountPerTimezone(rp *rocketpool.RocketPool, offset, limit *big.Int, opts *bind.CallOpts) ([]TimezoneCount, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return []TimezoneCount{}, err - } - timezoneCounts := new([]TimezoneCount) - if err := rocketNodeManager.Call(opts, timezoneCounts, "getNodeCountPerTimezone", offset, limit); err != nil { - return []TimezoneCount{}, fmt.Errorf("Could not get node count: %w", err) - } - return *timezoneCounts, nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return []TimezoneCount{}, err + } + timezoneCounts := new([]TimezoneCount) + if err := rocketNodeManager.Call(opts, timezoneCounts, "getNodeCountPerTimezone", offset, limit); err != nil { + return []TimezoneCount{}, fmt.Errorf("Could not get node count: %w", err) + } + return *timezoneCounts, nil } - // Get a node address by index func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Address{}, err - } - nodeAddress := new(common.Address) - if err := rocketNodeManager.Call(opts, nodeAddress, "getNodeAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %d address: %w", index, err) - } - return *nodeAddress, nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Address{}, err + } + nodeAddress := new(common.Address) + if err := rocketNodeManager.Call(opts, nodeAddress, "getNodeAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %d address: %w", index, err) + } + return *nodeAddress, nil } - // Check whether a node exists func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return false, err - } - exists := new(bool) - if err := rocketNodeManager.Call(opts, exists, "getNodeExists", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %s exists status: %w", nodeAddress.Hex(), err) - } - return *exists, nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketNodeManager.Call(opts, exists, "getNodeExists", nodeAddress); err != nil { + return false, fmt.Errorf("Could not get node %s exists status: %w", nodeAddress.Hex(), err) + } + return *exists, nil } - // Get a node's timezone location func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return "", err - } - timezoneLocation := new(string) - if err := rocketNodeManager.Call(opts, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { - return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) - } - return strings.Sanitize(*timezoneLocation), nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return "", err + } + timezoneLocation := new(string) + if err := rocketNodeManager.Call(opts, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { + return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) + } + return strings.Sanitize(*timezoneLocation), nil } - // Estimate the gas of RegisterNode func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - _, err = time.LoadLocation(timezoneLocation) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) - } - return rocketNodeManager.GetTransactionGasInfo(opts, "registerNode", timezoneLocation) + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } + return rocketNodeManager.GetTransactionGasInfo(opts, "registerNode", timezoneLocation) } - // Register a node func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Hash{}, err - } - _, err = time.LoadLocation(timezoneLocation) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) - } - hash, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not register node: %w", err) - } - return hash, nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Hash{}, err + } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } + hash, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not register node: %w", err) + } + return hash, nil } - // Estimate the gas of SetTimezoneLocation func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - _, err = time.LoadLocation(timezoneLocation) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) - } - return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } + return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) } - // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) - if err != nil { - return common.Hash{}, err - } - _, err = time.LoadLocation(timezoneLocation) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) - } - hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) - } - return hash, nil + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Hash{}, err + } + _, err = time.LoadLocation(timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + } + hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) + } + return hash, nil } // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { - // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkPrices.Address} - topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - timestamps := make([]uint64, len(logs)) - for i, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketNetworkPrices.ABI.Events["PricesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - timestamps[i] = values["block"].(*big.Int).Uint64() - } - return ×tamps, nil + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkPrices.ABI.Events["PricesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil } // Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { - // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkBalances.Address} - topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - timestamps := make([]uint64, len(logs)) - for i, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketNetworkBalances.ABI.Events["BalancesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - timestamps[i] = values["block"].(*big.Int).Uint64() - } - return ×tamps, nil + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkBalances.ABI.Events["BalancesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil } // Returns the most recent block number that the number of trusted nodes changed since fromBlock func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) (uint64, error) { - // Get contracts - rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) - if err != nil { - return 0, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} - topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return 0, err - } - - for i := range(logs) { - log := logs[len(logs) - i - 1] - if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { - values := make(map[string]interface{}) - // Decode the event - if rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return 0, err - } - if values["success"].(bool) { - return log.BlockNumber, nil - } - } else { - return log.BlockNumber, nil - } - } - return fromBlock, nil + // Get contracts + rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + if err != nil { + return 0, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} + topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return 0, err + } + + for i := range logs { + log := logs[len(logs)-i-1] + if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { + values := make(map[string]interface{}) + // Decode the event + if rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return 0, err + } + if values["success"].(bool) { + return log.BlockNumber, nil + } + } else { + return log.BlockNumber, nil + } + } + return fromBlock, nil } // Calculates the participation rate of every trusted node on price submission since the last block that member count changed func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber / updatePricesFrequency - 50) * updatePricesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock / updatePricesFrequency + 1) * updatePricesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount) / 2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber - startBlock) / updatePricesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range(members) { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if (intervalsPassed > 0) { - blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block % updatePricesFrequency == 0 { - index := block / updatePricesFrequency - startBlock / updatePricesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if (intervalsPassed > 0){ - probability = 1 - mathext.GammaIncReg(float64(len(members) - 1) / 2, chi/2) - } - // Construct return value - participation := TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updatePricesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber/updatePricesFrequency - 50) * updatePricesFrequency + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) + if err != nil { + return nil, err + } + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock/updatePricesFrequency + 1) * updatePricesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount)/2 + 1) + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber-startBlock)/updatePricesFrequency + 1 + } + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range members { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if intervalsPassed > 0 { + blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize) + if err != nil { + return nil, err + } + actual = len(*blocks) + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block%updatePricesFrequency == 0 { + index := block/updatePricesFrequency - startBlock/updatePricesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if intervalsPassed > 0 { + probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) + } + // Construct return value + participation := TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updatePricesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil } // Calculates the participation rate of every trusted node on balance submission since the last block that member count changed func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber / updateBalancesFrequency - 50) * updateBalancesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock / updateBalancesFrequency + 1) * updateBalancesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount) / 2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber - startBlock) / updateBalancesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range(members) { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if (intervalsPassed > 0) { - blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block % updateBalancesFrequency == 0 { - index := block / updateBalancesFrequency - startBlock / updateBalancesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if (intervalsPassed > 0){ - probability = 1 - mathext.GammaIncReg(float64(len(members) - 1) / 2, chi/2) - } - // Construct return value - participation := TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updateBalancesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber/updateBalancesFrequency - 50) * updateBalancesFrequency + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) + if err != nil { + return nil, err + } + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock/updateBalancesFrequency + 1) * updateBalancesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount)/2 + 1) + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber-startBlock)/updateBalancesFrequency + 1 + } + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range members { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if intervalsPassed > 0 { + blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize) + if err != nil { + return nil, err + } + actual = len(*blocks) + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block%updateBalancesFrequency == 0 { + index := block/updateBalancesFrequency - startBlock/updateBalancesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if intervalsPassed > 0 { + probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) + } + // Construct return value + participation := TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updateBalancesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil } // Returns an array of members who submitted a balance since fromBlock func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { - // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkBalances.Address} - topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - results := make([]common.Address, len(logs)) - for i, log := range logs { - // Topic 0 is the event, topic 1 is the "from" address - address := common.BytesToAddress(log.Topics[1].Bytes()) - results[i] = address - } - return results, nil + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil } // Returns a mapping of members and whether they have submitted balances this interval or not func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency - submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range(members) { - participationTable[member.Address] = false - } - for _, submission := range(submissions) { - participationTable[submission] = true - } - return participationTable, nil + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency + submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range members { + participationTable[member.Address] = false + } + for _, submission := range submissions { + participationTable[submission] = true + } + return participationTable, nil } // Returns an array of members who submitted prices since fromBlock func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { - // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkPrices.Address} - topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - results := make([]common.Address, len(logs)) - for i, log := range logs { - // Topic 0 is the event, topic 1 is the "from" address - address := common.BytesToAddress(log.Topics[1].Bytes()) - results[i] = address - } - return results, nil + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil } // Returns a mapping of members and whether they have submitted prices this interval or not func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency - submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range(members) { - participationTable[member.Address] = false - } - for _, submission := range(submissions) { - participationTable[submission] = true - } - return participationTable, nil + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency + submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range members { + participationTable[member.Address] = false + } + for _, submission := range submissions { + participationTable[submission] = true + } + return participationTable, nil } // Get contracts var rocketNodeManagerLock sync.Mutex + func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNodeManagerLock.Lock() - defer rocketNodeManagerLock.Unlock() - return rp.GetContract("rocketNodeManager") + rocketNodeManagerLock.Lock() + defer rocketNodeManagerLock.Unlock() + return rp.GetContract("rocketNodeManager") } var rocketNetworkPricesLock sync.Mutex + func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkPricesLock.Lock() - defer rocketNetworkPricesLock.Unlock() - return rp.GetContract("rocketNetworkPrices") + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + return rp.GetContract("rocketNetworkPrices") } var rocketNetworkBalancesLock sync.Mutex + func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNetworkBalancesLock.Lock() - defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances") + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances") } var rocketDAONodeTrustedActionsLock sync.Mutex + func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketDAONodeTrustedActionsLock.Lock() - defer rocketDAONodeTrustedActionsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedActions") + rocketDAONodeTrustedActionsLock.Lock() + defer rocketDAONodeTrustedActionsLock.Unlock() + return rp.GetContract("rocketDAONodeTrustedActions") } diff --git a/node/staking.go b/node/staking.go index fd393b1cb..ee1e15d1f 100644 --- a/node/staking.go +++ b/node/staking.go @@ -13,183 +13,170 @@ import ( // Get the total RPL staked in the network func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - totalRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) - } - return *totalRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) + } + return *totalRplStake, nil } - // Get the effective RPL staked in the network func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - totalEffectiveRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) - } - return *totalEffectiveRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil } - // Get a node's RPL stake func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - nodeRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) - } - return *nodeRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) + } + return *nodeRplStake, nil } - // Get a node's effective RPL stake func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - nodeEffectiveRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStake, "getNodeEffectiveRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) - } - return *nodeEffectiveRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStake, "getNodeEffectiveRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) + } + return *nodeEffectiveRplStake, nil } - // Get a node's minimum RPL stake to collateralize their minipools func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - nodeMinimumRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) - } - return *nodeMinimumRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeMinimumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) + } + return *nodeMinimumRplStake, nil } - // Get a node's maximum RPL stake to collateralize their minipools func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - nodeMaximumRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) - } - return *nodeMaximumRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + nodeMaximumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) + } + return *nodeMaximumRplStake, nil } - // Get the time a node last staked RPL func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return 0, err - } - nodeRplStakedTime := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) - } - return (*nodeRplStakedTime).Uint64(), nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return 0, err + } + nodeRplStakedTime := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) + } + return (*nodeRplStakedTime).Uint64(), nil } - // Get a node's minipool limit based on RPL stake func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return 0, err - } - minipoolLimit := new(*big.Int) - if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node minipool limit: %w", err) - } - return (*minipoolLimit).Uint64(), nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return 0, err + } + minipoolLimit := new(*big.Int) + if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node minipool limit: %w", err) + } + return (*minipoolLimit).Uint64(), nil } - // Estimate the gas of Stake func EstimateStakeGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNodeStaking.GetTransactionGasInfo(opts, "stakeRPL", rplAmount) + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "stakeRPL", rplAmount) } - // Stake RPL func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) - } - return hash, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) + } + return hash, nil } - // Estimate the gas of WithdrawRPL func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", rplAmount) + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", rplAmount) } - // Withdraw staked RPL func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) - } - return hash, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) + } + return hash, nil } - // Calculate total effective RPL stake func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, rplPrice *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) - if err != nil { - return nil, err - } - totalEffectiveRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { - return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) - } - return *totalEffectiveRplStake, nil + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { + return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil } - // Get contracts var rocketNodeStakingLock sync.Mutex + func getRocketNodeStaking(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketNodeStakingLock.Lock() - defer rocketNodeStakingLock.Unlock() - return rp.GetContract("rocketNodeStaking") + rocketNodeStakingLock.Lock() + defer rocketNodeStakingLock.Unlock() + return rp.GetContract("rocketNodeStaking") } - diff --git a/rewards/node.go b/rewards/node.go index 6f7d2c244..7758bf666 100644 --- a/rewards/node.go +++ b/rewards/node.go @@ -14,117 +14,111 @@ import ( // Get whether node reward claims are enabled func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return false, err - } - return getEnabled(rocketClaimNode, "node", opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return false, err + } + return getEnabled(rocketClaimNode, "node", opts) } - // Get whether a node rewards claimer can claim func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return false, err - } - return getClaimPossible(rocketClaimNode, "node", claimerAddress, opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return false, err + } + return getClaimPossible(rocketClaimNode, "node", claimerAddress, opts) } - // Get the percentage of rewards available for a node rewards claimer func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return 0, err - } - return getClaimRewardsPerc(rocketClaimNode, "node", claimerAddress, opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return 0, err + } + return getClaimRewardsPerc(rocketClaimNode, "node", claimerAddress, opts) } - // Get the total amount of rewards available for a node rewards claimer func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return nil, err - } - return getClaimRewardsAmount(rocketClaimNode, "node", claimerAddress, opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + return getClaimRewardsAmount(rocketClaimNode, "node", claimerAddress, opts) } // Estimate the gas of ClaimNodeRewards func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateClaimGas(rocketClaimNode, opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateClaimGas(rocketClaimNode, opts) } - // Claim node rewards func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return common.Hash{}, err - } - return claim(rocketClaimNode, "node", opts) + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return common.Hash{}, err + } + return claim(rocketClaimNode, "node", opts) } // Filters through token claim events and sums the total amount claimed by claimerAddress func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Get contracts + // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return nil, err - } - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketRewardsPool.Address} - // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) - if err != nil { - return nil, err - } - - // Iterate over the logs and sum the amount - sum := big.NewInt(0) - for _, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - // Add the amount argument to our sum - amount := values["amount"].(*big.Int) - sum.Add(sum, amount) - } - // Return the result - return sum, nil + return nil, err + } + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil } - // Get the time that the user registered as a claimer func GetNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts) + return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts) } - // Get the total rewards claimed for this claiming contract this interval func GetNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - return getClaimingContractTotalClaimed(rp, "rocketClaimNode", opts) + return getClaimingContractTotalClaimed(rp, "rocketClaimNode", opts) } // Get contracts var rocketClaimNodeLock sync.Mutex + func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketClaimNodeLock.Lock() - defer rocketClaimNodeLock.Unlock() - return rp.GetContract("rocketClaimNode") + rocketClaimNodeLock.Lock() + defer rocketClaimNodeLock.Unlock() + return rp.GetContract("rocketClaimNode") } - diff --git a/rewards/rewards.go b/rewards/rewards.go index 38c9455cb..3d75d0d7d 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -15,60 +15,55 @@ import ( // Get whether a claims contract is enabled func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { - enabled := new(bool) - if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { - return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) - } - return *enabled, nil + enabled := new(bool) + if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { + return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) + } + return *enabled, nil } - // Get whether a claimer can make a claim // Use to check whether a claimer is able to make claims at all func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - claimPossible := new(bool) - if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { - return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return *claimPossible, nil + claimPossible := new(bool) + if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { + return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimPossible, nil } - // Get the percentage of rewards available to a claimer func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - claimRewardsPerc := new(*big.Int) - if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { - return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return eth.WeiToEth(*claimRewardsPerc), nil + claimRewardsPerc := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { + return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return eth.WeiToEth(*claimRewardsPerc), nil } - // Get the total amount of rewards available to a claimer // Use to check whether a claimer is able to make a claim for the current interval (returns zero if unable) func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - claimRewardsAmount := new(*big.Int) - if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { - return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return *claimRewardsAmount, nil + claimRewardsAmount := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { + return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimRewardsAmount, nil } - // Get the time that the user registered as a claimer func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return time.Time{}, err - } - claimTime := new(*big.Int) - if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) - } - return time.Unix((*claimTime).Int64(), 0), nil + return time.Time{}, err + } + claimTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { + return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) + } + return time.Unix((*claimTime).Int64(), 0), nil } - // Get the total amount claimed in the current interval by the given claiming contract func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) @@ -82,83 +77,77 @@ func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract s return *totalClaimed, nil } - // Estimate the gas of claim func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return claimsContract.GetTransactionGasInfo(opts, "claim") + return claimsContract.GetTransactionGasInfo(opts, "claim") } - // Claim rewards func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := claimsContract.Transact(opts, "claim") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) - } - return hash, nil + hash, err := claimsContract.Transact(opts, "claim") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) + } + return hash, nil } - // Get the timestamp that the current rewards interval started func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return time.Time{}, err - } - unixTime := new(*big.Int) - if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { - return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) - } - return time.Unix(int64((*unixTime).Uint64()), 0), nil + return time.Time{}, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { + return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + } + return time.Unix(int64((*unixTime).Uint64()), 0), nil } - // Get the number of seconds in a claim interval func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err - } - unixTime := new(*big.Int) - if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get claim interval time: %w", err) - } - return time.Duration((*unixTime).Int64()) * time.Second, nil + return 0, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { + return 0, fmt.Errorf("Could not get claim interval time: %w", err) + } + return time.Duration((*unixTime).Int64()) * time.Second, nil } - // Get the percent of checkpoint rewards that goes to node operators func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err - } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) - } - return eth.WeiToEth(*perc), nil + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil } - // Get the percent of checkpoint rewards that goes to ODAO members func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err - } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) - } - return eth.WeiToEth(*perc), nil + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil } - // Get contracts var rocketRewardsPoolLock sync.Mutex + func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketRewardsPoolLock.Lock() - defer rocketRewardsPoolLock.Unlock() - return rp.GetContract("rocketRewardsPool") + rocketRewardsPoolLock.Lock() + defer rocketRewardsPoolLock.Unlock() + return rp.GetContract("rocketRewardsPool") } diff --git a/rewards/trusted-node.go b/rewards/trusted-node.go index bf9b94b51..11c52b7b6 100644 --- a/rewards/trusted-node.go +++ b/rewards/trusted-node.go @@ -14,120 +14,111 @@ import ( // Get whether trusted node reward claims are enabled func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return false, err - } - return getEnabled(rocketClaimTrustedNode, "trusted node", opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return false, err + } + return getEnabled(rocketClaimTrustedNode, "trusted node", opts) } - // Get whether a trusted node rewards claimer can claim func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return false, err - } - return getClaimPossible(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return false, err + } + return getClaimPossible(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) } - // Get the percentage of rewards available for a trusted node rewards claimer func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return 0, err - } - return getClaimRewardsPerc(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return 0, err + } + return getClaimRewardsPerc(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) } - // Get the total amount of rewards available for a trusted node rewards claimer func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return nil, err - } - return getClaimRewardsAmount(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + return getClaimRewardsAmount(rocketClaimTrustedNode, "trusted node", claimerAddress, opts) } - // Estimate the gas of ClaimTrustedNodeRewards func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateClaimGas(rocketClaimTrustedNode, opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateClaimGas(rocketClaimTrustedNode, opts) } - // Claim trusted node rewards func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return common.Hash{}, err - } - return claim(rocketClaimTrustedNode, "trusted node", opts) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return common.Hash{}, err + } + return claim(rocketClaimTrustedNode, "trusted node", opts) } - // Filters through token claim events and sums the total amount claimed by claimerAddress func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) - if err != nil { - return nil, err - } - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketRewardsPool.Address} - // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) - if err != nil { - return nil, err - } - - // Iterate over the logs and sum the amount - sum := big.NewInt(0) - for _, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - // Add the amount argument to our sum - amount := values["amount"].(*big.Int) - sum.Add(sum, amount) - } - // Return the result - return sum, nil + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil } - // Get the time that the user registered as a claimer func GetTrustedNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts) + return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts) } - // Get the total rewards claimed for this claiming contract this interval func GetTrustedNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - return getClaimingContractTotalClaimed(rp, "rocketClaimTrustedNode", opts) + return getClaimingContractTotalClaimed(rp, "rocketClaimTrustedNode", opts) } - // Get contracts var rocketClaimTrustedNodeLock sync.Mutex + func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketClaimTrustedNodeLock.Lock() - defer rocketClaimTrustedNodeLock.Unlock() - return rp.GetContract("rocketClaimTrustedNode") + rocketClaimTrustedNodeLock.Lock() + defer rocketClaimTrustedNodeLock.Unlock() + return rp.GetContract("rocketClaimTrustedNode") } - diff --git a/rocketpool/abi.go b/rocketpool/abi.go index d9456ee78..e8d8340fa 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -1,63 +1,60 @@ package rocketpool import ( - "bytes" - "compress/zlib" - "encoding/base64" - "fmt" - "github.com/ethereum/go-ethereum/accounts/abi" + "bytes" + "compress/zlib" + "encoding/base64" + "fmt" + "github.com/ethereum/go-ethereum/accounts/abi" ) - // Decode, decompress and parse a zlib-compressed, base64-encoded ABI func DecodeAbi(abiEncoded string) (*abi.ABI, error) { - // base64 decode - abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) - if err != nil { - return nil, fmt.Errorf("Could not decode base64 data: %w", err) - } - - // zlib decompress - byteReader := bytes.NewReader(abiCompressed) - zlibReader, err := zlib.NewReader(byteReader) - if err != nil { - return nil, fmt.Errorf("Could not decompress zlib data: %w", err) - } - defer func() { - _ = zlibReader.Close() - }() - - // Parse ABI - abiParsed, err := abi.JSON(zlibReader) - if err != nil { - return nil, fmt.Errorf("Could not parse JSON: %w", err) - } - - // Return - return &abiParsed, nil + // base64 decode + abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode base64 data: %w", err) + } + + // zlib decompress + byteReader := bytes.NewReader(abiCompressed) + zlibReader, err := zlib.NewReader(byteReader) + if err != nil { + return nil, fmt.Errorf("Could not decompress zlib data: %w", err) + } + defer func() { + _ = zlibReader.Close() + }() + + // Parse ABI + abiParsed, err := abi.JSON(zlibReader) + if err != nil { + return nil, fmt.Errorf("Could not parse JSON: %w", err) + } + + // Return + return &abiParsed, nil } - // zlib-compress and base64-encode an ABI JSON string func EncodeAbiStr(abiStr string) (string, error) { - // zlib compress - var abiCompressed bytes.Buffer - zlibWriter := zlib.NewWriter(&abiCompressed) - if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) - } - if err := zlibWriter.Flush(); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) - } - if err := zlibWriter.Close(); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) - } - - // base64 encode & return - return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()), nil + // zlib compress + var abiCompressed bytes.Buffer + zlibWriter := zlib.NewWriter(&abiCompressed) + if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } + if err := zlibWriter.Flush(); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } + if err := zlibWriter.Close(); err != nil { + return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + } + + // base64 encode & return + return base64.StdEncoding.EncodeToString(abiCompressed.Bytes()), nil } - diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 976241efc..85fdbbdad 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -18,213 +18,206 @@ import ( // Transaction settings const ( - GasLimitMultiplier float64 = 1.5 - MaxGasLimit = 12000000 + GasLimitMultiplier float64 = 1.5 + MaxGasLimit = 12000000 ) - // Contract type wraps go-ethereum bound contract type Contract struct { - Contract *bind.BoundContract - Address *common.Address - ABI *abi.ABI - Client *client.EthClientProxy + Contract *bind.BoundContract + Address *common.Address + ABI *abi.ABI + Client *client.EthClientProxy } - // Response for gas limits from network and from user request type GasInfo struct { - EstGasLimit uint64 `json:"estGasLimit"` - SafeGasLimit uint64 `json:"safeGasLimit"` + EstGasLimit uint64 `json:"estGasLimit"` + SafeGasLimit uint64 `json:"safeGasLimit"` } - // Call a contract method func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - results := make([]interface{}, 1) - results[0] = result - return c.Contract.Call(opts, &results, method, params...) + results := make([]interface{}, 1) + results[0] = result + return c.Contract.Call(opts, &results, method, params...) } - // Get Gas Limit for transaction func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, params ...interface{}) (GasInfo, error) { - response := GasInfo{} + response := GasInfo{} - // Pack transaction Info - input, err := c.ABI.Pack(method, params...) - if err != nil { - return response, fmt.Errorf("Error getting transaction gas info: Could not encode input data: %w", err) - } + // Pack transaction Info + input, err := c.ABI.Pack(method, params...) + if err != nil { + return response, fmt.Errorf("Error getting transaction gas info: Could not encode input data: %w", err) + } - // Estimate gas limit - estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, input) + // Estimate gas limit + estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, input) - if err != nil { - return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) - } - response.EstGasLimit = estGasLimit - response.SafeGasLimit = safeGasLimit + if err != nil { + return response, fmt.Errorf("Error getting transaction gas info: could not estimate gas limit: %w", err) + } + response.EstGasLimit = estGasLimit + response.SafeGasLimit = safeGasLimit - return response, err + return response, err } - // Transact on a contract method and wait for a receipt func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (common.Hash, error) { - // Estimate gas limit - if opts.GasLimit == 0 { - input, err := c.ABI.Pack(method, params...) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not encode input data: %w", err) - } - _, safeGasLimit, err := c.estimateGasLimit(opts, input) - if err != nil { - return common.Hash{}, err - } - opts.GasLimit = safeGasLimit - } - - // Send transaction - tx, err := c.Contract.Transact(opts, method, params...) - if err != nil { - return common.Hash{}, err - } - - return tx.Hash(), nil + // Estimate gas limit + if opts.GasLimit == 0 { + input, err := c.ABI.Pack(method, params...) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not encode input data: %w", err) + } + _, safeGasLimit, err := c.estimateGasLimit(opts, input) + if err != nil { + return common.Hash{}, err + } + opts.GasLimit = safeGasLimit + } + + // Send transaction + tx, err := c.Contract.Transact(opts, method, params...) + if err != nil { + return common.Hash{}, err + } + + return tx.Hash(), nil } - // Get gas limit for a transfer call func (c *Contract) GetTransferGasInfo(opts *bind.TransactOpts) (GasInfo, error) { - response := GasInfo {} + response := GasInfo{} - // Estimate gas limit - estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) - if err != nil { - return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas limit: %w", err) - } - response.EstGasLimit = estGasLimit - response.SafeGasLimit = safeGasLimit + // Estimate gas limit + estGasLimit, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) + if err != nil { + return response, fmt.Errorf("Error getting transfer gas info: could not estimate gas limit: %w", err) + } + response.EstGasLimit = estGasLimit + response.SafeGasLimit = safeGasLimit - return response, nil + return response, nil } - // Transfer ETH to a contract and wait for a receipt func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { - // Estimate gas limit - if opts.GasLimit == 0 { - _, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) - if err != nil { - return common.Hash{}, err - } - opts.GasLimit = safeGasLimit - } + // Estimate gas limit + if opts.GasLimit == 0 { + _, safeGasLimit, err := c.estimateGasLimit(opts, []byte{}) + if err != nil { + return common.Hash{}, err + } + opts.GasLimit = safeGasLimit + } - // Send transaction - tx, err := c.Contract.Transfer(opts) - if err != nil { - return common.Hash{}, err - } + // Send transaction + tx, err := c.Contract.Transfer(opts) + if err != nil { + return common.Hash{}, err + } - return tx.Hash(), nil + return tx.Hash(), nil } - // Estimate the expected and safe gas limits for a contract transaction func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint64, uint64, error) { - // Estimate gas limit - gasLimit, err := c.Client.EstimateGas(context.Background(), ethereum.CallMsg{ - From: opts.From, - To: c.Address, - GasPrice: big.NewInt(0), // use 0 gwei for simulation - Value: opts.Value, - Data: input, - }) - - if err != nil { - return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) - } - - // Pad and return gas limit - safeGasLimit := uint64(float64(gasLimit) * GasLimitMultiplier) - if gasLimit > MaxGasLimit { gasLimit = MaxGasLimit } - if safeGasLimit > MaxGasLimit { safeGasLimit = MaxGasLimit } - return gasLimit, safeGasLimit, nil + // Estimate gas limit + gasLimit, err := c.Client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: c.Address, + GasPrice: big.NewInt(0), // use 0 gwei for simulation + Value: opts.Value, + Data: input, + }) + + if err != nil { + return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) + } + + // Pad and return gas limit + safeGasLimit := uint64(float64(gasLimit) * GasLimitMultiplier) + if gasLimit > MaxGasLimit { + gasLimit = MaxGasLimit + } + if safeGasLimit > MaxGasLimit { + safeGasLimit = MaxGasLimit + } + return gasLimit, safeGasLimit, nil } - // Wait for a transaction to be mined and get a tx receipt func (c *Contract) getTransactionReceipt(tx *types.Transaction) (*types.Receipt, error) { - // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) - if err != nil { - return nil, err - } + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), c.Client, tx) + if err != nil { + return nil, err + } - // Check transaction status - if txReceipt.Status == 0 { - return txReceipt, errors.New("Transaction failed with status 0") - } + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } - // Return - return txReceipt, nil + // Return + return txReceipt, nil } - // Get contract events from a transaction // eventPrototype must be an event struct type // Returns a slice of untyped values; assert returned events to event struct type func (c *Contract) GetTransactionEvents(txReceipt *types.Receipt, eventName string, eventPrototype interface{}) ([]interface{}, error) { - // Get event type - eventType := reflect.TypeOf(eventPrototype) - if eventType.Kind() != reflect.Struct { - return nil, errors.New("Invalid event type") - } + // Get event type + eventType := reflect.TypeOf(eventPrototype) + if eventType.Kind() != reflect.Struct { + return nil, errors.New("Invalid event type") + } - // Get ABI event - abiEvent, ok := c.ABI.Events[eventName] - if !ok { - return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) - } + // Get ABI event + abiEvent, ok := c.ABI.Events[eventName] + if !ok { + return nil, fmt.Errorf("Event '%s' does not exist on contract", eventName) + } - // Process transaction receipt logs - events := make([]interface{}, 0) - for _, log := range txReceipt.Logs { + // Process transaction receipt logs + events := make([]interface{}, 0) + for _, log := range txReceipt.Logs { - // Check log address matches contract address - if !bytes.Equal(log.Address.Bytes(), c.Address.Bytes()) { - continue - } + // Check log address matches contract address + if !bytes.Equal(log.Address.Bytes(), c.Address.Bytes()) { + continue + } - // Check log first topic matches event ID - if len(log.Topics) == 0 || !bytes.Equal(log.Topics[0].Bytes(), abiEvent.ID.Bytes()) { - continue - } + // Check log first topic matches event ID + if len(log.Topics) == 0 || !bytes.Equal(log.Topics[0].Bytes(), abiEvent.ID.Bytes()) { + continue + } - // Unpack event - event := reflect.New(eventType) - if err := c.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { - return nil, fmt.Errorf("Could not unpack event data: %w", err) - } - events = append(events, reflect.Indirect(event).Interface()) + // Unpack event + event := reflect.New(eventType) + if err := c.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { + return nil, fmt.Errorf("Could not unpack event data: %w", err) + } + events = append(events, reflect.Indirect(event).Interface()) - } + } - // Return events - return events, nil + // Return events + return events, nil } - diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 35b43c0f4..55f43979e 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -19,338 +19,333 @@ import ( // Cache settings const CacheTTL = 300 // 5 minutes - // Cached data types type cachedAddress struct { - address *common.Address - time int64 + address *common.Address + time int64 } type cachedABI struct { - abi *abi.ABI - time int64 + abi *abi.ABI + time int64 } type cachedContract struct { - contract *Contract - time int64 + contract *Contract + time int64 } - // Rocket Pool contract manager type RocketPool struct { - Client *client.EthClientProxy - RocketStorage *contracts.RocketStorage - RocketStorageContract *Contract - addresses map[string]cachedAddress - abis map[string]cachedABI - contracts map[string]cachedContract - addressesLock sync.RWMutex - abisLock sync.RWMutex - contractsLock sync.RWMutex + Client *client.EthClientProxy + RocketStorage *contracts.RocketStorage + RocketStorageContract *Contract + addresses map[string]cachedAddress + abis map[string]cachedABI + contracts map[string]cachedContract + addressesLock sync.RWMutex + abisLock sync.RWMutex + contractsLock sync.RWMutex } - // Create new contract manager func NewRocketPool(client *client.EthClientProxy, rocketStorageAddress common.Address) (*RocketPool, error) { - // Initialize RocketStorage contract - rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) - if err != nil { - return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) - } + // Initialize RocketStorage contract + rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) + if err != nil { + return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) + } - // Create a Contract for it - rsAbi, err := abi.JSON(strings.NewReader(contracts.RocketStorageABI)) + // Create a Contract for it + rsAbi, err := abi.JSON(strings.NewReader(contracts.RocketStorageABI)) if err != nil { return nil, err } - contract := &Contract{ - Contract: bind.NewBoundContract(rocketStorageAddress, rsAbi, client, client, client), - Address: &rocketStorageAddress, - ABI: &rsAbi, - Client: client, - } - - // Create and return - return &RocketPool{ - Client: client, - RocketStorage: rocketStorage, - RocketStorageContract: contract, - addresses: make(map[string]cachedAddress), - abis: make(map[string]cachedABI), - contracts: make(map[string]cachedContract), - }, nil + contract := &Contract{ + Contract: bind.NewBoundContract(rocketStorageAddress, rsAbi, client, client, client), + Address: &rocketStorageAddress, + ABI: &rsAbi, + Client: client, + } -} + // Create and return + return &RocketPool{ + Client: client, + RocketStorage: rocketStorage, + RocketStorageContract: contract, + addresses: make(map[string]cachedAddress), + abis: make(map[string]cachedABI), + contracts: make(map[string]cachedContract), + }, nil +} // Load Rocket Pool contract addresses func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { - // Check for cached address - if cached, ok := rp.getCachedAddress(contractName); ok { - if (time.Now().Unix() - cached.time <= CacheTTL) { - return cached.address, nil - } else { - rp.deleteCachedAddress(contractName) - } - } - - // Get address - address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) - if err != nil { - return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) - } - - // Cache address - rp.setCachedAddress(contractName, cachedAddress{ - address: &address, - time: time.Now().Unix(), - }) - - // Return - return &address, nil + // Check for cached address + if cached, ok := rp.getCachedAddress(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.address, nil + } else { + rp.deleteCachedAddress(contractName) + } + } + + // Get address + address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) + } + + // Cache address + rp.setCachedAddress(contractName, cachedAddress{ + address: &address, + time: time.Now().Unix(), + }) + + // Return + return &address, nil } func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, error) { - // Data - var wg errgroup.Group - addresses := make([]*common.Address, len(contractNames)) - - // Load addresses - for ci, contractName := range contractNames { - ci, contractName := ci, contractName - wg.Go(func() error { - address, err := rp.GetAddress(contractName) - if err == nil { addresses[ci] = address } - return err - }) - } + // Data + var wg errgroup.Group + addresses := make([]*common.Address, len(contractNames)) + + // Load addresses + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + address, err := rp.GetAddress(contractName) + if err == nil { + addresses[ci] = address + } + return err + }) + } - // Wait for data - if err := wg.Wait(); err != nil { - return nil, err - } + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } - // Return - return addresses, nil + // Return + return addresses, nil } - // Load Rocket Pool contract ABIs func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { - // Check for cached ABI - if cached, ok := rp.getCachedABI(contractName); ok { - if (time.Now().Unix() - cached.time <= CacheTTL) { - return cached.abi, nil - } else { - rp.deleteCachedABI(contractName) - } - } - - // Get ABI - abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) - if err != nil { - return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) - } - - // Decode ABI - abi, err := DecodeAbi(abiEncoded) - if err != nil { - return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) - } - - // Cache ABI - rp.setCachedABI(contractName, cachedABI{ - abi: abi, - time: time.Now().Unix(), - }) - - // Return - return abi, nil + // Check for cached ABI + if cached, ok := rp.getCachedABI(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.abi, nil + } else { + rp.deleteCachedABI(contractName) + } + } + + // Get ABI + abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) + if err != nil { + return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) + } + + // Decode ABI + abi, err := DecodeAbi(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + } + + // Cache ABI + rp.setCachedABI(contractName, cachedABI{ + abi: abi, + time: time.Now().Unix(), + }) + + // Return + return abi, nil } func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { - // Data - var wg errgroup.Group - abis := make([]*abi.ABI, len(contractNames)) - - // Load ABIs - for ci, contractName := range contractNames { - ci, contractName := ci, contractName - wg.Go(func() error { - abi, err := rp.GetABI(contractName) - if err == nil { abis[ci] = abi } - return err - }) - } + // Data + var wg errgroup.Group + abis := make([]*abi.ABI, len(contractNames)) + + // Load ABIs + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + abi, err := rp.GetABI(contractName) + if err == nil { + abis[ci] = abi + } + return err + }) + } - // Wait for data - if err := wg.Wait(); err != nil { - return nil, err - } + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } - // Return - return abis, nil + // Return + return abis, nil } - // Load Rocket Pool contracts func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { - // Check for cached contract - if cached, ok := rp.getCachedContract(contractName); ok { - if (time.Now().Unix() - cached.time <= CacheTTL) { - return cached.contract, nil - } else { - rp.deleteCachedContract(contractName) - } - } - - // Data - var wg errgroup.Group - var address *common.Address - var abi *abi.ABI - - // Load data - wg.Go(func() error { - var err error - address, err = rp.GetAddress(contractName) - return err - }) - wg.Go(func() error { - var err error - abi, err = rp.GetABI(contractName) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return nil, err - } - - // Create contract - contract := &Contract{ - Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), - Address: address, - ABI: abi, - Client: rp.Client, - } - - // Cache contract - rp.setCachedContract(contractName, cachedContract{ - contract: contract, - time: time.Now().Unix(), - }) - - // Return - return contract, nil + // Check for cached contract + if cached, ok := rp.getCachedContract(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.contract, nil + } else { + rp.deleteCachedContract(contractName) + } + } + + // Data + var wg errgroup.Group + var address *common.Address + var abi *abi.ABI + + // Load data + wg.Go(func() error { + var err error + address, err = rp.GetAddress(contractName) + return err + }) + wg.Go(func() error { + var err error + abi, err = rp.GetABI(contractName) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + // Create contract + contract := &Contract{ + Contract: bind.NewBoundContract(*address, *abi, rp.Client, rp.Client, rp.Client), + Address: address, + ABI: abi, + Client: rp.Client, + } + + // Cache contract + rp.setCachedContract(contractName, cachedContract{ + contract: contract, + time: time.Now().Unix(), + }) + + // Return + return contract, nil } func (rp *RocketPool) GetContracts(contractNames ...string) ([]*Contract, error) { - // Data - var wg errgroup.Group - contracts := make([]*Contract, len(contractNames)) - - // Load contracts - for ci, contractName := range contractNames { - ci, contractName := ci, contractName - wg.Go(func() error { - contract, err := rp.GetContract(contractName) - if err == nil { contracts[ci] = contract } - return err - }) - } + // Data + var wg errgroup.Group + contracts := make([]*Contract, len(contractNames)) + + // Load contracts + for ci, contractName := range contractNames { + ci, contractName := ci, contractName + wg.Go(func() error { + contract, err := rp.GetContract(contractName) + if err == nil { + contracts[ci] = contract + } + return err + }) + } - // Wait for data - if err := wg.Wait(); err != nil { - return nil, err - } + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } - // Return - return contracts, nil + // Return + return contracts, nil } - // Create a Rocket Pool contract instance func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*Contract, error) { - // Load ABI - abi, err := rp.GetABI(contractName) - if err != nil { - return nil, err - } + // Load ABI + abi, err := rp.GetABI(contractName) + if err != nil { + return nil, err + } - // Create and return - return &Contract{ - Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), - Address: &address, - ABI: abi, - Client: rp.Client, - }, nil + // Create and return + return &Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil } - // Address cache control func (rp *RocketPool) getCachedAddress(contractName string) (cachedAddress, bool) { - rp.addressesLock.RLock() - defer rp.addressesLock.RUnlock() - value, ok := rp.addresses[contractName] - return value, ok + rp.addressesLock.RLock() + defer rp.addressesLock.RUnlock() + value, ok := rp.addresses[contractName] + return value, ok } func (rp *RocketPool) setCachedAddress(contractName string, value cachedAddress) { - rp.addressesLock.Lock() - defer rp.addressesLock.Unlock() - rp.addresses[contractName] = value + rp.addressesLock.Lock() + defer rp.addressesLock.Unlock() + rp.addresses[contractName] = value } func (rp *RocketPool) deleteCachedAddress(contractName string) { - rp.addressesLock.Lock() - defer rp.addressesLock.Unlock() - delete(rp.addresses, contractName) + rp.addressesLock.Lock() + defer rp.addressesLock.Unlock() + delete(rp.addresses, contractName) } - // ABI cache control func (rp *RocketPool) getCachedABI(contractName string) (cachedABI, bool) { - rp.abisLock.RLock() - defer rp.abisLock.RUnlock() - value, ok := rp.abis[contractName] - return value, ok + rp.abisLock.RLock() + defer rp.abisLock.RUnlock() + value, ok := rp.abis[contractName] + return value, ok } func (rp *RocketPool) setCachedABI(contractName string, value cachedABI) { - rp.abisLock.Lock() - defer rp.abisLock.Unlock() - rp.abis[contractName] = value + rp.abisLock.Lock() + defer rp.abisLock.Unlock() + rp.abis[contractName] = value } func (rp *RocketPool) deleteCachedABI(contractName string) { - rp.abisLock.Lock() - defer rp.abisLock.Unlock() - delete(rp.abis, contractName) + rp.abisLock.Lock() + defer rp.abisLock.Unlock() + delete(rp.abis, contractName) } - // Contract cache control func (rp *RocketPool) getCachedContract(contractName string) (cachedContract, bool) { - rp.contractsLock.RLock() - defer rp.contractsLock.RUnlock() - value, ok := rp.contracts[contractName] - return value, ok + rp.contractsLock.RLock() + defer rp.contractsLock.RUnlock() + value, ok := rp.contracts[contractName] + return value, ok } func (rp *RocketPool) setCachedContract(contractName string, value cachedContract) { - rp.contractsLock.Lock() - defer rp.contractsLock.Unlock() - rp.contracts[contractName] = value + rp.contractsLock.Lock() + defer rp.contractsLock.Unlock() + rp.contracts[contractName] = value } func (rp *RocketPool) deleteCachedContract(contractName string) { - rp.contractsLock.Lock() - defer rp.contractsLock.Unlock() - delete(rp.contracts, contractName) + rp.contractsLock.Lock() + defer rp.contractsLock.Unlock() + delete(rp.contracts, contractName) } - diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index 3f147b2e5..f1205282b 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -16,131 +16,123 @@ import ( // Config const AuctionSettingsContractName = "rocketDAOProtocolSettingsAuction" - // Lot creation currently enabled func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := auctionSettingsContract.Call(opts, value, "getCreateLotEnabled"); err != nil { - return false, fmt.Errorf("Could not get lot creation enabled status: %w", err) - } - return *value, nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := auctionSettingsContract.Call(opts, value, "getCreateLotEnabled"); err != nil { + return false, fmt.Errorf("Could not get lot creation enabled status: %w", err) + } + return *value, nil } func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) + return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) } - // Lot bidding currently enabled func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := auctionSettingsContract.Call(opts, value, "getBidOnLotEnabled"); err != nil { - return false, fmt.Errorf("Could not get lot bidding enabled status: %w", err) - } - return *value, nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := auctionSettingsContract.Call(opts, value, "getBidOnLotEnabled"); err != nil { + return false, fmt.Errorf("Could not get lot bidding enabled status: %w", err) + } + return *value, nil } func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) + return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) } - // The minimum lot size in ETH value func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := auctionSettingsContract.Call(opts, value, "getLotMinimumEthValue"); err != nil { - return nil, fmt.Errorf("Could not get lot minimum ETH value: %w", err) - } - return *value, nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotMinimumEthValue"); err != nil { + return nil, fmt.Errorf("Could not get lot minimum ETH value: %w", err) + } + return *value, nil } func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) } - // The maximum lot size in ETH value func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := auctionSettingsContract.Call(opts, value, "getLotMaximumEthValue"); err != nil { - return nil, fmt.Errorf("Could not get lot maximum ETH value: %w", err) - } - return *value, nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotMaximumEthValue"); err != nil { + return nil, fmt.Errorf("Could not get lot maximum ETH value: %w", err) + } + return *value, nil } func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) } - // The lot duration in blocks func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := auctionSettingsContract.Call(opts, value, "getLotDuration"); err != nil { - return 0, fmt.Errorf("Could not get lot duration: %w", err) - } - return (*value).Uint64(), nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getLotDuration"); err != nil { + return 0, fmt.Errorf("Could not get lot duration: %w", err) + } + return (*value).Uint64(), nil } func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) } - // The starting price relative to current ETH price, as a fraction func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := auctionSettingsContract.Call(opts, value, "getStartingPriceRatio"); err != nil { - return 0, fmt.Errorf("Could not get lot starting price ratio: %w", err) - } - return eth.WeiToEth(*value), nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getStartingPriceRatio"); err != nil { + return 0, fmt.Errorf("Could not get lot starting price ratio: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) } - // The reserve price relative to current ETH price, as a fraction func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := auctionSettingsContract.Call(opts, value, "getReservePriceRatio"); err != nil { - return 0, fmt.Errorf("Could not get lot reserve price ratio: %w", err) - } - return eth.WeiToEth(*value), nil + auctionSettingsContract, err := getAuctionSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getReservePriceRatio"); err != nil { + return 0, fmt.Errorf("Could not get lot reserve price ratio: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) } - // Get contracts var auctionSettingsContractLock sync.Mutex + func getAuctionSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - auctionSettingsContractLock.Lock() - defer auctionSettingsContractLock.Unlock() - return rp.GetContract(AuctionSettingsContractName) + auctionSettingsContractLock.Lock() + defer auctionSettingsContractLock.Unlock() + return rp.GetContract(AuctionSettingsContractName) } - diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 7c4dbcc0a..378ffc116 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -15,97 +15,91 @@ import ( // Config const DepositSettingsContractName = "rocketDAOProtocolSettingsDeposit" - // Deposits currently enabled func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := depositSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { - return false, fmt.Errorf("Could not get deposits enabled status: %w", err) - } - return *value, nil + depositSettingsContract, err := getDepositSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := depositSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { + return false, fmt.Errorf("Could not get deposits enabled status: %w", err) + } + return *value, nil } func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) + return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) } - // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := depositSettingsContract.Call(opts, value, "getAssignDepositsEnabled"); err != nil { - return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) - } - return *value, nil + depositSettingsContract, err := getDepositSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := depositSettingsContract.Call(opts, value, "getAssignDepositsEnabled"); err != nil { + return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) + } + return *value, nil } func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) + return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) } - // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := depositSettingsContract.Call(opts, value, "getMinimumDeposit"); err != nil { - return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) - } - return *value, nil + depositSettingsContract, err := getDepositSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getMinimumDeposit"); err != nil { + return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) + } + return *value, nil } func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) } - // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := depositSettingsContract.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { - return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) - } - return *value, nil + depositSettingsContract, err := getDepositSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { + return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) + } + return *value, nil } func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) } - // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := depositSettingsContract.Call(opts, value, "getMaximumDepositAssignments"); err != nil { - return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) - } - return (*value).Uint64(), nil + depositSettingsContract, err := getDepositSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getMaximumDepositAssignments"); err != nil { + return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) + } + return (*value).Uint64(), nil } func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) } - // Get contracts var depositSettingsContractLock sync.Mutex + func getDepositSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - depositSettingsContractLock.Lock() - defer depositSettingsContractLock.Unlock() - return rp.GetContract(DepositSettingsContractName) + depositSettingsContractLock.Lock() + defer depositSettingsContractLock.Unlock() + return rp.GetContract(DepositSettingsContractName) } - diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 9687e7b08..ffccc3c28 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -16,46 +16,43 @@ import ( // Config const InflationSettingsContractName = "rocketDAOProtocolSettingsInflation" - // RPL inflation rate per interval func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - inflationSettingsContract, err := getInflationSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalRate"); err != nil { - return 0, fmt.Errorf("Could not get inflation rate: %w", err) - } - return eth.WeiToEth(*value), nil + inflationSettingsContract, err := getInflationSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalRate"); err != nil { + return 0, fmt.Errorf("Could not get inflation rate: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) } - // RPL inflation start time func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - inflationSettingsContract, err := getInflationSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartTime"); err != nil { - return 0, fmt.Errorf("Could not get inflation start time: %w", err) - } - return (*value).Uint64(), nil + inflationSettingsContract, err := getInflationSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartTime"); err != nil { + return 0, fmt.Errorf("Could not get inflation start time: %w", err) + } + return (*value).Uint64(), nil } func BootstrapInflationStartTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) } - // Get contracts var inflationSettingsContractLock sync.Mutex + func getInflationSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - inflationSettingsContractLock.Lock() - defer inflationSettingsContractLock.Unlock() - return rp.GetContract(InflationSettingsContractName) + inflationSettingsContractLock.Lock() + defer inflationSettingsContractLock.Unlock() + return rp.GetContract(InflationSettingsContractName) } - diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 1fc0e6277..f435614a6 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -16,133 +16,127 @@ import ( // Config const MinipoolSettingsContractName = "rocketDAOProtocolSettingsMinipool" - // Get the minipool launch balance func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getLaunchBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getLaunchBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) + } + return *value, nil } - // Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getFullDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getFullDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) + } + return *value, nil } func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) + } + return *value, nil } func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { + return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) + } + return *value, nil } - // Required user deposit amounts func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getFullDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getFullDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) + } + return *value, nil } func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) + } + return *value, nil } func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { + return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) + } + return *value, nil } - // Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { - return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) - } - return *value, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { + return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) + } + return *value, nil } func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) + return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) } - // Timeout period in seconds for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { - return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) - } - seconds := time.Duration((*value).Int64()) * time.Second - return seconds, nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { + return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) + } + seconds := time.Duration((*value).Int64()) * time.Second + return seconds, nil } func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) + return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) } - // Get contracts var minipoolSettingsContractLock sync.Mutex + func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - minipoolSettingsContractLock.Lock() - defer minipoolSettingsContractLock.Unlock() - return rp.GetContract(MinipoolSettingsContractName) + minipoolSettingsContractLock.Lock() + defer minipoolSettingsContractLock.Unlock() + return rp.GetContract(MinipoolSettingsContractName) } - diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 3a23038fd..f906da6fc 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -16,182 +16,171 @@ import ( // Config const NetworkSettingsContractName = "rocketDAOProtocolSettingsNetwork" - // The threshold of trusted nodes that must reach consensus on oracle data to commit it func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getNodeConsensusThreshold"); err != nil { - return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) - } - return eth.WeiToEth(*value), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getNodeConsensusThreshold"); err != nil { + return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) } - // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { - return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) - } - return *value, nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { + return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) + } + return *value, nil } func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) } - // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { - return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) - } - return (*value).Uint64(), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { + return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) + } + return (*value).Uint64(), nil } func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) } - // Network price submissions currently enabled func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEnabled"); err != nil { - return false, fmt.Errorf("Could not get network price submissions enabled status: %w", err) - } - return *value, nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEnabled"); err != nil { + return false, fmt.Errorf("Could not get network price submissions enabled status: %w", err) + } + return *value, nil } func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) } - // The frequency in blocks at which network prices should be submitted by trusted nodes func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { - return 0, fmt.Errorf("Could not get network price submission frequency: %w", err) - } - return (*value).Uint64(), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { + return 0, fmt.Errorf("Could not get network price submission frequency: %w", err) + } + return (*value).Uint64(), nil } func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) } - // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getMinimumNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minimum node fee: %w", err) - } - return eth.WeiToEth(*value), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getMinimumNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get minimum node fee: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) } - // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getTargetNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get target node fee: %w", err) - } - return eth.WeiToEth(*value), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getTargetNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get target node fee: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) } - // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getMaximumNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get maximum node fee: %w", err) - } - return eth.WeiToEth(*value), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getMaximumNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get maximum node fee: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) } - // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getNodeFeeDemandRange"); err != nil { - return nil, fmt.Errorf("Could not get node fee demand range: %w", err) - } - return *value, nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getNodeFeeDemandRange"); err != nil { + return nil, fmt.Errorf("Could not get node fee demand range: %w", err) + } + return *value, nil } func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) } - // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getTargetRethCollateralRate"); err != nil { - return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) - } - return eth.WeiToEth(*value), nil + networkSettingsContract, err := getNetworkSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getTargetRethCollateralRate"); err != nil { + return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) } - // Get contracts var networkSettingsContractLock sync.Mutex + func getNetworkSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - networkSettingsContractLock.Lock() - defer networkSettingsContractLock.Unlock() - return rp.GetContract(NetworkSettingsContractName) + networkSettingsContractLock.Lock() + defer networkSettingsContractLock.Unlock() + return rp.GetContract(NetworkSettingsContractName) } - diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 75bff7fd6..65349692d 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -16,80 +16,75 @@ import ( // Config const NodeSettingsContractName = "rocketDAOProtocolSettingsNode" - // Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := nodeSettingsContract.Call(opts, value, "getRegistrationEnabled"); err != nil { - return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) - } - return *value, nil + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := nodeSettingsContract.Call(opts, value, "getRegistrationEnabled"); err != nil { + return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) + } + return *value, nil } func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) } - // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := nodeSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { - return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) - } - return *value, nil + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := nodeSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { + return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) + } + return *value, nil } func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) + return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } - // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { - return 0, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) - } - return eth.WeiToEth(*value), nil + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { + return 0, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } - // The maximum RPL stake per minipool as a fraction of assigned user ETH func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { - return 0, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) - } - return eth.WeiToEth(*value), nil + nodeSettingsContract, err := getNodeSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { + return 0, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) + return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } - // Get contracts var nodeSettingsContractLock sync.Mutex + func getNodeSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - nodeSettingsContractLock.Lock() - defer nodeSettingsContractLock.Unlock() - return rp.GetContract(NodeSettingsContractName) + nodeSettingsContractLock.Lock() + defer nodeSettingsContractLock.Unlock() + return rp.GetContract(NodeSettingsContractName) } - diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index a0e06f299..9b0d5322d 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -16,71 +16,66 @@ import ( // Config const RewardsSettingsContractName = "rocketDAOProtocolSettingsRewards" - // The claim amount for a claimer as a fraction func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (float64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPerc", contractName); err != nil { - return 0, fmt.Errorf("Could not get rewards claimer percent: %w", err) - } - return eth.WeiToEth(*value), nil + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPerc", contractName); err != nil { + return 0, fmt.Errorf("Could not get rewards claimer percent: %w", err) + } + return eth.WeiToEth(*value), nil } - // The time that a claimer's share was last updated func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercTimeUpdated", contractName); err != nil { - return 0, fmt.Errorf("Could not get rewards claimer updated time: %w", err) - } - return (*value).Uint64(), nil + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercTimeUpdated", contractName); err != nil { + return 0, fmt.Errorf("Could not get rewards claimer updated time: %w", err) + } + return (*value).Uint64(), nil } - // The total claim amount for all claimers as a fraction func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersPercTotal"); err != nil { - return 0, fmt.Errorf("Could not get rewards claimers total percent: %w", err) - } - return eth.WeiToEth(*value), nil + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersPercTotal"); err != nil { + return 0, fmt.Errorf("Could not get rewards claimers total percent: %w", err) + } + return eth.WeiToEth(*value), nil } - // Rewards claim interval time func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get rewards claim interval: %w", err) - } - return (*value).Uint64(), nil + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalTime"); err != nil { + return 0, fmt.Errorf("Could not get rewards claim interval: %w", err) + } + return (*value).Uint64(), nil } func BootstrapRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.time", big.NewInt(int64(value)), opts) + return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.time", big.NewInt(int64(value)), opts) } - // Get contracts var rewardsSettingsContractLock sync.Mutex + func getRewardsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rewardsSettingsContractLock.Lock() - defer rewardsSettingsContractLock.Unlock() - return rp.GetContract(RewardsSettingsContractName) + rewardsSettingsContractLock.Lock() + defer rewardsSettingsContractLock.Unlock() + return rp.GetContract(RewardsSettingsContractName) } - diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 8983b77cd..00f884c4e 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -15,184 +15,175 @@ import ( // Config const ( - MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" - QuorumSettingPath = "members.quorum" - RPLBondSettingPath = "members.rplbond" - MinipoolUnbondedMaxSettingPath = "members.minipool.unbonded.max" - MinipoolUnbondedMinFeeSettingPath = "members.minipool.unbonded.min.fee" - ChallengeCooldownSettingPath = "members.challenge.cooldown" - ChallengeWindowSettingPath = "members.challenge.window" - ChallengeCostSettingPath = "members.challenge.cost" + MembersSettingsContractName = "rocketDAONodeTrustedSettingsMembers" + QuorumSettingPath = "members.quorum" + RPLBondSettingPath = "members.rplbond" + MinipoolUnbondedMaxSettingPath = "members.minipool.unbonded.max" + MinipoolUnbondedMinFeeSettingPath = "members.minipool.unbonded.min.fee" + ChallengeCooldownSettingPath = "members.challenge.cooldown" + ChallengeWindowSettingPath = "members.challenge.window" + ChallengeCostSettingPath = "members.challenge.cost" ) - // Member proposal quorum threshold func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getQuorum"); err != nil { - return 0, fmt.Errorf("Could not get member quorum threshold: %w", err) - } - return eth.WeiToEth(*value), nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getQuorum"); err != nil { + return 0, fmt.Errorf("Could not get member quorum threshold: %w", err) + } + return eth.WeiToEth(*value), nil } func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } func EstimateProposeQuorumGas(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } - // RPL bond required for a member func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getRPLBond"); err != nil { - return nil, fmt.Errorf("Could not get member RPL bond amount: %w", err) - } - return *value, nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getRPLBond"); err != nil { + return nil, fmt.Errorf("Could not get member RPL bond amount: %w", err) + } + return *value, nil } func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) } func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } func EstimateProposeRPLBondGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } - // The maximum number of unbonded minipools a member can run func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { - return 0, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) - } - return (*value).Uint64(), nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { + return 0, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) + } + return (*value).Uint64(), nil } func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeMinipoolUnbondedMaxGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } - - // The minimum commission rate before unbonded minipools are allowed func GetMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMinFee"); err != nil { - return 0, fmt.Errorf("Could not get member unbonded minipool minimum fee: %w", err) - } - return (*value).Uint64(), nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMinFee"); err != nil { + return 0, fmt.Errorf("Could not get member unbonded minipool minimum fee: %w", err) + } + return (*value).Uint64(), nil } func BootstrapMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) } func ProposeMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeMinipoolUnbondedMinFeeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) } - // The period a member must wait for before submitting another challenge, in blocks func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getChallengeCooldown"); err != nil { - return 0, fmt.Errorf("Could not get member challenge cooldown period: %w", err) - } - return (*value).Uint64(), nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeCooldown"); err != nil { + return 0, fmt.Errorf("Could not get member challenge cooldown period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeChallengeCooldownGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } - // The period during which a member can respond to a challenge, in blocks func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getChallengeWindow"); err != nil { - return 0, fmt.Errorf("Could not get member challenge window period: %w", err) - } - return (*value).Uint64(), nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeWindow"); err != nil { + return 0, fmt.Errorf("Could not get member challenge window period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeChallengeWindowGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } - // The fee for a non-member to challenge a member, in wei func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := membersSettingsContract.Call(opts, value, "getChallengeCost"); err != nil { - return nil, fmt.Errorf("Could not get member challenge cost: %w", err) - } - return *value, nil + membersSettingsContract, err := getMembersSettingsContract(rp) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := membersSettingsContract.Call(opts, value, "getChallengeCost"); err != nil { + return nil, fmt.Errorf("Could not get member challenge cost: %w", err) + } + return *value, nil } func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCostSettingPath, value, opts) + return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } func EstimateProposeChallengeCostGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } - // Get contracts var membersSettingsContractLock sync.Mutex + func getMembersSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - membersSettingsContractLock.Lock() - defer membersSettingsContractLock.Unlock() - return rp.GetContract(MembersSettingsContractName) + membersSettingsContractLock.Lock() + defer membersSettingsContractLock.Unlock() + return rp.GetContract(MembersSettingsContractName) } - diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 2b22d8134..789e00ddf 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -14,63 +14,60 @@ import ( // Config const ( - MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" - ScrubPeriodPath = "minipool.scrub.period" - ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" + MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" + ScrubPeriodPath = "minipool.scrub.period" + ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" ) - // The cooldown period a member must wait after making a proposal before making another in seconds func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getScrubPeriod"); err != nil { - return 0, fmt.Errorf("Could not get scrub period: %w", err) - } - return (*value).Uint64(), nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getScrubPeriod"); err != nil { + return 0, fmt.Errorf("Could not get scrub period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) } func ProposeScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) } func EstimateProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) } - // Whether or not the RPL slashing penalty is applied to scrubbed minipools func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) - if err != nil { - return false, err - } - value := new(bool) - if err := minipoolSettingsContract.Call(opts, value, "getScrubPenaltyEnabled"); err != nil { - return false, fmt.Errorf("Could not get scrub penalty setting: %w", err) - } - return (*value), nil + minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := minipoolSettingsContract.Call(opts, value, "getScrubPenaltyEnabled"); err != nil { + return false, fmt.Errorf("Could not get scrub penalty setting: %w", err) + } + return (*value), nil } func BootstrapScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapBool(rp, MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) + return trustednodedao.BootstrapBool(rp, MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) } func ProposeScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetBool(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) + return trustednodedao.ProposeSetBool(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) } func EstimateProposeScrubPenaltyEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) + return trustednodedao.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) } - // Get contracts var minipoolSettingsContractLock sync.Mutex + func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - minipoolSettingsContractLock.Lock() - defer minipoolSettingsContractLock.Unlock() - return rp.GetContract(MinipoolSettingsContractName) + minipoolSettingsContractLock.Lock() + defer minipoolSettingsContractLock.Unlock() + return rp.GetContract(MinipoolSettingsContractName) } - diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index a6634d724..a8550c869 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -14,135 +14,129 @@ import ( // Config const ( - ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" - CooldownTimeSettingPath = "proposal.cooldown.time" - VoteTimeSettingPath = "proposal.vote.time" - VoteDelayTimeSettingPath = "proposal.vote.delay.time" - ExecuteTimeSettingPath = "proposal.execute.time" - ActionTimeSettingPath = "proposal.action.time" + ProposalsSettingsContractName = "rocketDAONodeTrustedSettingsProposals" + CooldownTimeSettingPath = "proposal.cooldown.time" + VoteTimeSettingPath = "proposal.vote.time" + VoteDelayTimeSettingPath = "proposal.vote.delay.time" + ExecuteTimeSettingPath = "proposal.execute.time" + ActionTimeSettingPath = "proposal.action.time" ) - // The cooldown period a member must wait after making a proposal before making another in seconds func GetProposalCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal cooldown period: %w", err) - } - return (*value).Uint64(), nil + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { + return 0, fmt.Errorf("Could not get proposal cooldown period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalCooldownTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } - // The period a proposal can be voted on for in seconds func GetProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal voting period: %w", err) - } - return (*value).Uint64(), nil + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { + return 0, fmt.Errorf("Could not get proposal voting period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalVoteTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } - // The delay after creation before a proposal can be voted on in seconds func GetProposalVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal voting delay: %w", err) - } - return (*value).Uint64(), nil + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayTime"); err != nil { + return 0, fmt.Errorf("Could not get proposal voting delay: %w", err) + } + return (*value).Uint64(), nil } func BootstrapProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalVoteDelayTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } - // The period during which a passed proposal can be executed in time func GetProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getExecuteTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal execution period: %w", err) - } - return (*value).Uint64(), nil + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getExecuteTime"); err != nil { + return 0, fmt.Errorf("Could not get proposal execution period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalExecuteTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } - // The period during which an action can be performed on an executed proposal in seconds func GetProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getActionTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal action period: %w", err) - } - return (*value).Uint64(), nil + proposalsSettingsContract, err := getProposalsSettingsContract(rp) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getActionTime"); err != nil { + return 0, fmt.Errorf("Could not get proposal action period: %w", err) + } + return (*value).Uint64(), nil } func BootstrapProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } func ProposeProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } func EstimateProposeProposalActionTimeGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } - // Get contracts var proposalsSettingsContractLock sync.Mutex + func getProposalsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - proposalsSettingsContractLock.Lock() - defer proposalsSettingsContractLock.Unlock() - return rp.GetContract(ProposalsSettingsContractName) + proposalsSettingsContractLock.Lock() + defer proposalsSettingsContractLock.Unlock() + return rp.GetContract(ProposalsSettingsContractName) } - diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go index 379e36f7e..fa3241d00 100644 --- a/storage/rocket-storage.go +++ b/storage/rocket-storage.go @@ -10,51 +10,46 @@ import ( // Get a node's withdrawal address func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - withdrawalAddress := new(common.Address) - if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) - } - return *withdrawalAddress, nil + withdrawalAddress := new(common.Address) + if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) + } + return *withdrawalAddress, nil } - // Get a node's pending withdrawal address func GetNodePendingWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - withdrawalAddress := new(common.Address) - if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s pending withdrawal address: %w", nodeAddress.Hex(), err) - } - return *withdrawalAddress, nil + withdrawalAddress := new(common.Address) + if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s pending withdrawal address: %w", nodeAddress.Hex(), err) + } + return *withdrawalAddress, nil } - // Estimate the gas of SetWithdrawalAddress func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return rp.RocketStorageContract.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) + return rp.RocketStorageContract.GetTransactionGasInfo(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) } - // Set a node's withdrawal address func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) - } - return hash, nil + hash, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) + } + return hash, nil } - // Estimate the gas of ConfirmWithdrawalAddress func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return rp.RocketStorageContract.GetTransactionGasInfo(opts, "confirmWithdrawalAddress", nodeAddress) + return rp.RocketStorageContract.GetTransactionGasInfo(opts, "confirmWithdrawalAddress", nodeAddress) } - // Set a node's withdrawal address func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) - } - return hash, nil + hash, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) + } + return hash, nil } diff --git a/tests/auction/auction_test.go b/tests/auction/auction_test.go index 60f1a0613..9f8940d85 100644 --- a/tests/auction/auction_test.go +++ b/tests/auction/auction_test.go @@ -17,246 +17,317 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestAuctionDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Disable min commission rate for unbonded pools - if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check initial RPL balances - totalBalance1, err := auction.GetTotalRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - allottedBalance1, err := auction.GetAllottedRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - remainingBalance1, err := auction.GetRemainingRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - if totalBalance1.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial auction contract total RPL balance %s", totalBalance1.String()) - } - if allottedBalance1.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial auction contract allotted RPL balance %s", allottedBalance1.String()) - } - if remainingBalance1.Cmp(totalBalance1) != 0 { - t.Errorf("Incorrect initial auction contract remaining RPL balance %s", remainingBalance1.String()) - } - - // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { - t.Fatal(err) - } - - // Get & check updated RPL balances - totalBalance2, err := auction.GetTotalRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - allottedBalance2, err := auction.GetAllottedRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - remainingBalance2, err := auction.GetRemainingRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - if totalBalance2.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated auction contract total RPL balance 1 %s", totalBalance2.String()) - } - if allottedBalance2.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated auction contract allotted RPL balance 1 %s", allottedBalance2.String()) - } - if remainingBalance2.Cmp(totalBalance2) != 0 { - t.Errorf("Incorrect updated auction contract remaining RPL balance 1 %s", remainingBalance2.String()) - } - - // Create a new lot - if _, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated RPL balances - totalBalance3, err := auction.GetTotalRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - allottedBalance3, err := auction.GetAllottedRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - remainingBalance3, err := auction.GetRemainingRPLBalance(rp, nil) - if err != nil { t.Fatal(err) } - var expectedRemainingBalance big.Int - expectedRemainingBalance.Sub(totalBalance3, allottedBalance3) - if allottedBalance3.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated auction contract allotted RPL balance 2 %s", allottedBalance3.String()) - } - if remainingBalance3.Cmp(&expectedRemainingBalance) != 0 { - t.Errorf("Incorrect updated auction contract remaining RPL balance 2 %s", remainingBalance3.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Disable min commission rate for unbonded pools + if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check initial RPL balances + totalBalance1, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + allottedBalance1, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + remainingBalance1, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + if totalBalance1.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial auction contract total RPL balance %s", totalBalance1.String()) + } + if allottedBalance1.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial auction contract allotted RPL balance %s", allottedBalance1.String()) + } + if remainingBalance1.Cmp(totalBalance1) != 0 { + t.Errorf("Incorrect initial auction contract remaining RPL balance %s", remainingBalance1.String()) + } + + // Mint slashed RPL to auction contract + if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { + t.Fatal(err) + } + + // Get & check updated RPL balances + totalBalance2, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + allottedBalance2, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + remainingBalance2, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + if totalBalance2.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated auction contract total RPL balance 1 %s", totalBalance2.String()) + } + if allottedBalance2.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated auction contract allotted RPL balance 1 %s", allottedBalance2.String()) + } + if remainingBalance2.Cmp(totalBalance2) != 0 { + t.Errorf("Incorrect updated auction contract remaining RPL balance 1 %s", remainingBalance2.String()) + } + + // Create a new lot + if _, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated RPL balances + totalBalance3, err := auction.GetTotalRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + allottedBalance3, err := auction.GetAllottedRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + remainingBalance3, err := auction.GetRemainingRPLBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + var expectedRemainingBalance big.Int + expectedRemainingBalance.Sub(totalBalance3, allottedBalance3) + if allottedBalance3.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated auction contract allotted RPL balance 2 %s", allottedBalance3.String()) + } + if remainingBalance3.Cmp(&expectedRemainingBalance) != 0 { + t.Errorf("Incorrect updated auction contract remaining RPL balance 2 %s", remainingBalance3.String()) + } } - func TestLotDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Disable min commission rate for unbonded pools - if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Set network parameters - if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapLotDuration(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Mint slashed RPL to auction contract - if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { t.Fatal(err) } - - // Get & check initial lot details - if lots, err := auction.GetLots(rp, nil); err != nil { - t.Error(err) - } else if len(lots) != 0 { - t.Error("Incorrect initial lot count") - } - if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(lots) != 0 { - t.Error("Incorrect initial lot count") - } - - // Create lots - lot1Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - lot2Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - - // Place bid on lot 1 - bidAmount := eth.EthToWei(1) - bid1Opts := userAccount1.GetTransactor() - bid1Opts.Value = bidAmount - if _, err := auction.PlaceBid(rp, lot1Index, bid1Opts); err != nil { t.Fatal(err) } - - // Place another bid on lot 1 to clear it - bid2Opts := userAccount2.GetTransactor() - bid2Opts.Value = eth.EthToWei(1000) - if _, err := auction.PlaceBid(rp, lot1Index, bid2Opts); err != nil { t.Fatal(err) } - - // Mine blocks until lot 2 hits reserve price & recover unclaimed RPL from it - if err := evm.MineBlocks(5); err != nil { t.Fatal(err) } - if _, err := auction.RecoverUnclaimedRPL(rp, lot2Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated lot details - if lots, err := auction.GetLots(rp, nil); err != nil { - t.Error(err) - } else if len(lots) != 2 { - t.Error("Incorrect updated lot count") - } else if lots[0].Index != lot1Index || lots[1].Index != lot2Index { - t.Error("Incorrect lot indexes") - } - if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(lots) != 2 { - t.Error("Incorrect updated lot count") - } else { - lot1 := lots[0] - lot2 := lots[1] - - // Lot 1 - if lot1.Index != lot1Index { - t.Errorf("Incorrect lot index %d", lot1.Index) - } - if !lot1.Exists { - t.Error("Incorrect lot exists status") - } - if lot1.StartBlock == 0 { - t.Errorf("Incorrect lot start block %d", lot1.StartBlock) - } - if lot1.EndBlock <= lot1.StartBlock { - t.Errorf("Incorrect lot end block %d", lot1.EndBlock) - } - if lot1.StartPrice.Cmp(eth.EthToWei(1)) != 0 { - t.Errorf("Incorrect lot start price %s", lot1.StartPrice.String()) - } - if lot1.ReservePrice.Cmp(eth.EthToWei(0.5)) != 0 { - t.Errorf("Incorrect lot reserve price %s", lot1.ReservePrice.String()) - } - if lot1.PriceAtCurrentBlock.Cmp(lot1.StartPrice) == 1 || lot1.PriceAtCurrentBlock.Cmp(lot1.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot1.PriceAtCurrentBlock.String()) - } - if lot1.PriceByTotalBids.Cmp(lot1.StartPrice) == 1 || lot1.PriceByTotalBids.Cmp(lot1.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot1.PriceByTotalBids.String()) - } - if lot1.CurrentPrice.Cmp(lot1.StartPrice) == 1 || lot1.CurrentPrice.Cmp(lot1.ReservePrice) == -1 { - t.Errorf("Incorrect lot price at current block %s", lot1.CurrentPrice.String()) - } - if lot1.TotalRPLAmount.Cmp(eth.EthToWei(10)) != 0 { - t.Errorf("Incorrect lot total RPL amount %s", lot1.TotalRPLAmount.String()) - } - if lot1.ClaimedRPLAmount.Cmp(eth.EthToWei(10)) != 0 { - t.Errorf("Incorrect lot claimed RPL amount %s", lot1.ClaimedRPLAmount.String()) - } - if lot1.RemainingRPLAmount.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect lot remaining RPL amount %s", lot1.RemainingRPLAmount.String()) - } - if lot1.TotalBidAmount.Cmp(bidAmount) != 1 { - t.Errorf("Incorrect lot total bid amount %s", lot1.TotalBidAmount.String()) - } - if lot1.AddressBidAmount.Cmp(bidAmount) != 0 { - t.Errorf("Incorrect lot address bid amount %s", lot1.AddressBidAmount.String()) - } - if !lot1.Cleared { - t.Error("Incorrect lot cleared status") - } - if lot1.RPLRecovered { - t.Error("Incorrect lot RPL recovered status") - } - - // Lot 1 prices at blocks - if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 0, nil); err != nil { - t.Error(err) - } else if priceAtBlock.Cmp(lot1.StartPrice) != 0 { - t.Errorf("Incorrect lot price at block 1 %s", priceAtBlock.String()) - } - if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 1000000, nil); err != nil { - t.Error(err) - } else if priceAtBlock.Cmp(lot1.ReservePrice) != 0 { - t.Errorf("Incorrect lot price at block 2 %s", priceAtBlock.String()) - } - - // Lot 2 - if lot2.Index != lot2Index { - t.Errorf("Incorrect lot index %d", lot2.Index) - } - if !lot2.RPLRecovered { - t.Error("Incorrect lot RPL recovered status") - } - - } - - // Get & check initial bidder RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial bidder RPL balance %s", rplBalance.String()) - } - - // Claim bid on lot 1 - if _, err := auction.ClaimBid(rp, lot1Index, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated bidder RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated bidder RPL balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Disable min commission rate for unbonded pools + if _, err := trustednode.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set network parameters + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := network.SubmitPrices(rp, 1, eth.EthToWei(1), eth.EthToWei(24), trustedNodeAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := protocol.BootstrapLotStartingPriceRatio(rp, 1.0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := protocol.BootstrapLotReservePriceRatio(rp, 0.5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := protocol.BootstrapLotMaximumEthValue(rp, eth.EthToWei(10), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := protocol.BootstrapLotDuration(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Mint slashed RPL to auction contract + if err := auctionutils.CreateSlashedRPL(t, rp, ownerAccount, trustedNodeAccount1, trustedNodeAccount2, userAccount1); err != nil { + t.Fatal(err) + } + + // Get & check initial lot details + if lots, err := auction.GetLots(rp, nil); err != nil { + t.Error(err) + } else if len(lots) != 0 { + t.Error("Incorrect initial lot count") + } + if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(lots) != 0 { + t.Error("Incorrect initial lot count") + } + + // Create lots + lot1Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + lot2Index, _, err := auction.CreateLot(rp, userAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + + // Place bid on lot 1 + bidAmount := eth.EthToWei(1) + bid1Opts := userAccount1.GetTransactor() + bid1Opts.Value = bidAmount + if _, err := auction.PlaceBid(rp, lot1Index, bid1Opts); err != nil { + t.Fatal(err) + } + + // Place another bid on lot 1 to clear it + bid2Opts := userAccount2.GetTransactor() + bid2Opts.Value = eth.EthToWei(1000) + if _, err := auction.PlaceBid(rp, lot1Index, bid2Opts); err != nil { + t.Fatal(err) + } + + // Mine blocks until lot 2 hits reserve price & recover unclaimed RPL from it + if err := evm.MineBlocks(5); err != nil { + t.Fatal(err) + } + if _, err := auction.RecoverUnclaimedRPL(rp, lot2Index, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated lot details + if lots, err := auction.GetLots(rp, nil); err != nil { + t.Error(err) + } else if len(lots) != 2 { + t.Error("Incorrect updated lot count") + } else if lots[0].Index != lot1Index || lots[1].Index != lot2Index { + t.Error("Incorrect lot indexes") + } + if lots, err := auction.GetLotsWithBids(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(lots) != 2 { + t.Error("Incorrect updated lot count") + } else { + lot1 := lots[0] + lot2 := lots[1] + + // Lot 1 + if lot1.Index != lot1Index { + t.Errorf("Incorrect lot index %d", lot1.Index) + } + if !lot1.Exists { + t.Error("Incorrect lot exists status") + } + if lot1.StartBlock == 0 { + t.Errorf("Incorrect lot start block %d", lot1.StartBlock) + } + if lot1.EndBlock <= lot1.StartBlock { + t.Errorf("Incorrect lot end block %d", lot1.EndBlock) + } + if lot1.StartPrice.Cmp(eth.EthToWei(1)) != 0 { + t.Errorf("Incorrect lot start price %s", lot1.StartPrice.String()) + } + if lot1.ReservePrice.Cmp(eth.EthToWei(0.5)) != 0 { + t.Errorf("Incorrect lot reserve price %s", lot1.ReservePrice.String()) + } + if lot1.PriceAtCurrentBlock.Cmp(lot1.StartPrice) == 1 || lot1.PriceAtCurrentBlock.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.PriceAtCurrentBlock.String()) + } + if lot1.PriceByTotalBids.Cmp(lot1.StartPrice) == 1 || lot1.PriceByTotalBids.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.PriceByTotalBids.String()) + } + if lot1.CurrentPrice.Cmp(lot1.StartPrice) == 1 || lot1.CurrentPrice.Cmp(lot1.ReservePrice) == -1 { + t.Errorf("Incorrect lot price at current block %s", lot1.CurrentPrice.String()) + } + if lot1.TotalRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot total RPL amount %s", lot1.TotalRPLAmount.String()) + } + if lot1.ClaimedRPLAmount.Cmp(eth.EthToWei(10)) != 0 { + t.Errorf("Incorrect lot claimed RPL amount %s", lot1.ClaimedRPLAmount.String()) + } + if lot1.RemainingRPLAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect lot remaining RPL amount %s", lot1.RemainingRPLAmount.String()) + } + if lot1.TotalBidAmount.Cmp(bidAmount) != 1 { + t.Errorf("Incorrect lot total bid amount %s", lot1.TotalBidAmount.String()) + } + if lot1.AddressBidAmount.Cmp(bidAmount) != 0 { + t.Errorf("Incorrect lot address bid amount %s", lot1.AddressBidAmount.String()) + } + if !lot1.Cleared { + t.Error("Incorrect lot cleared status") + } + if lot1.RPLRecovered { + t.Error("Incorrect lot RPL recovered status") + } + + // Lot 1 prices at blocks + if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 0, nil); err != nil { + t.Error(err) + } else if priceAtBlock.Cmp(lot1.StartPrice) != 0 { + t.Errorf("Incorrect lot price at block 1 %s", priceAtBlock.String()) + } + if priceAtBlock, err := auction.GetLotPriceAtBlock(rp, lot1Index, 1000000, nil); err != nil { + t.Error(err) + } else if priceAtBlock.Cmp(lot1.ReservePrice) != 0 { + t.Errorf("Incorrect lot price at block 2 %s", priceAtBlock.String()) + } + + // Lot 2 + if lot2.Index != lot2Index { + t.Errorf("Incorrect lot index %d", lot2.Index) + } + if !lot2.RPLRecovered { + t.Error("Incorrect lot RPL recovered status") + } + + } + + // Get & check initial bidder RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial bidder RPL balance %s", rplBalance.String()) + } + + // Claim bid on lot 1 + if _, err := auction.ClaimBid(rp, lot1Index, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated bidder RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated bidder RPL balance %s", rplBalance.String()) + } } - diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index a9874e599..d7bdab1d3 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -15,49 +15,60 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/utils" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount1 *accounts.Account - trustedNodeAccount2 *accounts.Account - trustedNodeAccount3 *accounts.Account - userAccount1 *accounts.Account - userAccount2 *accounts.Account -) + client *uc.EthClientProxy + rp *rocketpool.RocketPool + ownerAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account + userAccount1 *accounts.Account + userAccount2 *accounts.Account +) func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount1, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - trustedNodeAccount2, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - trustedNodeAccount3, err = accounts.GetAccount(3) - if err != nil { log.Fatal(err) } - userAccount1, err = accounts.GetAccount(8) - if err != nil { log.Fatal(err) } - userAccount2, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Do the bootstrap settings - utils.Stage4Bootstrap(rp, ownerAccount) - - // Run tests - os.Exit(m.Run()) + var err error -} + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { + log.Fatal(err) + } + userAccount1, err = accounts.GetAccount(8) + if err != nil { + log.Fatal(err) + } + userAccount2, err = accounts.GetAccount(9) + if err != nil { + log.Fatal(err) + } + + // Do the bootstrap settings + utils.Stage4Bootstrap(rp, ownerAccount) + + // Run tests + os.Exit(m.Run()) + +} diff --git a/tests/config.go b/tests/config.go index c891d86c3..38b17b950 100644 --- a/tests/config.go +++ b/tests/config.go @@ -3,31 +3,29 @@ package tests // Contract addresses and account private keys are based on the following mnemonic: // jungle neck govern chief unaware rubber frequent tissue service license alcohol velvet - const ( - Eth1ProviderAddress = "http://127.0.0.1:8545" - RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" + Eth1ProviderAddress = "http://127.0.0.1:8545" + RocketStorageAddress = "0x70a5F2eB9e4C003B105399b471DAeDbC8d00B1c5" ) const ( - ValidatorPubkey = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30e" - ValidatorPubkey2 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30d" - ValidatorPubkey3 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30c" - ValidatorSignature = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e33" - ValidatorSignature2 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e34" - ValidatorSignature3 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e35" + ValidatorPubkey = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30e" + ValidatorPubkey2 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30d" + ValidatorPubkey3 = "968bcf4081af4a10d054c1cde1dadfd6e85a120a397174173ca869f66bdc72835f9918ea251930778e5ba67a7907e30c" + ValidatorSignature = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e33" + ValidatorSignature2 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e34" + ValidatorSignature3 = "83757098b3b118c67d993218afb69e80a13eb3b174cd3da9958971f05e6b30b9ff5a55677d644f972b31c24e0544604703e8cf18b109fde1e0d3cde0446147bf2f38f02fefce604e4119a605348dfc8a99935dbd65a64eb773c77508f9150e35" ) var AccountPrivateKeys = []string{ - "c6d2ac9b00bd599c4ce9d3a69c91e496eb9e79781d9dc84c79bafa7618f45f37", - "025515b79bbe5edf008112d19a14457e6bea72dc4660667eeb2c3225c8285618", - "02984e048155b5a3b80162a2041e096c3f99b9b4324bc7ff3e56e96d37f1500b", - "5894075a2b08d7585fd4b354914326da5c9b05f92a737b8789f127ba7a21f939", - "5a18d98ff88545ab82044b31ace49ad252056b89445913dc6a5653eca58c438a", - "ea8a7f5637ca1ae8ee6783850af1c0c57cdc5e66d1dcb92fd636908ad9b4cc04", - "836915de8841cd4e3a24b80c9c33e59be8db8ab3daf32d5edce56597b905bbf0", - "759b3437ff0fd1af70a5a367ac281c73f6dca2e17a4650a7f939fb50ad15f6cd", - "dde1c7fcfe3fa4c5e824e2e0cf5d8cef98692cde611b070d054045c2826aecb4", - "418bb76e4af529837d39f4812201c6e4b9b3d5d521f66047b6f34a6d7bc0c811", + "c6d2ac9b00bd599c4ce9d3a69c91e496eb9e79781d9dc84c79bafa7618f45f37", + "025515b79bbe5edf008112d19a14457e6bea72dc4660667eeb2c3225c8285618", + "02984e048155b5a3b80162a2041e096c3f99b9b4324bc7ff3e56e96d37f1500b", + "5894075a2b08d7585fd4b354914326da5c9b05f92a737b8789f127ba7a21f939", + "5a18d98ff88545ab82044b31ace49ad252056b89445913dc6a5653eca58c438a", + "ea8a7f5637ca1ae8ee6783850af1c0c57cdc5e66d1dcb92fd636908ad9b4cc04", + "836915de8841cd4e3a24b80c9c33e59be8db8ab3daf32d5edce56597b905bbf0", + "759b3437ff0fd1af70a5a367ac281c73f6dca2e17a4650a7f939fb50ad15f6cd", + "dde1c7fcfe3fa4c5e824e2e0cf5d8cef98692cde611b070d054045c2826aecb4", + "418bb76e4af529837d39f4812201c6e4b9b3d5d521f66047b6f34a6d7bc0c811", } - diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index 853cb1fde..fff24a9c9 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -15,46 +15,55 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/utils" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount1 *accounts.Account - trustedNodeAccount2 *accounts.Account - trustedNodeAccount3 *accounts.Account - nodeAccount *accounts.Account + client *uc.EthClientProxy + rp *rocketpool.RocketPool + + ownerAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account + nodeAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount1, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - trustedNodeAccount2, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - trustedNodeAccount3, err = accounts.GetAccount(3) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(4) - if err != nil { log.Fatal(err) } - - // Do the bootstrap settings - utils.Stage4Bootstrap(rp, ownerAccount) - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(4) + if err != nil { + log.Fatal(err) + } + + // Do the bootstrap settings + utils.Stage4Bootstrap(rp, ownerAccount) + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/dao/proposals_test.go b/tests/dao/proposals_test.go index f7ed7631e..31fdbe601 100644 --- a/tests/dao/proposals_test.go +++ b/tests/dao/proposals_test.go @@ -15,163 +15,195 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestProposalDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // The DAO to check for proposals under - proposalDaoName := "rocketDAONodeTrustedProposals" - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Get & check initial proposal details - if proposals, err := dao.GetProposals(rp, nil); err != nil { - t.Error(err) - } else if len(proposals) != 0 { - t.Error("Incorrect initial proposal count") - } - if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(proposals) != 0 { - t.Error("Incorrect initial proposal count") - } - if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { - t.Error(err) - } else if len(daoProposals) != 0 { - t.Error("Incorrect initial DAO proposal count") - } - if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(daoProposals) != 0 { - t.Error("Incorrect initial DAO proposal count") - } - - // Submit invite member proposal - proposalMessage := "invite coolguy" - proposalMemberAddress := nodeAccount.Address - proposalMemberId := "coolguy" - proposalMemberEmail := "coolguy@rocketpool.net" - proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - - // Increase time until proposal voting delay has passed - voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) - if err != nil { t.Fatal(err) } - if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { t.Fatal(err) } - - // Vote on & execute proposal - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Submit invite member proposal & cancel it - cancelledProposalId, _, err := trustednodedao.ProposeInviteMember(rp, "cancel this", nodeAccount.Address, "cancel", "cancel@rocketpool.net", trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated proposal details - if proposals, err := dao.GetProposals(rp, nil); err != nil { - t.Error(err) - } else if len(proposals) != 2 { - t.Error("Incorrect updated proposal count") - } else if proposals[0].ID != proposalId || proposals[1].ID != cancelledProposalId { - t.Error("Incorrect proposal indexes") - } - if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(proposals) != 2 { - t.Error("Incorrect updated proposal count") - } else { - - // Passed proposal - proposal := proposals[0] - if proposal.ID != proposalId { - t.Errorf("Incorrect proposal ID %d", proposal.ID) - } - if proposal.DAO != proposalDaoName { - t.Errorf("Incorrect proposal DAO %s", proposal.DAO) - } - if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount1.Address.Bytes()) { - t.Errorf("Incorrect proposal proposer address %s", proposal.ProposerAddress.Hex()) - } - if proposal.Message != proposalMessage { - t.Errorf("Incorrect proposal message %s", proposal.Message) - } - if proposal.CreatedTime == 0 { - t.Errorf("Incorrect proposal created time %d", proposal.CreatedTime) - } - if proposal.StartTime <= proposal.CreatedTime { - t.Errorf("Incorrect proposal start time %d", proposal.StartTime) - } - if proposal.EndTime <= proposal.StartTime { - t.Errorf("Incorrect proposal end time %d", proposal.EndTime) - } - if proposal.ExpiryTime <= proposal.EndTime { - t.Errorf("Incorrect proposal expiry time %d", proposal.ExpiryTime) - } - if proposal.VotesRequired == 0.0 { - t.Errorf("Incorrect proposal required votes %f", proposal.VotesRequired) - } - if proposal.VotesFor != 2.0 { - t.Errorf("Incorrect proposal votes for %f", proposal.VotesFor) - } - if proposal.VotesAgainst != 0.0 { - t.Errorf("Incorrect proposal votes against %f", proposal.VotesAgainst) - } - if !proposal.MemberVoted { - t.Error("Incorrect proposal member voted status") - } - if !proposal.MemberSupported { - t.Error("Incorrect proposal member supported status") - } - if proposal.IsCancelled { - t.Error("Incorrect proposal cancelled status") - } - if !proposal.IsExecuted { - t.Error("Incorrect proposal executed status") - } - if proposal.PayloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { - t.Errorf("Incorrect proposal payload string %s", proposal.PayloadStr) - } - if proposal.State != rptypes.Executed { - t.Errorf("Incorrect proposal state %s", proposal.State.String()) - } - - // Cancelled proposal - cancelledProposal := proposals[1] - if cancelledProposal.ID != cancelledProposalId { - t.Errorf("Incorrect cancelled proposal ID %d", cancelledProposal.ID) - } - if !cancelledProposal.IsCancelled { - t.Error("Incorrect cancelled proposal cancelled status") - } - - } - if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { - t.Error(err) - } else if len(daoProposals) != 2 { - t.Error("Incorrect updated DAO proposal count") - } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { - t.Error("Incorrect DAO proposal indexes") - } - if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if len(daoProposals) != 2 { - t.Error("Incorrect updated DAO proposal count") - } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { - t.Error("Incorrect DAO proposal indexes") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // The DAO to check for proposals under + proposalDaoName := "rocketDAONodeTrustedProposals" + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Get & check initial proposal details + if proposals, err := dao.GetProposals(rp, nil); err != nil { + t.Error(err) + } else if len(proposals) != 0 { + t.Error("Incorrect initial proposal count") + } + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(proposals) != 0 { + t.Error("Incorrect initial proposal count") + } + if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 0 { + t.Error("Incorrect initial DAO proposal count") + } + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 0 { + t.Error("Incorrect initial DAO proposal count") + } + + // Submit invite member proposal + proposalMessage := "invite coolguy" + proposalMemberAddress := nodeAccount.Address + proposalMemberId := "coolguy" + proposalMemberEmail := "coolguy@rocketpool.net" + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, proposalMessage, proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + + // Increase time until proposal voting delay has passed + voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) + if err != nil { + t.Fatal(err) + } + if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { + t.Fatal(err) + } + + // Vote on & execute proposal + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, trustedNodeAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Submit invite member proposal & cancel it + cancelledProposalId, _, err := trustednodedao.ProposeInviteMember(rp, "cancel this", nodeAccount.Address, "cancel", "cancel@rocketpool.net", trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.CancelProposal(rp, cancelledProposalId, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated proposal details + if proposals, err := dao.GetProposals(rp, nil); err != nil { + t.Error(err) + } else if len(proposals) != 2 { + t.Error("Incorrect updated proposal count") + } else if proposals[0].ID != proposalId || proposals[1].ID != cancelledProposalId { + t.Error("Incorrect proposal indexes") + } + if proposals, err := dao.GetProposalsWithMember(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(proposals) != 2 { + t.Error("Incorrect updated proposal count") + } else { + + // Passed proposal + proposal := proposals[0] + if proposal.ID != proposalId { + t.Errorf("Incorrect proposal ID %d", proposal.ID) + } + if proposal.DAO != proposalDaoName { + t.Errorf("Incorrect proposal DAO %s", proposal.DAO) + } + if !bytes.Equal(proposal.ProposerAddress.Bytes(), trustedNodeAccount1.Address.Bytes()) { + t.Errorf("Incorrect proposal proposer address %s", proposal.ProposerAddress.Hex()) + } + if proposal.Message != proposalMessage { + t.Errorf("Incorrect proposal message %s", proposal.Message) + } + if proposal.CreatedTime == 0 { + t.Errorf("Incorrect proposal created time %d", proposal.CreatedTime) + } + if proposal.StartTime <= proposal.CreatedTime { + t.Errorf("Incorrect proposal start time %d", proposal.StartTime) + } + if proposal.EndTime <= proposal.StartTime { + t.Errorf("Incorrect proposal end time %d", proposal.EndTime) + } + if proposal.ExpiryTime <= proposal.EndTime { + t.Errorf("Incorrect proposal expiry time %d", proposal.ExpiryTime) + } + if proposal.VotesRequired == 0.0 { + t.Errorf("Incorrect proposal required votes %f", proposal.VotesRequired) + } + if proposal.VotesFor != 2.0 { + t.Errorf("Incorrect proposal votes for %f", proposal.VotesFor) + } + if proposal.VotesAgainst != 0.0 { + t.Errorf("Incorrect proposal votes against %f", proposal.VotesAgainst) + } + if !proposal.MemberVoted { + t.Error("Incorrect proposal member voted status") + } + if !proposal.MemberSupported { + t.Error("Incorrect proposal member supported status") + } + if proposal.IsCancelled { + t.Error("Incorrect proposal cancelled status") + } + if !proposal.IsExecuted { + t.Error("Incorrect proposal executed status") + } + if proposal.PayloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", proposal.PayloadStr) + } + if proposal.State != rptypes.Executed { + t.Errorf("Incorrect proposal state %s", proposal.State.String()) + } + + // Cancelled proposal + cancelledProposal := proposals[1] + if cancelledProposal.ID != cancelledProposalId { + t.Errorf("Incorrect cancelled proposal ID %d", cancelledProposal.ID) + } + if !cancelledProposal.IsCancelled { + t.Error("Incorrect cancelled proposal cancelled status") + } + + } + if daoProposals, err := dao.GetDAOProposals(rp, proposalDaoName, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 2 { + t.Error("Incorrect updated DAO proposal count") + } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { + t.Error("Incorrect DAO proposal indexes") + } + if daoProposals, err := dao.GetDAOProposalsWithMember(rp, proposalDaoName, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if len(daoProposals) != 2 { + t.Error("Incorrect updated DAO proposal count") + } else if daoProposals[0].ID != proposalId || daoProposals[1].ID != cancelledProposalId { + t.Error("Incorrect DAO proposal indexes") + } } - diff --git a/tests/dao/trustednode/dao_test.go b/tests/dao/trustednode/dao_test.go index ad08a5f4c..752914252 100644 --- a/tests/dao/trustednode/dao_test.go +++ b/tests/dao/trustednode/dao_test.go @@ -16,133 +16,172 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestMemberDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Disable min commission rate for unbonded pools - if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check minimum member count - if minMemberCount, err := trustednodedao.GetMinimumMemberCount(rp, nil); err != nil { - t.Error(err) - } else if minMemberCount == 0 { - t.Error("Incorrect trusted node DAO minimum member count") - } - - // Get & check initial member details - if members, err := trustednodedao.GetMembers(rp, nil); err != nil { - t.Error(err) - } else if len(members) != 0 { - t.Error("Incorrect initial trusted node DAO member count") - } - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount2.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount3.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Bootstrap trusted node DAO member - memberId := "coolguy" - memberEmail := "coolguy@rocketpool.net" - if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount1.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount2.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount3.Address, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get RPL bond amount - rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) - if err != nil { t.Fatal(err) } - - // Mint trusted node RPL bond & join trusted node DAO - if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - if _, err := trustednodedao.Join(rp, trustedNodeAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - if _, err := trustednodedao.Join(rp, trustedNodeAccount2.GetTransactor()); err != nil { - t.Fatal(err) - } - if _, err := trustednodedao.Join(rp, trustedNodeAccount3.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Submit a proposal - if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Create an unbonded minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount1, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } - - // Get & check updated member details - if members, err := trustednodedao.GetMembers(rp, nil); err != nil { - t.Error(err) - } else if len(members) != 3 { - t.Error("Incorrect updated trusted node DAO member count") - } else { - member := members[0] - if !bytes.Equal(member.Address.Bytes(), trustedNodeAccount1.Address.Bytes()) { - t.Errorf("Incorrect member address %s", member.Address.Hex()) - } - if !member.Exists { - t.Error("Incorrect member exists status") - } - if member.ID != memberId { - t.Errorf("Incorrect member ID %s", member.ID) - } - if member.Url != memberEmail { - t.Errorf("Incorrect member email %s", member.Url) - } - if member.JoinedTime == 0 { - t.Errorf("Incorrect member joined time %d", member.JoinedTime) - } - if member.LastProposalTime == 0 { - t.Errorf("Incorrect member last proposal time %d", member.LastProposalTime) - } - if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { - t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) - } - /* TEMPORARILY DISABLED - if member.UnbondedValidatorCount != 1 { - t.Errorf("Incorrect member unbonded validator count %d", member.UnbondedValidatorCount) - } - */ - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check minimum member count + if minMemberCount, err := trustednodedao.GetMinimumMemberCount(rp, nil); err != nil { + t.Error(err) + } else if minMemberCount == 0 { + t.Error("Incorrect trusted node DAO minimum member count") + } + + // Get & check initial member details + if members, err := trustednodedao.GetMembers(rp, nil); err != nil { + t.Error(err) + } else if len(members) != 0 { + t.Error("Incorrect initial trusted node DAO member count") + } + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount3.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Bootstrap trusted node DAO member + memberId := "coolguy" + memberEmail := "coolguy@rocketpool.net" + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount1.Address, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount2.Address, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.BootstrapMember(rp, memberId, memberEmail, trustedNodeAccount3.Address, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get RPL bond amount + rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Mint trusted node RPL bond & join trusted node DAO + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.Join(rp, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.Join(rp, trustedNodeAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.Join(rp, trustedNodeAccount3.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Submit a proposal + if _, _, err := trustednodedao.ProposeMemberLeave(rp, "bye", trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Create an unbonded minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount1, eth.EthToWei(16), 1); err != nil { + t.Fatal(err) + } + + // Get & check updated member details + if members, err := trustednodedao.GetMembers(rp, nil); err != nil { + t.Error(err) + } else if len(members) != 3 { + t.Error("Incorrect updated trusted node DAO member count") + } else { + member := members[0] + if !bytes.Equal(member.Address.Bytes(), trustedNodeAccount1.Address.Bytes()) { + t.Errorf("Incorrect member address %s", member.Address.Hex()) + } + if !member.Exists { + t.Error("Incorrect member exists status") + } + if member.ID != memberId { + t.Errorf("Incorrect member ID %s", member.ID) + } + if member.Url != memberEmail { + t.Errorf("Incorrect member email %s", member.Url) + } + if member.JoinedTime == 0 { + t.Errorf("Incorrect member joined time %d", member.JoinedTime) + } + if member.LastProposalTime == 0 { + t.Errorf("Incorrect member last proposal time %d", member.LastProposalTime) + } + if member.RPLBondAmount.Cmp(rplBondAmount) != 0 { + t.Errorf("Incorrect member RPL bond amount %s", member.RPLBondAmount.String()) + } + /* TEMPORARILY DISABLED + if member.UnbondedValidatorCount != 1 { + t.Errorf("Incorrect member unbonded validator count %d", member.UnbondedValidatorCount) + } + */ + } } - func TestUpgradeContract(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Upgrade contract - contractName := "rocketDepositPool" - contractNewAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - contractNewAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" - if _, err := trustednodedao.BootstrapUpgrade(rp, "upgradeContract", contractName, contractNewAbi, contractNewAddress, ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated contract details - if contractAddress, err := rp.GetAddress(contractName); err != nil { - t.Error(err) - } else if !bytes.Equal(contractAddress.Bytes(), contractNewAddress.Bytes()) { - t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) - } - if contractAbi, err := rp.GetABI(contractName); err != nil { - t.Error(err) - } else if _, ok := contractAbi.Methods["foo"]; !ok { - t.Errorf("Incorrect updated contract ABI") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Upgrade contract + contractName := "rocketDepositPool" + contractNewAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + contractNewAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + if _, err := trustednodedao.BootstrapUpgrade(rp, "upgradeContract", contractName, contractNewAbi, contractNewAddress, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated contract details + if contractAddress, err := rp.GetAddress(contractName); err != nil { + t.Error(err) + } else if !bytes.Equal(contractAddress.Bytes(), contractNewAddress.Bytes()) { + t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) + } + if contractAbi, err := rp.GetABI(contractName); err != nil { + t.Error(err) + } else if _, ok := contractAbi.Methods["foo"]; !ok { + t.Errorf("Incorrect updated contract ABI") + } } - diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index 1bd59f3b1..32c099de1 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -14,46 +14,57 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount1 *accounts.Account - trustedNodeAccount2 *accounts.Account - trustedNodeAccount3 *accounts.Account - trustedNodeAccount4 *accounts.Account - nodeAccount *accounts.Account -) + client *uc.EthClientProxy + rp *rocketpool.RocketPool + ownerAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account + trustedNodeAccount4 *accounts.Account + nodeAccount *accounts.Account +) func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount1, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - trustedNodeAccount2, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - trustedNodeAccount3, err = accounts.GetAccount(3) - if err != nil { log.Fatal(err) } - trustedNodeAccount4, err = accounts.GetAccount(4) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(5) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error -} + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount4, err = accounts.GetAccount(4) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(5) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) + +} diff --git a/tests/dao/trustednode/proposals_test.go b/tests/dao/trustednode/proposals_test.go index 9a89fd640..29da3e732 100644 --- a/tests/dao/trustednode/proposals_test.go +++ b/tests/dao/trustednode/proposals_test.go @@ -20,221 +20,302 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestProposeInviteMember(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Submit, pass & execute invite member proposal - proposalMemberAddress := nodeAccount.Address - proposalMemberId := "coolguy" - proposalMemberEmail := "coolguy@rocketpool.net" - proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } - - // Get & check initial member exists status - if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if exists { - t.Error("Incorrect initial member exists status") - } - - // Mint trusted node RPL bond & join trusted node DAO - if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, nodeAccount); err != nil { t.Fatal(err) } - if _, err := trustednodedao.Join(rp, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated member exists status - if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Incorrect updated member exists status") - } - - // Get & check proposal payload string - if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { - t.Error(err) - } else if payloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { - t.Errorf("Incorrect proposal payload string %s", payloadStr) - } - - // Get & check member invite executed block - if inviteExecutedTime, err := trustednodedao.GetMemberInviteProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { - t.Error(err) - } else if inviteExecutedTime == 0 { - t.Errorf("Incorrect member invite proposal executed time %d", inviteExecutedTime) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Submit, pass & execute invite member proposal + proposalMemberAddress := nodeAccount.Address + proposalMemberId := "coolguy" + proposalMemberEmail := "coolguy@rocketpool.net" + proposalId, _, err := trustednodedao.ProposeInviteMember(rp, "invite coolguy", proposalMemberAddress, proposalMemberId, proposalMemberEmail, trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Fatal(err) + } + + // Get & check initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect initial member exists status") + } + + // Mint trusted node RPL bond & join trusted node DAO + if err := nodeutils.MintTrustedNodeBond(rp, ownerAccount, nodeAccount); err != nil { + t.Fatal(err) + } + if _, err := trustednodedao.Join(rp, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect updated member exists status") + } + + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalInvite(%s,%s,%s)", proposalMemberId, proposalMemberEmail, proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } + + // Get & check member invite executed block + if inviteExecutedTime, err := trustednodedao.GetMemberInviteProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { + t.Error(err) + } else if inviteExecutedTime == 0 { + t.Errorf("Incorrect member invite proposal executed time %d", inviteExecutedTime) + } } - func TestProposeMemberLeave(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount4); err != nil { t.Fatal(err) } - - // Submit, pass & execute member leave proposal - proposalMemberAddress := trustedNodeAccount1.Address - proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "node 1 leave", proposalMemberAddress, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{ - trustedNodeAccount1, - trustedNodeAccount2, - trustedNodeAccount3, - trustedNodeAccount4, - }); err != nil { t.Fatal(err) } - - // Get & check member leave executed time - if leaveExecutedTime, err := trustednodedao.GetMemberLeaveProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { - t.Error(err) - } else if leaveExecutedTime == 0 { - t.Errorf("Incorrect member leave proposal executed time %d", leaveExecutedTime) - } - - // Get & check initial member exists status - if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Incorrect initial member exists status") - } - - // Leave trusted node DAO - if _, err := trustednodedao.Leave(rp, trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated member exists status - if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { - t.Error(err) - } else if exists { - t.Error("Incorrect updated member exists status") - } - - // Get & check proposal payload string - if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { - t.Error(err) - } else if payloadStr != fmt.Sprintf("proposalLeave(%s)", proposalMemberAddress.Hex()) { - t.Errorf("Incorrect proposal payload string %s", payloadStr) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register nodes + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount4); err != nil { + t.Fatal(err) + } + + // Submit, pass & execute member leave proposal + proposalMemberAddress := trustedNodeAccount1.Address + proposalId, _, err := trustednodedao.ProposeMemberLeave(rp, "node 1 leave", proposalMemberAddress, trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{ + trustedNodeAccount1, + trustedNodeAccount2, + trustedNodeAccount3, + trustedNodeAccount4, + }); err != nil { + t.Fatal(err) + } + + // Get & check member leave executed time + if leaveExecutedTime, err := trustednodedao.GetMemberLeaveProposalExecutedTime(rp, proposalMemberAddress, nil); err != nil { + t.Error(err) + } else if leaveExecutedTime == 0 { + t.Errorf("Incorrect member leave proposal executed time %d", leaveExecutedTime) + } + + // Get & check initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial member exists status") + } + + // Leave trusted node DAO + if _, err := trustednodedao.Leave(rp, trustedNodeAccount1.Address, trustedNodeAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount1.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated member exists status") + } + + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalLeave(%s)", proposalMemberAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } } - func TestProposeKickMember(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register nodes - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Get & check initial member exists status - if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Incorrect initial member exists status") - } - - // Submit, pass & execute kick member proposal - proposalMemberAddress := trustedNodeAccount2.Address - proposalFineAmount := eth.EthToWei(1000) - proposalId, _, err := trustednodedao.ProposeKickMember(rp, "kick node 2", proposalMemberAddress, proposalFineAmount, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } - - // Get & check updated member exists status - if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { - t.Error(err) - } else if exists { - t.Error("Incorrect updated member exists status") - } - - // Get & check proposal payload string - if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { - t.Error(err) - } else if payloadStr != fmt.Sprintf("proposalKick(%s,%s)", proposalMemberAddress.Hex(), proposalFineAmount.String()) { - t.Errorf("Incorrect proposal payload string %s", payloadStr) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register nodes + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Get & check initial member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial member exists status") + } + + // Submit, pass & execute kick member proposal + proposalMemberAddress := trustedNodeAccount2.Address + proposalFineAmount := eth.EthToWei(1000) + proposalId, _, err := trustednodedao.ProposeKickMember(rp, "kick node 2", proposalMemberAddress, proposalFineAmount, trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Fatal(err) + } + + // Get & check updated member exists status + if exists, err := trustednodedao.GetMemberExists(rp, trustedNodeAccount2.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated member exists status") + } + + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalKick(%s,%s)", proposalMemberAddress.Hex(), proposalFineAmount.String()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } } - func TestProposeUpgradeContract(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Submit, pass & execute upgrade contract proposal - proposalUpgradeType := "upgradeContract" - proposalContractName := "rocketDepositPool" - proposalContractAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - proposalContractAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" - proposalId, _, err := trustednodedao.ProposeUpgradeContract(rp, "upgrade rocketDepositPool", proposalUpgradeType, proposalContractName, proposalContractAbi, proposalContractAddress, trustedNodeAccount1.GetTransactor()) - if err != nil { t.Fatal(err) } - if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { t.Fatal(err) } - - // Get & check updated contract details - if contractAddress, err := rp.GetAddress(proposalContractName); err != nil { - t.Error(err) - } else if !bytes.Equal(contractAddress.Bytes(), proposalContractAddress.Bytes()) { - t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) - } - if contractAbi, err := rp.GetABI(proposalContractName); err != nil { - t.Error(err) - } else if _, ok := contractAbi.Methods["foo"]; !ok { - t.Errorf("Incorrect updated contract ABI") - } - - // Get & check proposal payload string - if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { - t.Error(err) - } else if encodedAbi, err := rocketpool.EncodeAbiStr(proposalContractAbi); err != nil { - t.Error(err) - } else if payloadStr != fmt.Sprintf("proposalUpgrade(%s,%s,%s,%s)", proposalUpgradeType, proposalContractName, encodedAbi, proposalContractAddress.Hex()) { - t.Errorf("Incorrect proposal payload string %s", payloadStr) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednodesettings.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednodesettings.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Submit, pass & execute upgrade contract proposal + proposalUpgradeType := "upgradeContract" + proposalContractName := "rocketDepositPool" + proposalContractAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + proposalContractAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + proposalId, _, err := trustednodedao.ProposeUpgradeContract(rp, "upgrade rocketDepositPool", proposalUpgradeType, proposalContractName, proposalContractAbi, proposalContractAddress, trustedNodeAccount1.GetTransactor()) + if err != nil { + t.Fatal(err) + } + if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Fatal(err) + } + + // Get & check updated contract details + if contractAddress, err := rp.GetAddress(proposalContractName); err != nil { + t.Error(err) + } else if !bytes.Equal(contractAddress.Bytes(), proposalContractAddress.Bytes()) { + t.Errorf("Incorrect updated contract address %s", contractAddress.Hex()) + } + if contractAbi, err := rp.GetABI(proposalContractName); err != nil { + t.Error(err) + } else if _, ok := contractAbi.Methods["foo"]; !ok { + t.Errorf("Incorrect updated contract ABI") + } + + // Get & check proposal payload string + if payloadStr, err := dao.GetProposalPayloadStr(rp, proposalId, nil); err != nil { + t.Error(err) + } else if encodedAbi, err := rocketpool.EncodeAbiStr(proposalContractAbi); err != nil { + t.Error(err) + } else if payloadStr != fmt.Sprintf("proposalUpgrade(%s,%s,%s,%s)", proposalUpgradeType, proposalContractName, encodedAbi, proposalContractAddress.Hex()) { + t.Errorf("Incorrect proposal payload string %s", payloadStr) + } } - diff --git a/tests/deposit/deposit_test.go b/tests/deposit/deposit_test.go index 672064a87..ad2362ebb 100644 --- a/tests/deposit/deposit_test.go +++ b/tests/deposit/deposit_test.go @@ -12,76 +12,95 @@ import ( minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" ) - func TestDeposit(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Make deposit - opts := userAccount.GetTransactor() - opts.Value = eth.EthToWei(10) - if _, err := deposit.Deposit(rp, opts); err != nil { - t.Fatal(err) - } - - // Get & check deposit pool balance - if balance, err := deposit.GetBalance(rp, nil); err != nil { - t.Error(err) - } else if balance.Cmp(opts.Value) != 0 { - t.Error("Incorrect deposit pool balance") - } - - // Get & check deposit pool excess balance - if excessBalance, err := deposit.GetExcessBalance(rp, nil); err != nil { - t.Error(err) - } else if excessBalance.Cmp(opts.Value) != 0 { - t.Error("Incorrect deposit pool excess balance") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Make deposit + opts := userAccount.GetTransactor() + opts.Value = eth.EthToWei(10) + if _, err := deposit.Deposit(rp, opts); err != nil { + t.Fatal(err) + } + + // Get & check deposit pool balance + if balance, err := deposit.GetBalance(rp, nil); err != nil { + t.Error(err) + } else if balance.Cmp(opts.Value) != 0 { + t.Error("Incorrect deposit pool balance") + } + + // Get & check deposit pool excess balance + if excessBalance, err := deposit.GetExcessBalance(rp, nil); err != nil { + t.Error(err) + } else if excessBalance.Cmp(opts.Value) != 0 { + t.Error("Incorrect deposit pool excess balance") + } } - func TestAssignDeposits(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Disable deposit assignments - if _, err := protocol.BootstrapAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Make user deposit - userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = eth.EthToWei(32) - if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - - // Register node & create minipool - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } - - // Re-enable deposit assignments - if _, err := protocol.BootstrapAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get initial deposit pool balance - balance1, err := deposit.GetBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - - // Assign deposits - if _, err := deposit.AssignDeposits(rp, userAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated deposit pool balance - balance2, err := deposit.GetBalance(rp, nil) - if err != nil { - t.Fatal(err) - } else if balance2.Cmp(balance1) != -1 { - t.Error("Deposit pool balance did not decrease after assigning deposits") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Disable deposit assignments + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, false, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Make user deposit + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = eth.EthToWei(32) + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { + t.Fatal(err) + } + + // Register node & create minipool + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { + t.Fatal(err) + } + + // Re-enable deposit assignments + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, true, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get initial deposit pool balance + balance1, err := deposit.GetBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Assign deposits + if _, err := deposit.AssignDeposits(rp, userAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated deposit pool balance + balance2, err := deposit.GetBalance(rp, nil) + if err != nil { + t.Fatal(err) + } else if balance2.Cmp(balance1) != -1 { + t.Error("Deposit pool balance did not decrease after assigning deposits") + } } - diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index ef3f3bb6c..bd3960137 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -14,37 +14,42 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account - nodeAccount *accounts.Account - userAccount *accounts.Account + ownerAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + userAccount, err = accounts.GetAccount(9) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index 052e10c54..b044b0bb8 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -26,586 +26,732 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) - func TestDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Get current network node fee - networkNodeFee, err := network.GetNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) - if err != nil { t.Fatal(err) } - - // Make user deposit - depositOpts := userAccount.GetTransactor(); - depositOpts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check minipool details - if status, err := mp.GetStatusDetails(nil); err != nil { - t.Error(err) - } else { - if status.Status != rptypes.Withdrawable { - t.Errorf("Incorrect minipool status %s", status.Status.String()) - } - if status.StatusBlock == 0 { - t.Errorf("Incorrect minipool status block %d", status.StatusBlock) - } - if status.StatusTime.Unix() == 0 { - t.Errorf("Incorrect minipool status time %v", status.StatusTime) - } - } - if depositType, err := mp.GetDepositType(nil); err != nil { - t.Error(err) - } else if depositType != rptypes.Full { - t.Errorf("Incorrect minipool deposit type %s", depositType.String()) - } - if node, err := mp.GetNodeDetails(nil); err != nil { - t.Error(err) - } else { - if !bytes.Equal(node.Address.Bytes(), nodeAccount.Address.Bytes()) { - t.Errorf("Incorrect minipool node address %s", node.Address.Hex()) - } - if node.Fee != networkNodeFee { - t.Errorf("Incorrect minipool node fee %f", node.Fee) - } - if node.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect minipool node deposit balance %s", node.DepositBalance.String()) - } - if node.RefundBalance.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect minipool node refund balance %s", node.RefundBalance.String()) - } - if !node.DepositAssigned { - t.Error("Incorrect minipool node deposit assigned status") - } - } - if user, err := mp.GetUserDetails(nil); err != nil { - t.Error(err) - } else { - if user.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect minipool user deposit balance %s", user.DepositBalance.String()) - } - if !user.DepositAssigned { - t.Error("Incorrect minipool user deposit assigned status") - } - if user.DepositAssignedTime.Unix() == 0 { - t.Errorf("Incorrect minipool user deposit assigned time %v", user.DepositAssignedTime) - } - } - if withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil); err != nil { - t.Error(err) - } else { - withdrawalPrefix := byte(1) - padding := make([]byte, 11) - expectedWithdrawalCredentials := bytes.Join([][]byte{[]byte{withdrawalPrefix}, padding, mp.Address.Bytes()}, []byte{}) - if !bytes.Equal(withdrawalCredentials.Bytes(), expectedWithdrawalCredentials) { - t.Errorf("Incorrect minipool withdrawal credentials %s", hex.EncodeToString(withdrawalCredentials.Bytes())) - } - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Get current network node fee + networkNodeFee, err := network.GetNodeFee(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) + if err != nil { + t.Fatal(err) + } + + // Make user deposit + depositOpts := userAccount.GetTransactor() + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check minipool details + if status, err := mp.GetStatusDetails(nil); err != nil { + t.Error(err) + } else { + if status.Status != rptypes.Withdrawable { + t.Errorf("Incorrect minipool status %s", status.Status.String()) + } + if status.StatusBlock == 0 { + t.Errorf("Incorrect minipool status block %d", status.StatusBlock) + } + if status.StatusTime.Unix() == 0 { + t.Errorf("Incorrect minipool status time %v", status.StatusTime) + } + } + if depositType, err := mp.GetDepositType(nil); err != nil { + t.Error(err) + } else if depositType != rptypes.Full { + t.Errorf("Incorrect minipool deposit type %s", depositType.String()) + } + if node, err := mp.GetNodeDetails(nil); err != nil { + t.Error(err) + } else { + if !bytes.Equal(node.Address.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect minipool node address %s", node.Address.Hex()) + } + if node.Fee != networkNodeFee { + t.Errorf("Incorrect minipool node fee %f", node.Fee) + } + if node.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool node deposit balance %s", node.DepositBalance.String()) + } + if node.RefundBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool node refund balance %s", node.RefundBalance.String()) + } + if !node.DepositAssigned { + t.Error("Incorrect minipool node deposit assigned status") + } + } + if user, err := mp.GetUserDetails(nil); err != nil { + t.Error(err) + } else { + if user.DepositBalance.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect minipool user deposit balance %s", user.DepositBalance.String()) + } + if !user.DepositAssigned { + t.Error("Incorrect minipool user deposit assigned status") + } + if user.DepositAssignedTime.Unix() == 0 { + t.Errorf("Incorrect minipool user deposit assigned time %v", user.DepositAssignedTime) + } + } + if withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil); err != nil { + t.Error(err) + } else { + withdrawalPrefix := byte(1) + padding := make([]byte, 11) + expectedWithdrawalCredentials := bytes.Join([][]byte{{withdrawalPrefix}, padding, mp.Address.Bytes()}, []byte{}) + if !bytes.Equal(withdrawalCredentials.Bytes(), expectedWithdrawalCredentials) { + t.Errorf("Incorrect minipool withdrawal credentials %s", hex.EncodeToString(withdrawalCredentials.Bytes())) + } + } } - func TestRefund(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) - if err != nil { t.Fatal(err) } - - // Make user deposit - depositOpts := userAccount.GetTransactor(); - depositOpts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } - - // Get initial node refund balance - nodeRefundBalance1, err := mp.GetNodeRefundBalance(nil) - if err != nil { - t.Fatal(err) - } - - // Refund - if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated node refund balance - nodeRefundBalance2, err := mp.GetNodeRefundBalance(nil) - if err != nil { - t.Fatal(err) - } else if nodeRefundBalance2.Cmp(nodeRefundBalance1) != -1 { - t.Error("Node refund balance did not decrease after refunding from minipool") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) + if err != nil { + t.Fatal(err) + } + + // Make user deposit + depositOpts := userAccount.GetTransactor() + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { + t.Fatal(err) + } + + // Get initial node refund balance + nodeRefundBalance1, err := mp.GetNodeRefundBalance(nil) + if err != nil { + t.Fatal(err) + } + + // Refund + if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node refund balance + nodeRefundBalance2, err := mp.GetNodeRefundBalance(nil) + if err != nil { + t.Fatal(err) + } else if nodeRefundBalance2.Cmp(nodeRefundBalance1) != -1 { + t.Error("Node refund balance did not decrease after refunding from minipool") + } } - func TestStake(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) - if err != nil { t.Fatal(err) } - - // Get validator & deposit data - validatorPubkey, err := validator.GetValidatorPubkey(1) - if err != nil { t.Fatal(err) } - withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) - if err != nil { t.Fatal(err) } - validatorSignature, err := validator.GetValidatorSignature(1) - if err != nil { t.Fatal(err) } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) - if err != nil { t.Fatal(err) } - - // Get & check initial minipool status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) - } else if status != rptypes.Prelaunch { - t.Errorf("Incorrect initial minipool status %s", status.String()) - } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if _, err := mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated minipool status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) - } else if status != rptypes.Staking { - t.Errorf("Incorrect updated minipool status %s", status.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) + if err != nil { + t.Fatal(err) + } + + // Get validator & deposit data + validatorPubkey, err := validator.GetValidatorPubkey(1) + if err != nil { + t.Fatal(err) + } + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) + if err != nil { + t.Fatal(err) + } + validatorSignature, err := validator.GetValidatorSignature(1) + if err != nil { + t.Fatal(err) + } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) + if err != nil { + t.Fatal(err) + } + + // Get & check initial minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Prelaunch { + t.Errorf("Incorrect initial minipool status %s", status.String()) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if _, err := mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Staking { + t.Errorf("Incorrect updated minipool status %s", status.String()) + } } - - func TestDissolve(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Get & check initial minipool status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) - } else if status != rptypes.Initialized { - t.Errorf("Incorrect initial minipool status %s", status.String()) - } - - // Dissolve minipool - if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated minipool status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) - } else if status != rptypes.Dissolved { - t.Errorf("Incorrect updated minipool status %s", status.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Get & check initial minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Initialized { + t.Errorf("Incorrect initial minipool status %s", status.String()) + } + + // Dissolve minipool + if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else if status != rptypes.Dissolved { + t.Errorf("Incorrect updated minipool status %s", status.String()) + } } - func TestClose(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Dissolve minipool - if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check initial minipool exists status - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Incorrect initial minipool exists status") - } - - // Simulate a post-merge withdrawal by sending 16 ETH to the minipool - opts := nodeAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - hash, err := eth.SendTransaction(rp.Client, mp.Address, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 - if err != nil { - t.Errorf("Error sending ETH to minipool: %s", err.Error()) - } - utils.WaitForTransaction(rp.Client, hash) - - // Close minipool - if _, err := mp.Close(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated minipool exists status - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if exists { - t.Error("Incorrect updated minipool exists status") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Dissolve minipool + if _, err := mp.Dissolve(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check initial minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Incorrect initial minipool exists status") + } + + // Simulate a post-merge withdrawal by sending 16 ETH to the minipool + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + hash, err := eth.SendTransaction(rp.Client, mp.Address, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 + if err != nil { + t.Errorf("Error sending ETH to minipool: %s", err.Error()) + } + utils.WaitForTransaction(rp.Client, hash) + + // Close minipool + if _, err := mp.Close(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated minipool exists status + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Incorrect updated minipool exists status") + } } - func TestFinalise(t *testing.T) { - // TODO + // TODO } - func TestWithdrawValidatorBalance(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Make user deposit - userDepositAmount := eth.EthToWei(16) - userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = userDepositAmount - if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get initial token contract ETH balances - rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - - // Withdraw minipool validator balance - opts := swcAccount.GetTransactor() - opts.Value = eth.EthToWei(32) - if _, err := mp.Contract.Transfer(opts); err != nil { - t.Fatal(err) - } - - // Get node balances before withdrawal - nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Call ProcessWithdrawal method - if _, err := mp.DistributeBalance(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Call refund method to withdraw node's balance - if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated node ETH balances - if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { - t.Fatal(err) - } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { - t.Error("node ETH balance did not increase after processing withdrawal") - } - - // Get & check updated token contract ETH balances - if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { - t.Error("rETH contract ETH balance did not increase after processing withdrawal") - } - - // Get & check rETH collateral amount & rate - if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { - t.Fatal(err) - } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { - t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) - } - if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { - t.Fatal(err) - } else if rethCollateralRate != 1 { - t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) - } - - // Confirm the minipool still exists - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Minipool no longer exists but it should") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Make user deposit + userDepositAmount := eth.EthToWei(16) + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = userDepositAmount + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get initial token contract ETH balances + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Withdraw minipool validator balance + opts := swcAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + if _, err := mp.Contract.Transfer(opts); err != nil { + t.Fatal(err) + } + + // Get node balances before withdrawal + nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Call ProcessWithdrawal method + if _, err := mp.DistributeBalance(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Call refund method to withdraw node's balance + if _, err := mp.Refund(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node ETH balances + if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { + t.Fatal(err) + } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { + t.Error("node ETH balance did not increase after processing withdrawal") + } + + // Get & check updated token contract ETH balances + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + + // Get & check rETH collateral amount & rate + if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { + t.Fatal(err) + } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { + t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) + } + if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { + t.Fatal(err) + } else if rethCollateralRate != 1 { + t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } + + // Confirm the minipool still exists + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Minipool no longer exists but it should") + } } - func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Make user deposit - userDepositAmount := eth.EthToWei(16) - userDepositOpts := userAccount.GetTransactor() - userDepositOpts.Value = userDepositAmount - if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Set minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get initial token contract ETH balances - rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) - if err != nil { - t.Fatal(err) - } - - // Withdraw minipool validator balance - opts := swcAccount.GetTransactor() - opts.Value = eth.EthToWei(32) - if _, err := mp.Contract.Transfer(opts); err != nil { - t.Fatal(err) - } - - // Get node balances before withdrawal - nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Call DistributeBalanceAndFinalise method - if _, err := mp.DistributeBalanceAndFinalise(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated node ETH balances - if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { - t.Fatal(err) - } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { - t.Error("node ETH balance did not increase after processing withdrawal") - } - - // Get & check updated token contract ETH balances - if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { - t.Fatal(err) - } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { - t.Error("rETH contract ETH balance did not increase after processing withdrawal") - } - - // Get & check rETH collateral amount & rate - if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { - t.Fatal(err) - } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { - t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) - } - if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { - t.Fatal(err) - } else if rethCollateralRate != 0.1 { - t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) - } - - // Confirm the minipool still exists - if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { - t.Error(err) - } else if !exists { - t.Error("Minipool doesn't exist but it should") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Make user deposit + userDepositAmount := eth.EthToWei(16) + userDepositOpts := userAccount.GetTransactor() + userDepositOpts.Value = userDepositAmount + if _, err := deposit.Deposit(rp, userDepositOpts); err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Set minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get initial token contract ETH balances + rethContractBalance1, err := tokens.GetRETHContractETHBalance(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Withdraw minipool validator balance + opts := swcAccount.GetTransactor() + opts.Value = eth.EthToWei(32) + if _, err := mp.Contract.Transfer(opts); err != nil { + t.Fatal(err) + } + + // Get node balances before withdrawal + nodeBalance1, err := tokens.GetBalances(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Call DistributeBalanceAndFinalise method + if _, err := mp.DistributeBalanceAndFinalise(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node ETH balances + if nodeBalance2, err := tokens.GetBalances(rp, nodeAccount.Address, nil); err != nil { + t.Fatal(err) + } else if nodeBalance2.ETH.Cmp(nodeBalance1.ETH) != 1 { + t.Error("node ETH balance did not increase after processing withdrawal") + } + + // Get & check updated token contract ETH balances + if rethContractBalance2, err := tokens.GetRETHContractETHBalance(rp, nil); err != nil { + t.Fatal(err) + } else if rethContractBalance2.Cmp(rethContractBalance1) != 1 { + t.Error("rETH contract ETH balance did not increase after processing withdrawal") + } + + // Get & check rETH collateral amount & rate + if rethTotalCollateral, err := tokens.GetRETHTotalCollateral(rp, nil); err != nil { + t.Fatal(err) + } else if rethTotalCollateral.Cmp(userDepositAmount) != 0 { + t.Errorf("Incorrect rETH total collateral amount %s", rethTotalCollateral.String()) + } + if rethCollateralRate, err := tokens.GetRETHCollateralRate(rp, nil); err != nil { + t.Fatal(err) + } else if rethCollateralRate != 0.1 { + t.Errorf("Incorrect rETH collateral rate %f", rethCollateralRate) + } + + // Confirm the minipool still exists + if exists, err := minipool.GetMinipoolExists(rp, mp.Address, nil); err != nil { + t.Error(err) + } else if !exists { + t.Error("Minipool doesn't exist but it should") + } } - func TestDelegateUpgradeAndRollback(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Get original delegate contract - originalDelegate, err := mp.GetEffectiveDelegate(nil) - if err != nil { t.Fatal(err) } - - newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") - newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" - - // Upgrade the network delegate contract - _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) - if err != nil { t.Fatal(err) } - - // Get new effective delegate - effectiveDelegate, err := mp.GetEffectiveDelegate(nil) - if err != nil { t.Fatal(err) } - - // Check - if effectiveDelegate != originalDelegate { - t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), originalDelegate.Hex()) - } - - // Call upgrade - if _, err := mp.DelegateUpgrade(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Check effective delegate - if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { - t.Fatal(err) - } else if effectiveDelegate != newDelegate { - t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) - } - - // Check previous delegate - if previousDelegate, err := mp.GetPreviousDelegate(nil); err != nil { - t.Fatal(err) - } else if previousDelegate != originalDelegate { - t.Errorf("Previous delegate %s did not match original delegate %s", previousDelegate.Hex(), originalDelegate.Hex()) - } - - // Check current delegate - if currentDelegate, err := mp.GetDelegate(nil); err != nil { - t.Fatal(err) - } else if currentDelegate != newDelegate { - t.Errorf("Current delegate %s did not match new delegate %s", currentDelegate.Hex(), newDelegate.Hex()) - } - - // Rollback - if _, err := mp.DelegateRollback(nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get new effective delegate - if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { - t.Fatal(err) - } else if effectiveDelegate != originalDelegate { - t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Get original delegate contract + originalDelegate, err := mp.GetEffectiveDelegate(nil) + if err != nil { + t.Fatal(err) + } + + newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") + newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + + // Upgrade the network delegate contract + _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) + if err != nil { + t.Fatal(err) + } + + // Get new effective delegate + effectiveDelegate, err := mp.GetEffectiveDelegate(nil) + if err != nil { + t.Fatal(err) + } + + // Check + if effectiveDelegate != originalDelegate { + t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), originalDelegate.Hex()) + } + + // Call upgrade + if _, err := mp.DelegateUpgrade(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check effective delegate + if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != newDelegate { + t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } + + // Check previous delegate + if previousDelegate, err := mp.GetPreviousDelegate(nil); err != nil { + t.Fatal(err) + } else if previousDelegate != originalDelegate { + t.Errorf("Previous delegate %s did not match original delegate %s", previousDelegate.Hex(), originalDelegate.Hex()) + } + + // Check current delegate + if currentDelegate, err := mp.GetDelegate(nil); err != nil { + t.Fatal(err) + } else if currentDelegate != newDelegate { + t.Errorf("Current delegate %s did not match new delegate %s", currentDelegate.Hex(), newDelegate.Hex()) + } + + // Rollback + if _, err := mp.DelegateRollback(nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get new effective delegate + if effectiveDelegate, err = mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != originalDelegate { + t.Errorf("Effective delegate %s did not match original delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } } func TestUseLatestDelegate(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // New delegate params - newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") - newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" - - // Upgrade the network delegate contract - _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) - if err != nil { t.Fatal(err) } - - // Set use latest delegate - if _, err = mp.SetUseLatestDelegate(true, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get use latest delegate - if useLatest, err := mp.GetUseLatestDelegate(nil); err != nil { - t.Fatal(err) - } else if !useLatest { - t.Error("GetUseLatestDelegate returned false after being set") - } - - // Check effective delegate - if effectiveDelegate, err := mp.GetEffectiveDelegate(nil); err != nil { - t.Fatal(err) - } else if effectiveDelegate != newDelegate { - t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Create minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // New delegate params + newDelegate := common.HexToAddress("0x1111111111111111111111111111111111111111") + newAbi := "[{\"name\":\"foo\",\"type\":\"function\",\"inputs\":[],\"outputs\":[]}]" + + // Upgrade the network delegate contract + _, err = trustednodedao.BootstrapUpgrade(rp, "upgradeContract", "rocketMinipoolDelegate", newAbi, newDelegate, ownerAccount.GetTransactor()) + if err != nil { + t.Fatal(err) + } + + // Set use latest delegate + if _, err = mp.SetUseLatestDelegate(true, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get use latest delegate + if useLatest, err := mp.GetUseLatestDelegate(nil); err != nil { + t.Fatal(err) + } else if !useLatest { + t.Error("GetUseLatestDelegate returned false after being set") + } + + // Check effective delegate + if effectiveDelegate, err := mp.GetEffectiveDelegate(nil); err != nil { + t.Fatal(err) + } else if effectiveDelegate != newDelegate { + t.Errorf("Effective delegate %s did not match new delegate %s", effectiveDelegate.Hex(), newDelegate.Hex()) + } } diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index 61e853e3c..b5a1b1406 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -14,43 +14,52 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - nodeAccount *accounts.Account - userAccount *accounts.Account - swcAccount *accounts.Account -) + client *uc.EthClientProxy + rp *rocketpool.RocketPool + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account + swcAccount *accounts.Account +) func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(8) - if err != nil { log.Fatal(err) } - swcAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error -} + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + userAccount, err = accounts.GetAccount(8) + if err != nil { + log.Fatal(err) + } + swcAccount, err = accounts.GetAccount(9) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) + +} diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index 17998b085..e7f050683 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -18,102 +18,122 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" ) - func TestMinipoolDetails(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Get & check initial minipool details - if minipools, err := minipool.GetMinipools(rp, nil); err != nil { - t.Error(err) - } else if len(minipools) != 0 { - t.Error("Incorrect initial minipool count") - } - if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if len(nodeMinipools) != 0 { - t.Error("Incorrect initial node minipool count") - } - if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if len(nodeMinipoolPubkeys) != 0 { - t.Error("Incorrect initial node minipool pubkeys count") - } - - // Minipool deposit/withdrawal amounts - minipoolDepositAmount := eth.EthToWei(32) - - // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, minipoolDepositAmount, 1) - if err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Mark minipool as withdrawable - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get minipool validator pubkey - validatorPubkey, err := validator.GetValidatorPubkey(1) - if err != nil { t.Fatal(err) } - - // Get & check updated minipool details - if minipools, err := minipool.GetMinipools(rp, nil); err != nil { - t.Error(err) - } else if len(minipools) != 1 { - t.Error("Incorrect updated minipool count") - } else { - mpDetails := minipools[0] - if !bytes.Equal(mpDetails.Address.Bytes(), mp.Address.Bytes()) { - t.Errorf("Incorrect minipool address %s", mpDetails.Address.Hex()) - } - if !mpDetails.Exists { - t.Error("Incorrect minipool exists status") - } - if !bytes.Equal(mpDetails.Pubkey.Bytes(), validatorPubkey.Bytes()) { - t.Errorf("Incorrect minipool validator pubkey %s", mpDetails.Pubkey.Hex()) - } - } - // Check status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) - } else { - if status != types.Withdrawable { - t.Error("Incorrect minipool withdrawable status") - } - } - if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if len(nodeMinipools) != 1 { - t.Error("Incorrect updated node minipool count") - } else if !bytes.Equal(nodeMinipools[0].Address.Bytes(), mp.Address.Bytes()) { - t.Errorf("Incorrect node minipool address %s", nodeMinipools[0].Address.Hex()) - } - if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if len(nodeMinipoolPubkeys) != 1 { - t.Error("Incorrect updated node minipool pubkeys count") - } else if !bytes.Equal(nodeMinipoolPubkeys[0].Bytes(), validatorPubkey.Bytes()) { - t.Errorf("Incorrect node minipool pubkey %s", nodeMinipoolPubkeys[0].Hex()) - } - - // Get & check minipool address by pubkey - if minipoolAddress, err := minipool.GetMinipoolByPubkey(rp, validatorPubkey, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(minipoolAddress.Bytes(), mp.Address.Bytes()) { - t.Errorf("Incorrect minipool address %s for pubkey %s", minipoolAddress.Hex(), validatorPubkey.Hex()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Get & check initial minipool details + if minipools, err := minipool.GetMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(minipools) != 0 { + t.Error("Incorrect initial minipool count") + } + if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipools) != 0 { + t.Error("Incorrect initial node minipool count") + } + if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipoolPubkeys) != 0 { + t.Error("Incorrect initial node minipool pubkeys count") + } + + // Minipool deposit/withdrawal amounts + minipoolDepositAmount := eth.EthToWei(32) + + // Create & stake minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, minipoolDepositAmount, 1) + if err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Mark minipool as withdrawable + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get minipool validator pubkey + validatorPubkey, err := validator.GetValidatorPubkey(1) + if err != nil { + t.Fatal(err) + } + + // Get & check updated minipool details + if minipools, err := minipool.GetMinipools(rp, nil); err != nil { + t.Error(err) + } else if len(minipools) != 1 { + t.Error("Incorrect updated minipool count") + } else { + mpDetails := minipools[0] + if !bytes.Equal(mpDetails.Address.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect minipool address %s", mpDetails.Address.Hex()) + } + if !mpDetails.Exists { + t.Error("Incorrect minipool exists status") + } + if !bytes.Equal(mpDetails.Pubkey.Bytes(), validatorPubkey.Bytes()) { + t.Errorf("Incorrect minipool validator pubkey %s", mpDetails.Pubkey.Hex()) + } + } + // Check status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) + } else { + if status != types.Withdrawable { + t.Error("Incorrect minipool withdrawable status") + } + } + if nodeMinipools, err := minipool.GetNodeMinipools(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipools) != 1 { + t.Error("Incorrect updated node minipool count") + } else if !bytes.Equal(nodeMinipools[0].Address.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect node minipool address %s", nodeMinipools[0].Address.Hex()) + } + if nodeMinipoolPubkeys, err := minipool.GetNodeValidatingMinipoolPubkeys(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if len(nodeMinipoolPubkeys) != 1 { + t.Error("Incorrect updated node minipool pubkeys count") + } else if !bytes.Equal(nodeMinipoolPubkeys[0].Bytes(), validatorPubkey.Bytes()) { + t.Errorf("Incorrect node minipool pubkey %s", nodeMinipoolPubkeys[0].Hex()) + } + + // Get & check minipool address by pubkey + if minipoolAddress, err := minipool.GetMinipoolByPubkey(rp, validatorPubkey, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(minipoolAddress.Bytes(), mp.Address.Bytes()) { + t.Errorf("Incorrect minipool address %s for pubkey %s", minipoolAddress.Hex(), validatorPubkey.Hex()) + } } - diff --git a/tests/minipool/queue_test.go b/tests/minipool/queue_test.go index 310c048d3..b94f58875 100644 --- a/tests/minipool/queue_test.go +++ b/tests/minipool/queue_test.go @@ -14,187 +14,216 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestQueueLengths(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Disable min commission rate for unbonded pools - if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check queue lengths - if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { - t.Error(err) - } else { - if queueLengths.Total != 0 { - t.Errorf("Incorrect total queue length 1 %d", queueLengths.Total) - } - if queueLengths.FullDeposit != 0 { - t.Errorf("Incorrect full deposit queue length 1 %d", queueLengths.FullDeposit) - } - if queueLengths.HalfDeposit != 0 { - t.Errorf("Incorrect half deposit queue length 1 %d", queueLengths.HalfDeposit) - } - if queueLengths.EmptyDeposit != 0 { - t.Errorf("Incorrect empty deposit queue length 1 %d", queueLengths.EmptyDeposit) - } - } - - // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1); err != nil { t.Fatal(err) } - - // Get & check queue lengths - if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { - t.Error(err) - } else { - if queueLengths.Total != 1 { - t.Errorf("Incorrect total queue length 2 %d", queueLengths.Total) - } - if queueLengths.FullDeposit != 1 { - t.Errorf("Incorrect full deposit queue length 2 %d", queueLengths.FullDeposit) - } - if queueLengths.HalfDeposit != 0 { - t.Errorf("Incorrect half deposit queue length 2 %d", queueLengths.HalfDeposit) - } - if queueLengths.EmptyDeposit != 0 { - t.Errorf("Incorrect empty deposit queue length 2 %d", queueLengths.EmptyDeposit) - } - } - - // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 2); err != nil { t.Fatal(err) } - - // Get & check queue lengths - if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { - t.Error(err) - } else { - if queueLengths.Total != 2 { - t.Errorf("Incorrect total queue length 3 %d", queueLengths.Total) - } - if queueLengths.FullDeposit != 1 { - t.Errorf("Incorrect full deposit queue length 3 %d", queueLengths.FullDeposit) - } - if queueLengths.HalfDeposit != 1 { - t.Errorf("Incorrect half deposit queue length 3 %d", queueLengths.HalfDeposit) - } - if queueLengths.EmptyDeposit != 0 { - t.Errorf("Incorrect empty deposit queue length 3 %d", queueLengths.EmptyDeposit) - } - } - - // Create empty deposit minipool - //if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0), 3); err != nil { t.Fatal(err) } - - // Get & check queue lengths - if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { - t.Error(err) - } else { - if queueLengths.Total != 2 { - t.Errorf("Incorrect total queue length 4 %d", queueLengths.Total) - } - if queueLengths.FullDeposit != 1 { - t.Errorf("Incorrect full deposit queue length 4 %d", queueLengths.FullDeposit) - } - if queueLengths.HalfDeposit != 1 { - t.Errorf("Incorrect half deposit queue length 4 %d", queueLengths.HalfDeposit) - } - //if queueLengths.EmptyDeposit != 1 { - // t.Errorf("Incorrect empty deposit queue length 4 %d", queueLengths.EmptyDeposit) - //} - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 0 { + t.Errorf("Incorrect total queue length 1 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 0 { + t.Errorf("Incorrect full deposit queue length 1 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 0 { + t.Errorf("Incorrect half deposit queue length 1 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 1 %d", queueLengths.EmptyDeposit) + } + } + + // Create full deposit minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1); err != nil { + t.Fatal(err) + } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 1 { + t.Errorf("Incorrect total queue length 2 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 2 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 0 { + t.Errorf("Incorrect half deposit queue length 2 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 2 %d", queueLengths.EmptyDeposit) + } + } + + // Create half deposit minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 2); err != nil { + t.Fatal(err) + } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 2 { + t.Errorf("Incorrect total queue length 3 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 3 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 1 { + t.Errorf("Incorrect half deposit queue length 3 %d", queueLengths.HalfDeposit) + } + if queueLengths.EmptyDeposit != 0 { + t.Errorf("Incorrect empty deposit queue length 3 %d", queueLengths.EmptyDeposit) + } + } + + // Create empty deposit minipool + //if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0), 3); err != nil { t.Fatal(err) } + + // Get & check queue lengths + if queueLengths, err := minipool.GetQueueLengths(rp, nil); err != nil { + t.Error(err) + } else { + if queueLengths.Total != 2 { + t.Errorf("Incorrect total queue length 4 %d", queueLengths.Total) + } + if queueLengths.FullDeposit != 1 { + t.Errorf("Incorrect full deposit queue length 4 %d", queueLengths.FullDeposit) + } + if queueLengths.HalfDeposit != 1 { + t.Errorf("Incorrect half deposit queue length 4 %d", queueLengths.HalfDeposit) + } + //if queueLengths.EmptyDeposit != 1 { + // t.Errorf("Incorrect empty deposit queue length 4 %d", queueLengths.EmptyDeposit) + //} + } } - func TestQueueCapacity(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Disable min commission rate for unbonded pools - if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check queue capacity - if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { - t.Error(err) - } else { - if queueCapacity.Total.Cmp(eth.EthToWei(0)) != 0 { - t.Errorf("Incorrect queue total capacity 1 %s", queueCapacity.Total.String()) - } - if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { - t.Errorf("Incorrect queue effective capacity 1 %s", queueCapacity.Effective.String()) - } - if queueCapacity.NextMinipool.Cmp(eth.EthToWei(0)) != 0 { - t.Errorf("Incorrect queue next minipool capacity 1 %s", queueCapacity.NextMinipool.String()) - } - } - - /* TODO: Unbonded minipools are temporarily disabled - // Create empty deposit minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } - - // Get & check queue capacity - if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { - t.Error(err) - } else { - if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { - t.Errorf("Incorrect queue total capacity 2 %s", queueCapacity.Total.String()) - } - if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { - t.Errorf("Incorrect queue effective capacity 2 %s", queueCapacity.Effective.String()) - } - if queueCapacity.NextMinipool.Cmp(eth.EthToWei(32)) != 0 { - t.Errorf("Incorrect queue next minipool capacity 2 %s", queueCapacity.NextMinipool.String()) - } - } - */ - - // Create half deposit minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { t.Fatal(err) } - - // Get & check queue capacity - if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { - t.Error(err) - } else { - if queueCapacity.Total.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect queue total capacity 3 %s", queueCapacity.Total.String()) - } - if queueCapacity.Effective.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect queue effective capacity 3 %s", queueCapacity.Effective.String()) - } - if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect queue next minipool capacity 3 %s", queueCapacity.NextMinipool.String()) - } - } - - // Create full deposit minipool - if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 2); err != nil { t.Fatal(err) } - - // Get & check queue capacity - if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { - t.Error(err) - } else { - if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { - t.Errorf("Incorrect queue total capacity 4 %s", queueCapacity.Total.String()) - } - if queueCapacity.Effective.Cmp(eth.EthToWei(32)) != 0 { - t.Errorf("Incorrect queue effective capacity 4 %s", queueCapacity.Effective.String()) - } - if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { - t.Errorf("Incorrect queue next minipool capacity 4 %s", queueCapacity.NextMinipool.String()) - } - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Disable min commission rate for unbonded pools + if _, err := trustednodesettings.BootstrapMinipoolUnbondedMinFee(rp, uint64(0), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue total capacity 1 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue effective capacity 1 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 1 %s", queueCapacity.NextMinipool.String()) + } + } + + /* TODO: Unbonded minipools are temporarily disabled + // Create empty deposit minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(0)); err != nil { t.Fatal(err) } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue total capacity 2 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(0)) != 0 { + t.Errorf("Incorrect queue effective capacity 2 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 2 %s", queueCapacity.NextMinipool.String()) + } + } + */ + + // Create half deposit minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1); err != nil { + t.Fatal(err) + } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue total capacity 3 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue effective capacity 3 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 3 %s", queueCapacity.NextMinipool.String()) + } + } + + // Create full deposit minipool + if _, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 2); err != nil { + t.Fatal(err) + } + + // Get & check queue capacity + if queueCapacity, err := minipool.GetQueueCapacity(rp, nil); err != nil { + t.Error(err) + } else { + if queueCapacity.Total.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue total capacity 4 %s", queueCapacity.Total.String()) + } + if queueCapacity.Effective.Cmp(eth.EthToWei(32)) != 0 { + t.Errorf("Incorrect queue effective capacity 4 %s", queueCapacity.Effective.String()) + } + if queueCapacity.NextMinipool.Cmp(eth.EthToWei(16)) != 0 { + t.Errorf("Incorrect queue next minipool capacity 4 %s", queueCapacity.NextMinipool.String()) + } + } } - diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index 54f8710c3..a3df53955 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -16,47 +16,63 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestSubmitMinipoolWithdrawable(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register nodes - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Create & stake minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) - if err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Get & check initial minipool withdrawable status - if status, err := mp.GetStatus(nil); err != nil { - t.Error(err) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register nodes + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Create & stake minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(32), 1) + if err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Get & check initial minipool withdrawable status + if status, err := mp.GetStatus(nil); err != nil { + t.Error(err) } else if status == types.Withdrawable { t.Error("Incorrect initial minipool withdrawable status") } - // Submit minipool withdrawable status - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } + // Submit minipool withdrawable status + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } - // Get & check updated minipool withdrawable status + // Get & check updated minipool withdrawable status if status, err := mp.GetStatus(nil); err != nil { t.Error(err) } else if status != types.Withdrawable { t.Error("Incorrect updated minipool withdrawable status") - } + } } - diff --git a/tests/network/balances_test.go b/tests/network/balances_test.go index a997195ce..1e7ff97f3 100644 --- a/tests/network/balances_test.go +++ b/tests/network/balances_test.go @@ -1,68 +1,74 @@ package network import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestSubmitBalances(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } - // Submit balances - var balancesBlock uint64 = 100 - totalEth := eth.EthToWei(100) - stakingEth := eth.EthToWei(80) - rethSupply := eth.EthToWei(70) - if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } + // Submit balances + var balancesBlock uint64 = 100 + totalEth := eth.EthToWei(100) + stakingEth := eth.EthToWei(80) + rethSupply := eth.EthToWei(70) + if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } - // Get & check network balances block - if networkBalancesBlock, err := network.GetBalancesBlock(rp, nil); err != nil { - t.Error(err) - } else if networkBalancesBlock != balancesBlock { - t.Errorf("Incorrect network balances block %d", networkBalancesBlock) - } + // Get & check network balances block + if networkBalancesBlock, err := network.GetBalancesBlock(rp, nil); err != nil { + t.Error(err) + } else if networkBalancesBlock != balancesBlock { + t.Errorf("Incorrect network balances block %d", networkBalancesBlock) + } - // Get & check network total ETH - if networkTotalEth, err := network.GetTotalETHBalance(rp, nil); err != nil { - t.Error(err) - } else if networkTotalEth.Cmp(totalEth) != 0 { - t.Errorf("Incorrect network total ETH balance %s", networkTotalEth.String()) - } + // Get & check network total ETH + if networkTotalEth, err := network.GetTotalETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkTotalEth.Cmp(totalEth) != 0 { + t.Errorf("Incorrect network total ETH balance %s", networkTotalEth.String()) + } - // Get & check network staking ETH - if networkStakingEth, err := network.GetStakingETHBalance(rp, nil); err != nil { - t.Error(err) - } else if networkStakingEth.Cmp(stakingEth) != 0 { - t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) - } + // Get & check network staking ETH + if networkStakingEth, err := network.GetStakingETHBalance(rp, nil); err != nil { + t.Error(err) + } else if networkStakingEth.Cmp(stakingEth) != 0 { + t.Errorf("Incorrect network staking ETH balance %s", networkStakingEth.String()) + } - // Get & check network rETH supply - if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { - t.Error(err) - } else if networkRethSupply.Cmp(rethSupply) != 0 { - t.Errorf("Incorrect network total rETH supply %s", networkRethSupply.String()) - } + // Get & check network rETH supply + if networkRethSupply, err := network.GetTotalRETHSupply(rp, nil); err != nil { + t.Error(err) + } else if networkRethSupply.Cmp(rethSupply) != 0 { + t.Errorf("Incorrect network total rETH supply %s", networkRethSupply.String()) + } - // Get & check ETH utilization rate - if ethUtilizationRate, err := network.GetETHUtilizationRate(rp, nil); err != nil { - t.Error(err) - } else if ethUtilizationRate != eth.WeiToEth(stakingEth) / eth.WeiToEth(totalEth) { - t.Errorf("Incorrect network ETH utilization rate %f", ethUtilizationRate) - } + // Get & check ETH utilization rate + if ethUtilizationRate, err := network.GetETHUtilizationRate(rp, nil); err != nil { + t.Error(err) + } else if ethUtilizationRate != eth.WeiToEth(stakingEth)/eth.WeiToEth(totalEth) { + t.Errorf("Incorrect network ETH utilization rate %f", ethUtilizationRate) + } } - diff --git a/tests/network/fees_test.go b/tests/network/fees_test.go index e051f46d1..d879188d6 100644 --- a/tests/network/fees_test.go +++ b/tests/network/fees_test.go @@ -1,84 +1,98 @@ package network import ( - "math/big" - "testing" + "math/big" + "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestNodeFee(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) - // Get settings - targetNodeFee, err := protocol.GetTargetNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - minNodeFee, err := protocol.GetMinimumNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - maxNodeFee, err := protocol.GetMaximumNodeFee(rp, nil) - if err != nil { t.Fatal(err) } - demandRange, err := protocol.GetNodeFeeDemandRange(rp, nil) - if err != nil { t.Fatal(err) } + // Get settings + targetNodeFee, err := protocol.GetTargetNodeFee(rp, nil) + if err != nil { + t.Fatal(err) + } + minNodeFee, err := protocol.GetMinimumNodeFee(rp, nil) + if err != nil { + t.Fatal(err) + } + maxNodeFee, err := protocol.GetMaximumNodeFee(rp, nil) + if err != nil { + t.Fatal(err) + } + demandRange, err := protocol.GetNodeFeeDemandRange(rp, nil) + if err != nil { + t.Fatal(err) + } - // Get & check initial node demand - if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { - t.Error(err) - } else if nodeDemand.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node demand value %s", nodeDemand.String()) - } + // Get & check initial node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node demand value %s", nodeDemand.String()) + } - // Get & check initial node fee - if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if nodeFee != targetNodeFee { - t.Errorf("Incorrect initial node fee %f", nodeFee) - } + // Get & check initial node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect initial node fee %f", nodeFee) + } - // Make user deposit - opts := userAccount.GetTransactor() - opts.Value = demandRange - if _, err := deposit.Deposit(rp, opts); err != nil { t.Fatal(err) } + // Make user deposit + opts := userAccount.GetTransactor() + opts.Value = demandRange + if _, err := deposit.Deposit(rp, opts); err != nil { + t.Fatal(err) + } - // Get & check updated node demand - if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { - t.Error(err) - } else if nodeDemand.Cmp(opts.Value) != 0 { - t.Errorf("Incorrect updated node demand value %s", nodeDemand.String()) - } + // Get & check updated node demand + if nodeDemand, err := network.GetNodeDemand(rp, nil); err != nil { + t.Error(err) + } else if nodeDemand.Cmp(opts.Value) != 0 { + t.Errorf("Incorrect updated node demand value %s", nodeDemand.String()) + } - // Get & check updated node fee - if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if nodeFee != maxNodeFee { - t.Errorf("Incorrect updated node fee %f", nodeFee) - } + // Get & check updated node fee + if nodeFee, err := network.GetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect updated node fee %f", nodeFee) + } - // Get & check node fees by demand values - negDemandRange := new(big.Int) - negDemandRange.Neg(demandRange) - if nodeFee, err := network.GetNodeFeeByDemand(rp, big.NewInt(0), nil); err != nil { - t.Error(err) - } else if nodeFee != targetNodeFee { - t.Errorf("Incorrect node fee for zero demand %f", nodeFee) - } - if nodeFee, err := network.GetNodeFeeByDemand(rp, negDemandRange, nil); err != nil { - t.Error(err) - } else if nodeFee != minNodeFee { - t.Errorf("Incorrect node fee for negative demand %f", nodeFee) - } - if nodeFee, err := network.GetNodeFeeByDemand(rp, demandRange, nil); err != nil { - t.Error(err) - } else if nodeFee != maxNodeFee { - t.Errorf("Incorrect node fee for positive demand %f", nodeFee) - } + // Get & check node fees by demand values + negDemandRange := new(big.Int) + negDemandRange.Neg(demandRange) + if nodeFee, err := network.GetNodeFeeByDemand(rp, big.NewInt(0), nil); err != nil { + t.Error(err) + } else if nodeFee != targetNodeFee { + t.Errorf("Incorrect node fee for zero demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, negDemandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != minNodeFee { + t.Errorf("Incorrect node fee for negative demand %f", nodeFee) + } + if nodeFee, err := network.GetNodeFeeByDemand(rp, demandRange, nil); err != nil { + t.Error(err) + } else if nodeFee != maxNodeFee { + t.Errorf("Incorrect node fee for positive demand %f", nodeFee) + } } - diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 3cf32edc0..10c58a737 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -14,40 +14,47 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - nodeAccount *accounts.Account - userAccount *accounts.Account + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account + userAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - userAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + userAccount, err = accounts.GetAccount(9) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/network/prices_test.go b/tests/network/prices_test.go index 03342d3a8..3dea55441 100644 --- a/tests/network/prices_test.go +++ b/tests/network/prices_test.go @@ -10,37 +10,43 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestSubmitPrices(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Submit prices - var pricesBlock uint64 = 100 - rplPrice := eth.EthToWei(1000) - effectiveRplStake := eth.EthToWei(24000) - if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, effectiveRplStake, trustedNodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check network prices block - if networkPricesBlock, err := network.GetPricesBlock(rp, nil); err != nil { - t.Error(err) - } else if networkPricesBlock != pricesBlock { - t.Errorf("Incorrect network prices block %d", networkPricesBlock) - } - - // Get & check network RPL price - if networkRplPrice, err := network.GetRPLPrice(rp, nil); err != nil { - t.Error(err) - } else if networkRplPrice.Cmp(rplPrice) != 0 { - t.Errorf("Incorrect network RPL price %s", networkRplPrice.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Submit prices + var pricesBlock uint64 = 100 + rplPrice := eth.EthToWei(1000) + effectiveRplStake := eth.EthToWei(24000) + if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, effectiveRplStake, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check network prices block + if networkPricesBlock, err := network.GetPricesBlock(rp, nil); err != nil { + t.Error(err) + } else if networkPricesBlock != pricesBlock { + t.Errorf("Incorrect network prices block %d", networkPricesBlock) + } + + // Get & check network RPL price + if networkRplPrice, err := network.GetRPLPrice(rp, nil); err != nil { + t.Error(err) + } else if networkRplPrice.Cmp(rplPrice) != 0 { + t.Errorf("Incorrect network RPL price %s", networkRplPrice.String()) + } } - diff --git a/tests/node/deposit_test.go b/tests/node/deposit_test.go index ebd88a2ba..ad6077a6a 100644 --- a/tests/node/deposit_test.go +++ b/tests/node/deposit_test.go @@ -12,41 +12,49 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestDeposit(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get initial node minipool count - minipoolCount1, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Mint & stake RPL required for mininpool - rplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) - if err != nil { t.Fatal(err) } - if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { t.Fatal(err) } - - // Deposit - if _, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1); err != nil { - t.Fatal(err) - } - - // Get & check updated node minipool count - minipoolCount2, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) - if err != nil { - t.Fatal(err) - } else if minipoolCount2 != minipoolCount1 + 1 { - t.Error("Incorrect node minipool count") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get initial node minipool count + minipoolCount1, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Mint & stake RPL required for mininpool + rplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) + if err != nil { + t.Fatal(err) + } + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { + t.Fatal(err) + } + + // Deposit + if _, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1); err != nil { + t.Fatal(err) + } + + // Get & check updated node minipool count + minipoolCount2, err := minipool.GetNodeMinipoolCount(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } else if minipoolCount2 != minipoolCount1+1 { + t.Error("Incorrect node minipool count") + } } - diff --git a/tests/node/main_test.go b/tests/node/main_test.go index c2f003db3..b6c83ddd1 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -14,37 +14,42 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account - nodeAccount *accounts.Account - withdrawalAccount *accounts.Account + ownerAccount *accounts.Account + nodeAccount *accounts.Account + withdrawalAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - withdrawalAccount, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + withdrawalAccount, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/node/node_test.go b/tests/node/node_test.go index edc6c8797..59874b63e 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -12,139 +12,158 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestRegisterNode(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Get & check initial node exists status - if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if exists { - t.Error("Node already existed before registration") - } - - // Get & check initial node details - if details, err := node.GetNodes(rp, nil); err != nil { - t.Error(err) - } else if len(details) != 0 { - t.Error("Incorrect initial node count") - } - - // Register node - timezoneLocation := "Australia/Brisbane" - if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated node details - if details, err := node.GetNodes(rp, nil); err != nil { - t.Error(err) - } else if len(details) != 1 { - t.Error("Incorrect updated node count") - } else { - nodeDetails := details[0] - if !bytes.Equal(nodeDetails.Address.Bytes(), nodeAccount.Address.Bytes()) { - t.Errorf("Incorrect node address %s", nodeDetails.Address.Hex()) - } - if !nodeDetails.Exists { - t.Error("Incorrect node exists status") - } - if !bytes.Equal(nodeDetails.WithdrawalAddress.Bytes(), nodeAccount.Address.Bytes()) { - t.Errorf("Incorrect node withdrawal address '%s'", nodeDetails.WithdrawalAddress.Hex()) - } - if nodeDetails.TimezoneLocation != timezoneLocation { - t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) - } - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Get & check initial node exists status + if exists, err := node.GetNodeExists(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if exists { + t.Error("Node already existed before registration") + } + + // Get & check initial node details + if details, err := node.GetNodes(rp, nil); err != nil { + t.Error(err) + } else if len(details) != 0 { + t.Error("Incorrect initial node count") + } + + // Register node + timezoneLocation := "Australia/Brisbane" + if _, err := node.RegisterNode(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node details + if details, err := node.GetNodes(rp, nil); err != nil { + t.Error(err) + } else if len(details) != 1 { + t.Error("Incorrect updated node count") + } else { + nodeDetails := details[0] + if !bytes.Equal(nodeDetails.Address.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect node address %s", nodeDetails.Address.Hex()) + } + if !nodeDetails.Exists { + t.Error("Incorrect node exists status") + } + if !bytes.Equal(nodeDetails.WithdrawalAddress.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeDetails.WithdrawalAddress.Hex()) + } + if nodeDetails.TimezoneLocation != timezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) + } + } } - func TestSetWithdrawalAddress(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Set withdrawal address - withdrawalAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, true, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check node withdrawal address - if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { - t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set withdrawal address + withdrawalAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, true, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node withdrawal address + if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) + } } - func TestSetWithdrawalAddressConfirmation(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Set withdrawal address - withdrawalAddress := withdrawalAccount.Address - if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, false, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Confirm withdrawal address - if _, err := storage.ConfirmWithdrawalAddress(rp, nodeAccount.Address, withdrawalAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check node withdrawal address - if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { - t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set withdrawal address + withdrawalAddress := withdrawalAccount.Address + if _, err := storage.SetWithdrawalAddress(rp, nodeAccount.Address, withdrawalAddress, false, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Confirm withdrawal address + if _, err := storage.ConfirmWithdrawalAddress(rp, nodeAccount.Address, withdrawalAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node withdrawal address + if nodeWithdrawalAddress, err := storage.GetNodeWithdrawalAddress(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !bytes.Equal(nodeWithdrawalAddress.Bytes(), withdrawalAddress.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeWithdrawalAddress.Hex()) + } } - func TestSetTimezoneLocation(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Set timezone - timezoneLocation := "Australia/Sydney" - if _, err := node.SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check node timezone location - if nodeTimezoneLocation, err := node.GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeTimezoneLocation != timezoneLocation { - t.Errorf("Incorrect node timezone location '%s'", nodeTimezoneLocation) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set timezone + timezoneLocation := "Australia/Sydney" + if _, err := node.SetTimezoneLocation(rp, timezoneLocation, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node timezone location + if nodeTimezoneLocation, err := node.GetNodeTimezoneLocation(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeTimezoneLocation != timezoneLocation { + t.Errorf("Incorrect node timezone location '%s'", nodeTimezoneLocation) + } } - diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 0d37aa1ed..759b00abb 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -19,202 +19,249 @@ import ( rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - func TestStakeRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get RPL amount required for 2 minipools - minipoolRplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) - if err != nil { t.Fatal(err) } - rplAmount := new(big.Int) - rplAmount.Mul(minipoolRplRequired, big.NewInt(2)) - - // Mint RPL - if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } - - // Approve RPL transfer for staking - rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") - if err != nil { t.Fatal(err) } - if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, rplAmount, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Check initial staking details - if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) - } - if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial total effective RPL stake %s", totalEffectiveRplStake.String()) - } - if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) - } - if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node effective RPL stake %s", nodeEffectiveRplStake.String()) - } - if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node minimum RPL stake %s", nodeMinimumRplStake.String()) - } - if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStakedTime != 0 { - t.Errorf("Incorrect initial node RPL staked time %d", nodeRplStakedTime) - } - if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeMinipoolLimit != 0 { - t.Errorf("Incorrect initial node minipool limit %d", nodeMinipoolLimit) - } - - // Stake RPL - if _, err := node.StakeRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Check updated staking details - if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect updated total RPL stake 1 %s", totalRplStake.String()) - } - if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated total effective RPL stake 1 %s", totalEffectiveRplStake.String()) - } - if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect updated node RPL stake 1 %s", nodeRplStake.String()) - } - if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated node effective RPL stake 1 %s", nodeEffectiveRplStake.String()) - } - if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated node minimum RPL stake 1 %s", nodeMinimumRplStake.String()) - } - if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStakedTime == 0 { - t.Errorf("Incorrect updated node RPL staked time 1 %d", nodeRplStakedTime) - } - if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeMinipoolLimit != 2 { - t.Errorf("Incorrect updated node minipool limit 1 %d", nodeMinipoolLimit) - } - - // Make node deposit to create minipool - minipoolAddress, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - mp, err := minipool.NewMinipool(rp, minipoolAddress) - if err != nil { t.Fatal(err) } - - // Make user deposit - depositOpts := nodeAccount.GetTransactor(); - depositOpts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, depositOpts); err != nil { t.Fatal(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Fatal(err) } - - // Check updated staking details - if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalEffectiveRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect updated total effective RPL stake 2 %s", totalEffectiveRplStake.String()) - } - if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeEffectiveRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect updated node effective RPL stake 2 %s", nodeEffectiveRplStake.String()) - } - if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeMinimumRplStake.Cmp(minipoolRplRequired) != 0 { - t.Errorf("Incorrect updated node minimum RPL stake 2 %s", nodeMinimumRplStake.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get RPL amount required for 2 minipools + minipoolRplRequired, err := minipoolutils.GetMinipoolRPLRequired(rp) + if err != nil { + t.Fatal(err) + } + rplAmount := new(big.Int) + rplAmount.Mul(minipoolRplRequired, big.NewInt(2)) + + // Mint RPL + if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { + t.Fatal(err) + } + + // Approve RPL transfer for staking + rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") + if err != nil { + t.Fatal(err) + } + if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, rplAmount, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check initial staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) + } + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial total effective RPL stake %s", totalEffectiveRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node effective RPL stake %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node minimum RPL stake %s", nodeMinimumRplStake.String()) + } + if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStakedTime != 0 { + t.Errorf("Incorrect initial node RPL staked time %d", nodeRplStakedTime) + } + if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinipoolLimit != 0 { + t.Errorf("Incorrect initial node minipool limit %d", nodeMinipoolLimit) + } + + // Stake RPL + if _, err := node.StakeRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check updated staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect updated total RPL stake 1 %s", totalRplStake.String()) + } + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated total effective RPL stake 1 %s", totalEffectiveRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect updated node RPL stake 1 %s", nodeRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node effective RPL stake 1 %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node minimum RPL stake 1 %s", nodeMinimumRplStake.String()) + } + if nodeRplStakedTime, err := node.GetNodeRPLStakedTime(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStakedTime == 0 { + t.Errorf("Incorrect updated node RPL staked time 1 %d", nodeRplStakedTime) + } + if nodeMinipoolLimit, err := node.GetNodeMinipoolLimit(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinipoolLimit != 2 { + t.Errorf("Incorrect updated node minipool limit 1 %d", nodeMinipoolLimit) + } + + // Make node deposit to create minipool + minipoolAddress, _, err := nodeutils.Deposit(t, rp, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + mp, err := minipool.NewMinipool(rp, minipoolAddress) + if err != nil { + t.Fatal(err) + } + + // Make user deposit + depositOpts := nodeAccount.GetTransactor() + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { + t.Fatal(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Fatal(err) + } + + // Check updated staking details + if totalEffectiveRplStake, err := node.GetTotalEffectiveRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalEffectiveRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect updated total effective RPL stake 2 %s", totalEffectiveRplStake.String()) + } + if nodeEffectiveRplStake, err := node.GetNodeEffectiveRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeEffectiveRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect updated node effective RPL stake 2 %s", nodeEffectiveRplStake.String()) + } + if nodeMinimumRplStake, err := node.GetNodeMinimumRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeMinimumRplStake.Cmp(minipoolRplRequired) != 0 { + t.Errorf("Incorrect updated node minimum RPL stake 2 %s", nodeMinimumRplStake.String()) + } } - func TestWithdrawRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Mint & stake RPL - rplAmount := eth.EthToWei(1000) - if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { t.Fatal(err) } - - // Get & set rewards claim interval - rewardsClaimIntervalTime, err := protocol.GetRewardsClaimIntervalTime(rp, nil) - if err != nil { t.Fatal(err) } - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Check initial staking details - if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) - } - if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStake.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) - } - - // Withdraw RPL - if _, err := node.WithdrawRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Check updated staking details - if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { - t.Error(err) - } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated total RPL stake %s", totalRplStake.String()) - } - if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect updated node RPL stake %s", nodeRplStake.String()) - } - - // Reset rewards claim interval - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Mint & stake RPL + rplAmount := eth.EthToWei(1000) + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplAmount); err != nil { + t.Fatal(err) + } + + // Get & set rewards claim interval + rewardsClaimIntervalTime, err := protocol.GetRewardsClaimIntervalTime(rp, nil) + if err != nil { + t.Fatal(err) + } + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check initial staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect initial total RPL stake %s", totalRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect initial node RPL stake %s", nodeRplStake.String()) + } + + // Withdraw RPL + if _, err := node.WithdrawRPL(rp, rplAmount, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Check updated staking details + if totalRplStake, err := node.GetTotalRPLStake(rp, nil); err != nil { + t.Error(err) + } else if totalRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated total RPL stake %s", totalRplStake.String()) + } + if nodeRplStake, err := node.GetNodeRPLStake(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeRplStake.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect updated node RPL stake %s", nodeRplStake.String()) + } + + // Reset rewards claim interval + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } } - diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index c5db5bddb..20056b1e7 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -14,37 +14,42 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - nodeAccount *accounts.Account + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + nodeAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - nodeAccount, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + nodeAccount, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 23ca21f0d..5a77fb595 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -17,121 +17,143 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) - func TestNodeRewards(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Constants - oneDay := 24 * 60 * 60 - rewardInterval := oneDay - - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check node claims enabled status - if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { - t.Error(err) - } else if !claimsEnabled { - t.Error("Incorrect node claims enabled status") - } - - // Get & check initial node claim possible status - if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeClaimPossible { - t.Error("Incorrect initial node claim possible status") - } - - // Increase time until node claims are possible - if err := evm.IncreaseTime(rewardInterval); err != nil { t.Fatal(err) } - - // Get & check updated node claim possible status - if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !nodeClaimPossible { - t.Error("Incorrect updated node claim possible status") - } - - // Get & check initial node claim rewards percent - if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsPerc != 0 { - t.Errorf("Incorrect initial node claim rewards perc %f", rewardsPerc) - } - - // Stake RPL & create a minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) - if err != nil { t.Fatal(err) } - - // Deposit user ETH to minipool - opts := nodeAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, opts); err != nil { t.Error(err) } - - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { t.Fatal(err) } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { t.Fatal(fmt.Errorf("Could not increase time: %w", err)) } - - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { t.Error(err) } - - // Get & check updated node claim rewards percent - if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsPerc != 1 { - t.Errorf("Incorrect updated node claim rewards perc %f", rewardsPerc) - } - - // Get & check initial node claim rewards amount - if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node claim rewards amount %s", rewardsAmount.String()) - } - - // Start RPL inflation - if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { - t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + uint64(oneDay), ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Increase time until rewards are available - if err := evm.IncreaseTime(oneDay + oneDay); err != nil { - t.Fatal(err) - } - - // Get & check updated node claim rewards amount - if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated node claim rewards amount %s", rewardsAmount.String()) - } - - // Get & check initial node RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) - } - - // Claim node rewards - if _, err := rewards.ClaimNodeRewards(rp, nodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated node RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Constants + oneDay := 24 * 60 * 60 + rewardInterval := oneDay + + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Set network parameters + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check node claims enabled status + if claimsEnabled, err := rewards.GetNodeClaimsEnabled(rp, nil); err != nil { + t.Error(err) + } else if !claimsEnabled { + t.Error("Incorrect node claims enabled status") + } + + // Get & check initial node claim possible status + if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeClaimPossible { + t.Error("Incorrect initial node claim possible status") + } + + // Increase time until node claims are possible + if err := evm.IncreaseTime(rewardInterval); err != nil { + t.Fatal(err) + } + + // Get & check updated node claim possible status + if nodeClaimPossible, err := rewards.GetNodeClaimPossible(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !nodeClaimPossible { + t.Error("Incorrect updated node claim possible status") + } + + // Get & check initial node claim rewards percent + if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 0 { + t.Errorf("Incorrect initial node claim rewards perc %f", rewardsPerc) + } + + // Stake RPL & create a minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, nodeAccount, eth.EthToWei(16), 1) + if err != nil { + t.Fatal(err) + } + + // Deposit user ETH to minipool + opts := nodeAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, opts); err != nil { + t.Error(err) + } + + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + t.Fatal(err) + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + } + + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { + t.Error(err) + } + + // Get & check updated node claim rewards percent + if rewardsPerc, err := rewards.GetNodeClaimRewardsPerc(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 1 { + t.Errorf("Incorrect updated node claim rewards perc %f", rewardsPerc) + } + + // Get & check initial node claim rewards amount + if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node claim rewards amount %s", rewardsAmount.String()) + } + + // Start RPL inflation + if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { + t.Fatal(err) + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time+uint64(oneDay), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Increase time until rewards are available + if err := evm.IncreaseTime(oneDay + oneDay); err != nil { + t.Fatal(err) + } + + // Get & check updated node claim rewards amount + if rewardsAmount, err := rewards.GetNodeClaimRewardsAmount(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node claim rewards amount %s", rewardsAmount.String()) + } + + // Get & check initial node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) + } + + // Claim node rewards + if _, err := rewards.ClaimNodeRewards(rp, nodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) + } } - diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index de8bec441..179ea580d 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -1,105 +1,119 @@ package rewards import ( - "context" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "math/big" - "testing" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "context" + "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "math/big" + "testing" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestTrustedNodeRewards(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Constants - oneDay := 24 * 60 * 60 - rewardInterval := oneDay - - // Register node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Set network parameters - if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check trusted node claims enabled status - if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { - t.Error(err) - } else if !claimsEnabled { - t.Error("Incorrect trusted node claims enabled status") - } - - // Get & check initial trusted node claim possible status - if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if nodeClaimPossible { - t.Error("Incorrect initial trusted node claim possible status") - } - - // Increase time until node claims are possible - if err := evm.IncreaseTime(rewardInterval); err != nil { t.Fatal(err) } - - // Get & check updated trusted node claim possible status - if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if !nodeClaimPossible { - t.Error("Incorrect updated trusted node claim possible status") - } - - // Get & check trusted node claim rewards percent - if rewardsPerc, err := rewards.GetTrustedNodeClaimRewardsPerc(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsPerc != 1 { - t.Errorf("Incorrect trusted node claim rewards perc %f", rewardsPerc) - } - - // Get & check initial trusted node claim rewards amount - if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial trusted node claim rewards amount %s", rewardsAmount.String()) - } - - // Start RPL inflation - if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { - t.Fatal(err) - } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time + uint64(oneDay), ownerAccount.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Increase time until rewards are available - if err := evm.IncreaseTime(oneDay + oneDay); err != nil { t.Fatal(err) } - - // Get & check updated trusted node claim rewards amount - if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated trusted node claim rewards amount %s", rewardsAmount.String()) - } - - // Get & check initial node RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 0 { - t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) - } - - // Claim node rewards - if _, err := rewards.ClaimTrustedNodeRewards(rp, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check updated node RPL balance - if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Constants + oneDay := 24 * 60 * 60 + rewardInterval := oneDay + + // Register node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Set network parameters + if _, err := protocol.BootstrapRewardsClaimIntervalTime(rp, uint64(rewardInterval), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check trusted node claims enabled status + if claimsEnabled, err := rewards.GetTrustedNodeClaimsEnabled(rp, nil); err != nil { + t.Error(err) + } else if !claimsEnabled { + t.Error("Incorrect trusted node claims enabled status") + } + + // Get & check initial trusted node claim possible status + if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if nodeClaimPossible { + t.Error("Incorrect initial trusted node claim possible status") + } + + // Increase time until node claims are possible + if err := evm.IncreaseTime(rewardInterval); err != nil { + t.Fatal(err) + } + + // Get & check updated trusted node claim possible status + if nodeClaimPossible, err := rewards.GetTrustedNodeClaimPossible(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if !nodeClaimPossible { + t.Error("Incorrect updated trusted node claim possible status") + } + + // Get & check trusted node claim rewards percent + if rewardsPerc, err := rewards.GetTrustedNodeClaimRewardsPerc(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsPerc != 1 { + t.Errorf("Incorrect trusted node claim rewards perc %f", rewardsPerc) + } + + // Get & check initial trusted node claim rewards amount + if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial trusted node claim rewards amount %s", rewardsAmount.String()) + } + + // Start RPL inflation + if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { + t.Fatal(err) + } else if _, err := protocol.BootstrapInflationStartTime(rp, header.Time+uint64(oneDay), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Increase time until rewards are available + if err := evm.IncreaseTime(oneDay + oneDay); err != nil { + t.Fatal(err) + } + + // Get & check updated trusted node claim rewards amount + if rewardsAmount, err := rewards.GetTrustedNodeClaimRewardsAmount(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rewardsAmount.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated trusted node claim rewards amount %s", rewardsAmount.String()) + } + + // Get & check initial node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 0 { + t.Errorf("Incorrect initial node RPL balance %s", rplBalance.String()) + } + + // Claim node rewards + if _, err := rewards.ClaimTrustedNodeRewards(rp, trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated node RPL balance + if rplBalance, err := tokens.GetRPLBalance(rp, trustedNodeAccount.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect updated node RPL balance %s", rplBalance.String()) + } } - diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index 18bdbed4d..5c42627dd 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -13,25 +13,24 @@ import ( "github.com/rocket-pool/rocketpool-go/tests" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool ) - func TestMain(m *testing.M) { - var err error + var err error - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } - // Run tests - os.Exit(m.Run()) + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/rocketpool/rocketpool_test.go b/tests/rocketpool/rocketpool_test.go index f685aad33..617b6a34a 100644 --- a/tests/rocketpool/rocketpool_test.go +++ b/tests/rocketpool/rocketpool_test.go @@ -1,157 +1,157 @@ package rocketpool import ( - "bytes" - "encoding/json" - "testing" + "bytes" + "encoding/json" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" ) - func TestGetAddress(t *testing.T) { - // Get contract address - address1, err := rp.GetAddress("rocketDepositPool") - if err != nil { - t.Fatalf("Could not get contract address: %s", err) - } else if bytes.Equal(address1.Bytes(), common.Address{}.Bytes()) { - t.Error("Contract address was not found") - } - - // Get cached contract address - address2, err := rp.GetAddress("rocketDepositPool") - if err != nil { - t.Fatalf("Could not get cached contract address: %s", err) - } else if !bytes.Equal(address2.Bytes(), address1.Bytes()) { - t.Error("Cached contract address did not match original contract address") - } + // Get contract address + address1, err := rp.GetAddress("rocketDepositPool") + if err != nil { + t.Fatalf("Could not get contract address: %s", err) + } else if bytes.Equal(address1.Bytes(), common.Address{}.Bytes()) { + t.Error("Contract address was not found") + } + + // Get cached contract address + address2, err := rp.GetAddress("rocketDepositPool") + if err != nil { + t.Fatalf("Could not get cached contract address: %s", err) + } else if !bytes.Equal(address2.Bytes(), address1.Bytes()) { + t.Error("Cached contract address did not match original contract address") + } } - func TestGetAddresses(t *testing.T) { - // Get contract addresses - addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") - if err != nil { - t.Fatalf("Could not get contract addresses: %s", err) - } else { - for ai, address := range addresses1 { - if bytes.Equal(address.Bytes(), common.Address{}.Bytes()) { - t.Errorf("Contract address %d was not found", ai) - } - } - } - - // Get cached contract addresses - addresses2, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") - if err != nil { - t.Fatalf("Could not get cached contract addresses: %s", err) - } else { - for ai := 0; ai < len(addresses2); ai++ { - if !bytes.Equal(addresses2[ai].Bytes(), addresses1[ai].Bytes()) { - t.Errorf("Cached contract address %d did not match original contract address", ai) - } - } - } + // Get contract addresses + addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Fatalf("Could not get contract addresses: %s", err) + } else { + for ai, address := range addresses1 { + if bytes.Equal(address.Bytes(), common.Address{}.Bytes()) { + t.Errorf("Contract address %d was not found", ai) + } + } + } + + // Get cached contract addresses + addresses2, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Fatalf("Could not get cached contract addresses: %s", err) + } else { + for ai := 0; ai < len(addresses2); ai++ { + if !bytes.Equal(addresses2[ai].Bytes(), addresses1[ai].Bytes()) { + t.Errorf("Cached contract address %d did not match original contract address", ai) + } + } + } } - func TestGetABI(t *testing.T) { - // Get ABI - abi1, err := rp.GetABI("rocketDepositPool") - if err != nil { - t.Fatalf("Could not get contract ABI: %s", err) - } - - // Get cached ABI - abi2, err := rp.GetABI("rocketDepositPool") - if err != nil { - t.Fatalf("Could not get cached contract ABI: %s", err) - } else { - abi2Json, err := json.Marshal(abi2) - if err != nil { t.Fatal(err) } - abi1Json, err := json.Marshal(abi1) - if err != nil { t.Fatal(err) } - if !bytes.Equal(abi2Json, abi1Json) { - t.Error("Cached contract ABI did not match original contract ABI") - } - } + // Get ABI + abi1, err := rp.GetABI("rocketDepositPool") + if err != nil { + t.Fatalf("Could not get contract ABI: %s", err) + } + + // Get cached ABI + abi2, err := rp.GetABI("rocketDepositPool") + if err != nil { + t.Fatalf("Could not get cached contract ABI: %s", err) + } else { + abi2Json, err := json.Marshal(abi2) + if err != nil { + t.Fatal(err) + } + abi1Json, err := json.Marshal(abi1) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(abi2Json, abi1Json) { + t.Error("Cached contract ABI did not match original contract ABI") + } + } } - func TestGetABIs(t *testing.T) { - // Get ABIs - abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") - if err != nil { - t.Fatalf("Could not get contract ABIs: %s", err) - } - - // Get cached ABIs - abis2, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") - if err != nil { - t.Fatalf("Could not get cached contract ABIs: %s", err) - } else { - for ai := 0; ai < len(abis2); ai++ { - abi2Json, err := json.Marshal(abis2[ai]) - if err != nil { t.Fatal(err) } - abi1Json, err := json.Marshal(abis1[ai]) - if err != nil { t.Fatal(err) } - if !bytes.Equal(abi2Json, abi1Json) { - t.Errorf("Cached contract ABI %d did not match original contract ABI", ai) - } - } - } + // Get ABIs + abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Fatalf("Could not get contract ABIs: %s", err) + } + + // Get cached ABIs + abis2, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") + if err != nil { + t.Fatalf("Could not get cached contract ABIs: %s", err) + } else { + for ai := 0; ai < len(abis2); ai++ { + abi2Json, err := json.Marshal(abis2[ai]) + if err != nil { + t.Fatal(err) + } + abi1Json, err := json.Marshal(abis1[ai]) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(abi2Json, abi1Json) { + t.Errorf("Cached contract ABI %d did not match original contract ABI", ai) + } + } + } } - func TestGetContract(t *testing.T) { - // Get contract - if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Fatalf("Could not get contract: %s", err) - } + // Get contract + if _, err := rp.GetContract("rocketDepositPool"); err != nil { + t.Fatalf("Could not get contract: %s", err) + } - // Get cached contract - if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Fatalf("Could not get cached contract: %s", err) - } + // Get cached contract + if _, err := rp.GetContract("rocketDepositPool"); err != nil { + t.Fatalf("Could not get cached contract: %s", err) + } } - func TestGetContracts(t *testing.T) { - // Get contracts - if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Fatalf("Could not get contracts: %s", err) - } + // Get contracts + if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { + t.Fatalf("Could not get contracts: %s", err) + } - // Get cached contracts - if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Fatalf("Could not get cached contracts: %s", err) - } + // Get cached contracts + if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { + t.Fatalf("Could not get cached contracts: %s", err) + } } - func TestMakeContract(t *testing.T) { - // Make contract - if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { - t.Fatalf("Could not make contract: %s", err) - } + // Make contract + if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { + t.Fatalf("Could not make contract: %s", err) + } - // Make contract with cached ABI - if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x2222222222222222222222222222222222222222")); err != nil { - t.Fatalf("Could not make contract with cached ABI: %s", err) - } + // Make contract with cached ABI + if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x2222222222222222222222222222222222222222")); err != nil { + t.Fatalf("Could not make contract with cached ABI: %s", err) + } } - diff --git a/tests/settings/protocol/auction_test.go b/tests/settings/protocol/auction_test.go index 334191cb6..8295925d4 100644 --- a/tests/settings/protocol/auction_test.go +++ b/tests/settings/protocol/auction_test.go @@ -1,90 +1,94 @@ package protocol import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestAuctionSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) - // Set & get creat lots enabled - createLotEnabled := false - if _, err := protocol.BootstrapCreateLotEnabled(rp, createLotEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetCreateLotEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != createLotEnabled { - t.Error("Incorrect creat lots enabled value") - } + // Set & get creat lots enabled + createLotEnabled := false + if _, err := protocol.BootstrapCreateLotEnabled(rp, createLotEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetCreateLotEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != createLotEnabled { + t.Error("Incorrect creat lots enabled value") + } - // Set & get bid on lot enabled - bidOnLotEnabled := false - if _, err := protocol.BootstrapBidOnLotEnabled(rp, bidOnLotEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetBidOnLotEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != bidOnLotEnabled { - t.Error("Incorrect bid on lot enabled value") - } + // Set & get bid on lot enabled + bidOnLotEnabled := false + if _, err := protocol.BootstrapBidOnLotEnabled(rp, bidOnLotEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetBidOnLotEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != bidOnLotEnabled { + t.Error("Incorrect bid on lot enabled value") + } - // Set & get lot minimum ETH value - lotMinimumEthValue := eth.EthToWei(1000) - if _, err := protocol.BootstrapLotMinimumEthValue(rp, lotMinimumEthValue, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetLotMinimumEthValue(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(lotMinimumEthValue) != 0 { - t.Error("Incorrect lot minimum ETH value value") - } + // Set & get lot minimum ETH value + lotMinimumEthValue := eth.EthToWei(1000) + if _, err := protocol.BootstrapLotMinimumEthValue(rp, lotMinimumEthValue, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotMinimumEthValue(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(lotMinimumEthValue) != 0 { + t.Error("Incorrect lot minimum ETH value value") + } - // Set & get lot maximum ETH value - lotMaximumEthValue := eth.EthToWei(0.01) - if _, err := protocol.BootstrapLotMaximumEthValue(rp, lotMaximumEthValue, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetLotMaximumEthValue(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(lotMaximumEthValue) != 0 { - t.Error("Incorrect lot maximum ETH value value") - } + // Set & get lot maximum ETH value + lotMaximumEthValue := eth.EthToWei(0.01) + if _, err := protocol.BootstrapLotMaximumEthValue(rp, lotMaximumEthValue, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotMaximumEthValue(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(lotMaximumEthValue) != 0 { + t.Error("Incorrect lot maximum ETH value value") + } - // Set & get lot duration - var lotDuration uint64 = 1 - if _, err := protocol.BootstrapLotDuration(rp, lotDuration, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetLotDuration(rp, nil); err != nil { - t.Error(err) - } else if value != lotDuration { - t.Error("Incorrect lot duration value") - } + // Set & get lot duration + var lotDuration uint64 = 1 + if _, err := protocol.BootstrapLotDuration(rp, lotDuration, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotDuration(rp, nil); err != nil { + t.Error(err) + } else if value != lotDuration { + t.Error("Incorrect lot duration value") + } - // Set & get lot starting price ratio - lotStartingPriceRatio := 2.0 - if _, err := protocol.BootstrapLotStartingPriceRatio(rp, lotStartingPriceRatio, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetLotStartingPriceRatio(rp, nil); err != nil { - t.Error(err) - } else if value != lotStartingPriceRatio { - t.Error("Incorrect lot starting price ratio value") - } + // Set & get lot starting price ratio + lotStartingPriceRatio := 2.0 + if _, err := protocol.BootstrapLotStartingPriceRatio(rp, lotStartingPriceRatio, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotStartingPriceRatio(rp, nil); err != nil { + t.Error(err) + } else if value != lotStartingPriceRatio { + t.Error("Incorrect lot starting price ratio value") + } - // Set & get lot reserve price ratio - lotReservePriceRatio := 1.9 - if _, err := protocol.BootstrapLotReservePriceRatio(rp, lotReservePriceRatio, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetLotReservePriceRatio(rp, nil); err != nil { - t.Error(err) - } else if value != lotReservePriceRatio { - t.Error("Incorrect lot reserve price ratio value") - } + // Set & get lot reserve price ratio + lotReservePriceRatio := 1.9 + if _, err := protocol.BootstrapLotReservePriceRatio(rp, lotReservePriceRatio, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetLotReservePriceRatio(rp, nil); err != nil { + t.Error(err) + } else if value != lotReservePriceRatio { + t.Error("Incorrect lot reserve price ratio value") + } } - diff --git a/tests/settings/protocol/deposit_test.go b/tests/settings/protocol/deposit_test.go index a7e8c5e80..0077b106e 100644 --- a/tests/settings/protocol/deposit_test.go +++ b/tests/settings/protocol/deposit_test.go @@ -1,70 +1,74 @@ package protocol import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestDepositSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) - // Set & get deposits enabled - depositEnabled := false - if _, err := protocol.BootstrapDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetDepositEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != depositEnabled { - t.Error("Incorrect deposit enabled value") - } + // Set & get deposits enabled + depositEnabled := false + if _, err := protocol.BootstrapDepositEnabled(rp, depositEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != depositEnabled { + t.Error("Incorrect deposit enabled value") + } - // Set & get deposit assignments enabled - assignDepositsEnabled := false - if _, err := protocol.BootstrapAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetAssignDepositsEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != assignDepositsEnabled { - t.Error("Incorrect assign deposits enabled value") - } + // Set & get deposit assignments enabled + assignDepositsEnabled := false + if _, err := protocol.BootstrapAssignDepositsEnabled(rp, assignDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetAssignDepositsEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != assignDepositsEnabled { + t.Error("Incorrect assign deposits enabled value") + } - // Set & get minimum deposit amount - minimumDeposit := eth.EthToWei(1000) - if _, err := protocol.BootstrapMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinimumDeposit(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(minimumDeposit) != 0 { - t.Error("Incorrect minimum deposit value") - } + // Set & get minimum deposit amount + minimumDeposit := eth.EthToWei(1000) + if _, err := protocol.BootstrapMinimumDeposit(rp, minimumDeposit, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinimumDeposit(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(minimumDeposit) != 0 { + t.Error("Incorrect minimum deposit value") + } - // Set & get maximum deposit pool size - maximumDepositPoolSize := eth.EthToWei(1) - if _, err := protocol.BootstrapMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMaximumDepositPoolSize(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(maximumDepositPoolSize) != 0 { - t.Error("Incorrect maximum deposit pool size value") - } + // Set & get maximum deposit pool size + maximumDepositPoolSize := eth.EthToWei(1) + if _, err := protocol.BootstrapMaximumDepositPoolSize(rp, maximumDepositPoolSize, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMaximumDepositPoolSize(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(maximumDepositPoolSize) != 0 { + t.Error("Incorrect maximum deposit pool size value") + } - // Set & get maximum deposit assignments - var maximumDepositAssignments uint64 = 50 - if _, err := protocol.BootstrapMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMaximumDepositAssignments(rp, nil); err != nil { - t.Error(err) - } else if value != maximumDepositAssignments { - t.Error("Incorrect maximum deposit assignments value") - } + // Set & get maximum deposit assignments + var maximumDepositAssignments uint64 = 50 + if _, err := protocol.BootstrapMaximumDepositAssignments(rp, maximumDepositAssignments, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMaximumDepositAssignments(rp, nil); err != nil { + t.Error(err) + } else if value != maximumDepositAssignments { + t.Error("Incorrect maximum deposit assignments value") + } } - diff --git a/tests/settings/protocol/inflation_test.go b/tests/settings/protocol/inflation_test.go index df30e8b0e..2b3d3e995 100644 --- a/tests/settings/protocol/inflation_test.go +++ b/tests/settings/protocol/inflation_test.go @@ -2,39 +2,43 @@ package protocol import ( "testing" - "time" + "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestInflationSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get inflation interval rate - inflationIntervalRate := 0.5 - if _, err := protocol.BootstrapInflationIntervalRate(rp, inflationIntervalRate, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetInflationIntervalRate(rp, nil); err != nil { - t.Error(err) - } else if value != inflationIntervalRate { - t.Error("Incorrect inflation interval rate value") - } - - // Set & get inflation start block - inflationStartTime := uint64(time.Now().Unix()) + 3600 - if _, err := protocol.BootstrapInflationStartTime(rp, inflationStartTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetInflationStartTime(rp, nil); err != nil { - t.Error(err) - } else if value != inflationStartTime { - t.Error("Incorrect inflation start time value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set & get inflation interval rate + inflationIntervalRate := 0.5 + if _, err := protocol.BootstrapInflationIntervalRate(rp, inflationIntervalRate, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetInflationIntervalRate(rp, nil); err != nil { + t.Error(err) + } else if value != inflationIntervalRate { + t.Error("Incorrect inflation interval rate value") + } + + // Set & get inflation start block + inflationStartTime := uint64(time.Now().Unix()) + 3600 + if _, err := protocol.BootstrapInflationStartTime(rp, inflationStartTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetInflationStartTime(rp, nil); err != nil { + t.Error(err) + } else if value != inflationStartTime { + t.Error("Incorrect inflation start time value") + } } - diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index 57b83707a..a107f9b8a 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -14,31 +14,32 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account + ownerAccount *accounts.Account ) - func TestMain(m *testing.M) { - var err error + var err error - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } - // Run tests - os.Exit(m.Run()) + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/settings/protocol/minipool_test.go b/tests/settings/protocol/minipool_test.go index 6df12876f..8e0d11976 100644 --- a/tests/settings/protocol/minipool_test.go +++ b/tests/settings/protocol/minipool_test.go @@ -10,71 +10,75 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestMinipoolSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) - // Get & check launch balance and deposit amounts - fullMinipoolBalance := eth.EthToWei(32) - halfMinipoolBalance := eth.EthToWei(16) - emptyMinipoolBalance := eth.EthToWei(0) - if value, err := protocol.GetMinipoolLaunchBalance(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool launch balance") - } - if value, err := protocol.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool full deposit node amount") - } - if value, err := protocol.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool half deposit node amount") - } - if value, err := protocol.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(emptyMinipoolBalance) != 0 { - t.Error("Incorrect minipool empty deposit node amount") - } - if value, err := protocol.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool full deposit user amount") - } - if value, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(halfMinipoolBalance) != 0 { - t.Error("Incorrect minipool half deposit user amount") - } - if value, err := protocol.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(fullMinipoolBalance) != 0 { - t.Error("Incorrect minipool empty deposit user amount") - } + // Get & check launch balance and deposit amounts + fullMinipoolBalance := eth.EthToWei(32) + halfMinipoolBalance := eth.EthToWei(16) + emptyMinipoolBalance := eth.EthToWei(0) + if value, err := protocol.GetMinipoolLaunchBalance(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool launch balance") + } + if value, err := protocol.GetMinipoolFullDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit node amount") + } + if value, err := protocol.GetMinipoolHalfDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit node amount") + } + if value, err := protocol.GetMinipoolEmptyDepositNodeAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(emptyMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit node amount") + } + if value, err := protocol.GetMinipoolFullDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool full deposit user amount") + } + if value, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(halfMinipoolBalance) != 0 { + t.Error("Incorrect minipool half deposit user amount") + } + if value, err := protocol.GetMinipoolEmptyDepositUserAmount(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(fullMinipoolBalance) != 0 { + t.Error("Incorrect minipool empty deposit user amount") + } - // Set & get submit withdrawable enabled - submitWithdrawableEnabled := false - if _, err := protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != submitWithdrawableEnabled { - t.Error("Incorrect minipool withdrawable submissions enabled value") - } + // Set & get submit withdrawable enabled + submitWithdrawableEnabled := false + if _, err := protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, submitWithdrawableEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinipoolSubmitWithdrawableEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitWithdrawableEnabled { + t.Error("Incorrect minipool withdrawable submissions enabled value") + } - // Set & get minipool launch timeout - var minipoolLaunchTimeout time.Duration = 5 * time.Second - if _, err := protocol.BootstrapMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinipoolLaunchTimeout(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolLaunchTimeout { - t.Error("Incorrect minipool launch timeout value") - } + // Set & get minipool launch timeout + var minipoolLaunchTimeout time.Duration = 5 * time.Second + if _, err := protocol.BootstrapMinipoolLaunchTimeout(rp, minipoolLaunchTimeout, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinipoolLaunchTimeout(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolLaunchTimeout { + t.Error("Incorrect minipool launch timeout value") + } } - diff --git a/tests/settings/protocol/network_test.go b/tests/settings/protocol/network_test.go index 2d9002904..abffda729 100644 --- a/tests/settings/protocol/network_test.go +++ b/tests/settings/protocol/network_test.go @@ -1,120 +1,124 @@ package protocol import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestNetworkSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get node consensus threshold - nodeConsensusThreshold := 0.1 - if _, err := protocol.BootstrapNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetNodeConsensusThreshold(rp, nil); err != nil { - t.Error(err) - } else if value != nodeConsensusThreshold { - t.Error("Incorrect node consensus threshold value") - } - - // Set & get network balance submissions enabled - submitBalancesEnabled := false - if _, err := protocol.BootstrapSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetSubmitBalancesEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != submitBalancesEnabled { - t.Error("Incorrect network balance submissions enabled value") - } - - // Set & get network balance submission frequency - var submitBalancesFrequency uint64 = 10 - if _, err := protocol.BootstrapSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetSubmitBalancesFrequency(rp, nil); err != nil { - t.Error(err) - } else if value != submitBalancesFrequency { - t.Error("Incorrect network balance submission frequency value") - } - - // Set & get network price submissions enabled - submitPricesEnabled := false - if _, err := protocol.BootstrapSubmitPricesEnabled(rp, submitPricesEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetSubmitPricesEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != submitPricesEnabled { - t.Error("Incorrect network price submissions enabled value") - } - - // Set & get network price submission frequency - var submitPricesFrequency uint64 = 10 - if _, err := protocol.BootstrapSubmitPricesFrequency(rp, submitPricesFrequency, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetSubmitPricesFrequency(rp, nil); err != nil { - t.Error(err) - } else if value != submitPricesFrequency { - t.Error("Incorrect network price submission frequency value") - } - - // Set & get minimum node fee - minimumNodeFee := 0.80 - if _, err := protocol.BootstrapMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinimumNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != minimumNodeFee { - t.Error("Incorrect minimum node fee value") - } - - // Set & get target node fee - targetNodeFee := 0.85 - if _, err := protocol.BootstrapTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetTargetNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != targetNodeFee { - t.Error("Incorrect target node fee value") - } - - // Set & get maximum node fee - maximumNodeFee := 0.90 - if _, err := protocol.BootstrapMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMaximumNodeFee(rp, nil); err != nil { - t.Error(err) - } else if value != maximumNodeFee { - t.Error("Incorrect maximum node fee value") - } - - // Set & get node fee demand range - nodeFeeDemandRange := eth.EthToWei(10) - if _, err := protocol.BootstrapNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetNodeFeeDemandRange(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(nodeFeeDemandRange) != 0 { - t.Error("Incorrect node fee demand range value") - } - - // Set & get target rETH collateral rate - targetRethCollateralRate := 0.95 - if _, err := protocol.BootstrapTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetTargetRethCollateralRate(rp, nil); err != nil { - t.Error(err) - } else if value != targetRethCollateralRate { - t.Error("Incorrect target rETH collateral rate value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set & get node consensus threshold + nodeConsensusThreshold := 0.1 + if _, err := protocol.BootstrapNodeConsensusThreshold(rp, nodeConsensusThreshold, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetNodeConsensusThreshold(rp, nil); err != nil { + t.Error(err) + } else if value != nodeConsensusThreshold { + t.Error("Incorrect node consensus threshold value") + } + + // Set & get network balance submissions enabled + submitBalancesEnabled := false + if _, err := protocol.BootstrapSubmitBalancesEnabled(rp, submitBalancesEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitBalancesEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesEnabled { + t.Error("Incorrect network balance submissions enabled value") + } + + // Set & get network balance submission frequency + var submitBalancesFrequency uint64 = 10 + if _, err := protocol.BootstrapSubmitBalancesFrequency(rp, submitBalancesFrequency, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitBalancesFrequency(rp, nil); err != nil { + t.Error(err) + } else if value != submitBalancesFrequency { + t.Error("Incorrect network balance submission frequency value") + } + + // Set & get network price submissions enabled + submitPricesEnabled := false + if _, err := protocol.BootstrapSubmitPricesEnabled(rp, submitPricesEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitPricesEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != submitPricesEnabled { + t.Error("Incorrect network price submissions enabled value") + } + + // Set & get network price submission frequency + var submitPricesFrequency uint64 = 10 + if _, err := protocol.BootstrapSubmitPricesFrequency(rp, submitPricesFrequency, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetSubmitPricesFrequency(rp, nil); err != nil { + t.Error(err) + } else if value != submitPricesFrequency { + t.Error("Incorrect network price submission frequency value") + } + + // Set & get minimum node fee + minimumNodeFee := 0.80 + if _, err := protocol.BootstrapMinimumNodeFee(rp, minimumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinimumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != minimumNodeFee { + t.Error("Incorrect minimum node fee value") + } + + // Set & get target node fee + targetNodeFee := 0.85 + if _, err := protocol.BootstrapTargetNodeFee(rp, targetNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetTargetNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != targetNodeFee { + t.Error("Incorrect target node fee value") + } + + // Set & get maximum node fee + maximumNodeFee := 0.90 + if _, err := protocol.BootstrapMaximumNodeFee(rp, maximumNodeFee, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMaximumNodeFee(rp, nil); err != nil { + t.Error(err) + } else if value != maximumNodeFee { + t.Error("Incorrect maximum node fee value") + } + + // Set & get node fee demand range + nodeFeeDemandRange := eth.EthToWei(10) + if _, err := protocol.BootstrapNodeFeeDemandRange(rp, nodeFeeDemandRange, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetNodeFeeDemandRange(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(nodeFeeDemandRange) != 0 { + t.Error("Incorrect node fee demand range value") + } + + // Set & get target rETH collateral rate + targetRethCollateralRate := 0.95 + if _, err := protocol.BootstrapTargetRethCollateralRate(rp, targetRethCollateralRate, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetTargetRethCollateralRate(rp, nil); err != nil { + t.Error(err) + } else if value != targetRethCollateralRate { + t.Error("Incorrect target rETH collateral rate value") + } } - diff --git a/tests/settings/protocol/node_test.go b/tests/settings/protocol/node_test.go index f591a8fd7..ac4dd7961 100644 --- a/tests/settings/protocol/node_test.go +++ b/tests/settings/protocol/node_test.go @@ -1,59 +1,63 @@ package protocol import ( - "testing" + "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestNodeSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get node registrations enabled - nodeRegistrationsEnabled := false - if _, err := protocol.BootstrapNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetNodeRegistrationEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != nodeRegistrationsEnabled { - t.Error("Incorrect node registrations enabled value") - } - - // Set & get node deposits enabled - nodeDepositsEnabled := false - if _, err := protocol.BootstrapNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetNodeDepositEnabled(rp, nil); err != nil { - t.Error(err) - } else if value != nodeDepositsEnabled { - t.Error("Incorrect node deposits enabled value") - } - - // Set & get minimum per minipool RPL stake - minimumPerMinipoolStake := 1.0 - if _, err := protocol.BootstrapMinimumPerMinipoolStake(rp, minimumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMinimumPerMinipoolStake(rp, nil); err != nil { - t.Error(err) - } else if value != minimumPerMinipoolStake { - t.Error("Incorrect minimum per minipool stake value") - } - - // Set & get maximum per minipool RPL stake - maximumPerMinipoolStake := 10.0 - if _, err := protocol.BootstrapMaximumPerMinipoolStake(rp, maximumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocol.GetMaximumPerMinipoolStake(rp, nil); err != nil { - t.Error(err) - } else if value != maximumPerMinipoolStake { - t.Error("Incorrect maximum per minipool stake value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set & get node registrations enabled + nodeRegistrationsEnabled := false + if _, err := protocol.BootstrapNodeRegistrationEnabled(rp, nodeRegistrationsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetNodeRegistrationEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeRegistrationsEnabled { + t.Error("Incorrect node registrations enabled value") + } + + // Set & get node deposits enabled + nodeDepositsEnabled := false + if _, err := protocol.BootstrapNodeDepositEnabled(rp, nodeDepositsEnabled, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetNodeDepositEnabled(rp, nil); err != nil { + t.Error(err) + } else if value != nodeDepositsEnabled { + t.Error("Incorrect node deposits enabled value") + } + + // Set & get minimum per minipool RPL stake + minimumPerMinipoolStake := 1.0 + if _, err := protocol.BootstrapMinimumPerMinipoolStake(rp, minimumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMinimumPerMinipoolStake(rp, nil); err != nil { + t.Error(err) + } else if value != minimumPerMinipoolStake { + t.Error("Incorrect minimum per minipool stake value") + } + + // Set & get maximum per minipool RPL stake + maximumPerMinipoolStake := 10.0 + if _, err := protocol.BootstrapMaximumPerMinipoolStake(rp, maximumPerMinipoolStake, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocol.GetMaximumPerMinipoolStake(rp, nil); err != nil { + t.Error(err) + } else if value != maximumPerMinipoolStake { + t.Error("Incorrect maximum per minipool stake value") + } } - diff --git a/tests/settings/protocol/rewards_test.go b/tests/settings/protocol/rewards_test.go index 2f3a8293a..ce567ca3b 100644 --- a/tests/settings/protocol/rewards_test.go +++ b/tests/settings/protocol/rewards_test.go @@ -9,44 +9,48 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - func TestRewardsSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Bootstrap a claimer & get claimer settings - claimerPerc := 0.1 - if _, err := protocoldao.BootstrapClaimer(rp, "rocketClaimNode", claimerPerc, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else { - if value, err := protocolsettings.GetRewardsClaimerPerc(rp, "rocketClaimNode", nil); err != nil { - t.Error(err) - } else if value != claimerPerc { - t.Errorf("Incorrect rewards claimer percent %f", value) - } - if value, err := protocolsettings.GetRewardsClaimerPercTimeUpdated(rp, "rocketClaimNode", nil); err != nil { - t.Error(err) - } else if value == 0 { - t.Errorf("Incorrect rewards claimer percent time updated %d", value) - } - if value, err := protocolsettings.GetRewardsClaimersPercTotal(rp, nil); err != nil { - t.Error(err) - } else if value == 0 { - t.Errorf("Incorrect rewards claimers total percent %f", value) - } - } - - // Set & get rewards claim interval time - var rewardsClaimIntervalTime uint64 = 1 - if _, err := protocolsettings.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := protocolsettings.GetRewardsClaimIntervalTime(rp, nil); err != nil { - t.Error(err) - } else if value != rewardsClaimIntervalTime { - t.Error("Incorrect rewards claim interval time value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Bootstrap a claimer & get claimer settings + claimerPerc := 0.1 + if _, err := protocoldao.BootstrapClaimer(rp, "rocketClaimNode", claimerPerc, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else { + if value, err := protocolsettings.GetRewardsClaimerPerc(rp, "rocketClaimNode", nil); err != nil { + t.Error(err) + } else if value != claimerPerc { + t.Errorf("Incorrect rewards claimer percent %f", value) + } + if value, err := protocolsettings.GetRewardsClaimerPercTimeUpdated(rp, "rocketClaimNode", nil); err != nil { + t.Error(err) + } else if value == 0 { + t.Errorf("Incorrect rewards claimer percent time updated %d", value) + } + if value, err := protocolsettings.GetRewardsClaimersPercTotal(rp, nil); err != nil { + t.Error(err) + } else if value == 0 { + t.Errorf("Incorrect rewards claimers total percent %f", value) + } + } + + // Set & get rewards claim interval time + var rewardsClaimIntervalTime uint64 = 1 + if _, err := protocolsettings.BootstrapRewardsClaimIntervalTime(rp, rewardsClaimIntervalTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := protocolsettings.GetRewardsClaimIntervalTime(rp, nil); err != nil { + t.Error(err) + } else if value != rewardsClaimIntervalTime { + t.Error("Incorrect rewards claim interval time value") + } } - diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index d722227dc..7217a3603 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -14,40 +14,47 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool + client *uc.EthClientProxy + rp *rocketpool.RocketPool - ownerAccount *accounts.Account - trustedNodeAccount1 *accounts.Account - trustedNodeAccount2 *accounts.Account - trustedNodeAccount3 *accounts.Account + ownerAccount *accounts.Account + trustedNodeAccount1 *accounts.Account + trustedNodeAccount2 *accounts.Account + trustedNodeAccount3 *accounts.Account ) - func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount1, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - trustedNodeAccount2, err = accounts.GetAccount(2) - if err != nil { log.Fatal(err) } - trustedNodeAccount3, err = accounts.GetAccount(3) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error + + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount1, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount2, err = accounts.GetAccount(2) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount3, err = accounts.GetAccount(3) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) } - diff --git a/tests/settings/trustednode/members_test.go b/tests/settings/trustednode/members_test.go index cb78cdc74..a881706a3 100644 --- a/tests/settings/trustednode/members_test.go +++ b/tests/settings/trustednode/members_test.go @@ -12,132 +12,151 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestBootstrapMembersSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get quorum - quorum := 0.1 - if _, err := trustednode.BootstrapQuorum(rp, quorum, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { - t.Error(err) - } else if value != quorum { - t.Error("Incorrect quorum value") - } - - // Set & get rpl bond - rplBond := eth.EthToWei(1) - if _, err := trustednode.BootstrapRPLBond(rp, rplBond, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(rplBond) != 0 { - t.Error("Incorrect rpl bond value") - } - - // Set & get maximum unbonded minipools - var minipoolUnbondedMax uint64 = 1 - if _, err := trustednode.BootstrapMinipoolUnbondedMax(rp, minipoolUnbondedMax, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolUnbondedMax { - t.Error("Incorrect maximum unbonded minipools value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set & get quorum + quorum := 0.1 + if _, err := trustednode.BootstrapQuorum(rp, quorum, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { + t.Error(err) + } else if value != quorum { + t.Error("Incorrect quorum value") + } + + // Set & get rpl bond + rplBond := eth.EthToWei(1) + if _, err := trustednode.BootstrapRPLBond(rp, rplBond, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(rplBond) != 0 { + t.Error("Incorrect rpl bond value") + } + + // Set & get maximum unbonded minipools + var minipoolUnbondedMax uint64 = 1 + if _, err := trustednode.BootstrapMinipoolUnbondedMax(rp, minipoolUnbondedMax, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolUnbondedMax { + t.Error("Incorrect maximum unbonded minipools value") + } } - func TestProposeMembersSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Set & get quorum - quorum := 0.1 - if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { - t.Error(err) - } else if value != quorum { - t.Error("Incorrect quorum value") - } - - // Set & get rpl bond - rplBond := eth.EthToWei(1) - if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(rplBond) != 0 { - t.Error("Incorrect rpl bond value") - } - - // Set & get maximum unbonded minipools - var minipoolUnbondedMax uint64 = 1 - if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { - t.Error(err) - } else if value != minipoolUnbondedMax { - t.Error("Incorrect maximum unbonded minipools value") - } - - // Set & get member challenge cooldown period - var memberChallengeCooldown uint64 = 1 - if proposalId, _, err := trustednode.ProposeChallengeCooldown(rp, memberChallengeCooldown, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetChallengeCooldown(rp, nil); err != nil { - t.Error(err) - } else if value != memberChallengeCooldown { - t.Error("Incorrect member challenge cooldown value") - } - - // Set & get member challenge window period - var memberChallengeWindow uint64 = 1 - if proposalId, _, err := trustednode.ProposeChallengeWindow(rp, memberChallengeWindow, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetChallengeWindow(rp, nil); err != nil { - t.Error(err) - } else if value != memberChallengeWindow { - t.Error("Incorrect member challenge window value") - } - - // Set & get member challenge cost amount - challengeCost := eth.EthToWei(1) - if proposalId, _, err := trustednode.ProposeChallengeCost(rp, challengeCost, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetChallengeCost(rp, nil); err != nil { - t.Error(err) - } else if value.Cmp(challengeCost) != 0 { - t.Error("Incorrect member challenge cost value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Set & get quorum + quorum := 0.1 + if proposalId, _, err := trustednode.ProposeQuorum(rp, quorum, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetQuorum(rp, nil); err != nil { + t.Error(err) + } else if value != quorum { + t.Error("Incorrect quorum value") + } + + // Set & get rpl bond + rplBond := eth.EthToWei(1) + if proposalId, _, err := trustednode.ProposeRPLBond(rp, rplBond, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetRPLBond(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(rplBond) != 0 { + t.Error("Incorrect rpl bond value") + } + + // Set & get maximum unbonded minipools + var minipoolUnbondedMax uint64 = 1 + if proposalId, _, err := trustednode.ProposeMinipoolUnbondedMax(rp, minipoolUnbondedMax, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetMinipoolUnbondedMax(rp, nil); err != nil { + t.Error(err) + } else if value != minipoolUnbondedMax { + t.Error("Incorrect maximum unbonded minipools value") + } + + // Set & get member challenge cooldown period + var memberChallengeCooldown uint64 = 1 + if proposalId, _, err := trustednode.ProposeChallengeCooldown(rp, memberChallengeCooldown, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeCooldown(rp, nil); err != nil { + t.Error(err) + } else if value != memberChallengeCooldown { + t.Error("Incorrect member challenge cooldown value") + } + + // Set & get member challenge window period + var memberChallengeWindow uint64 = 1 + if proposalId, _, err := trustednode.ProposeChallengeWindow(rp, memberChallengeWindow, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeWindow(rp, nil); err != nil { + t.Error(err) + } else if value != memberChallengeWindow { + t.Error("Incorrect member challenge window value") + } + + // Set & get member challenge cost amount + challengeCost := eth.EthToWei(1) + if proposalId, _, err := trustednode.ProposeChallengeCost(rp, challengeCost, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetChallengeCost(rp, nil); err != nil { + t.Error(err) + } else if value.Cmp(challengeCost) != 0 { + t.Error("Incorrect member challenge cost value") + } } - diff --git a/tests/settings/trustednode/proposals_test.go b/tests/settings/trustednode/proposals_test.go index 37042e768..d391ab32b 100644 --- a/tests/settings/trustednode/proposals_test.go +++ b/tests/settings/trustednode/proposals_test.go @@ -11,140 +11,159 @@ import ( nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" ) - func TestBootstrapProposalsSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set & get cooldown - var cooldown uint64 = 1 - if _, err := trustednode.BootstrapProposalCooldownTime(rp, cooldown, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { - t.Error(err) - } else if value != cooldown { - t.Error("Incorrect cooldown value") - } - - // Set & get vote time - var voteTime uint64 = 10 - if _, err := trustednode.BootstrapProposalVoteTime(rp, voteTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { - t.Error(err) - } else if value != voteTime { - t.Error("Incorrect vote time value") - } - - // Set & get execute time - var executeTime uint64 = 10 - if _, err := trustednode.BootstrapProposalExecuteTime(rp, executeTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { - t.Error(err) - } else if value != executeTime { - t.Error("Incorrect execute time value") - } - - // Set & get action time - var actionTime uint64 = 10 - if _, err := trustednode.BootstrapProposalActionTime(rp, actionTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { - t.Error(err) - } else if value != actionTime { - t.Error("Incorrect action time value") - } - - // Set & get vote delay time - var voteDelayTime uint64 = 1000 - if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, voteDelayTime, ownerAccount.GetTransactor()); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { - t.Error(err) - } else if value != voteDelayTime { - t.Error("Incorrect vote delay time value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set & get cooldown + var cooldown uint64 = 1 + if _, err := trustednode.BootstrapProposalCooldownTime(rp, cooldown, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { + t.Error(err) + } else if value != cooldown { + t.Error("Incorrect cooldown value") + } + + // Set & get vote time + var voteTime uint64 = 10 + if _, err := trustednode.BootstrapProposalVoteTime(rp, voteTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { + t.Error(err) + } else if value != voteTime { + t.Error("Incorrect vote time value") + } + + // Set & get execute time + var executeTime uint64 = 10 + if _, err := trustednode.BootstrapProposalExecuteTime(rp, executeTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { + t.Error(err) + } else if value != executeTime { + t.Error("Incorrect execute time value") + } + + // Set & get action time + var actionTime uint64 = 10 + if _, err := trustednode.BootstrapProposalActionTime(rp, actionTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { + t.Error(err) + } else if value != actionTime { + t.Error("Incorrect action time value") + } + + // Set & get vote delay time + var voteDelayTime uint64 = 1000 + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, voteDelayTime, ownerAccount.GetTransactor()); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { + t.Error(err) + } else if value != voteDelayTime { + t.Error("Incorrect vote delay time value") + } } - func TestProposeProposalsSettings(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Set proposal cooldown - if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { t.Fatal(err) } - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { t.Fatal(err) } - - // Set & get cooldown - var cooldown uint64 = 1 - if proposalId, _, err := trustednode.ProposeProposalCooldownTime(rp, cooldown, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { - t.Error(err) - } else if value != cooldown { - t.Error("Incorrect cooldown value") - } - - // Set & get vote time - var voteTime uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalVoteTime(rp, voteTime, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { - t.Error(err) - } else if value != voteTime { - t.Error("Incorrect vote time value") - } - - // Set & get execute time - var executeTime uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalExecuteTime(rp, executeTime, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { - t.Error(err) - } else if value != executeTime { - t.Error("Incorrect execute time value") - } - - // Set & get action time - var actionTime uint64 = 10 - if proposalId, _, err := trustednode.ProposeProposalActionTime(rp, actionTime, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { - t.Error(err) - } else if value != actionTime { - t.Error("Incorrect action time value") - } - - // Set & get vote delay time - var voteDelayTime uint64 = 1000 - if proposalId, _, err := trustednode.ProposeProposalVoteDelayTime(rp, voteDelayTime, trustedNodeAccount1.GetTransactor()); err != nil { - t.Error(err) - } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { - t.Error(err) - } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { - t.Error(err) - } else if value != voteDelayTime { - t.Error("Incorrect vote delay time value") - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Set proposal cooldown + if _, err := trustednode.BootstrapProposalCooldownTime(rp, 0, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + if _, err := trustednode.BootstrapProposalVoteDelayTime(rp, 5, ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount1); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount2); err != nil { + t.Fatal(err) + } + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount3); err != nil { + t.Fatal(err) + } + + // Set & get cooldown + var cooldown uint64 = 1 + if proposalId, _, err := trustednode.ProposeProposalCooldownTime(rp, cooldown, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalCooldownTime(rp, nil); err != nil { + t.Error(err) + } else if value != cooldown { + t.Error("Incorrect cooldown value") + } + + // Set & get vote time + var voteTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalVoteTime(rp, voteTime, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteTime(rp, nil); err != nil { + t.Error(err) + } else if value != voteTime { + t.Error("Incorrect vote time value") + } + + // Set & get execute time + var executeTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalExecuteTime(rp, executeTime, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalExecuteTime(rp, nil); err != nil { + t.Error(err) + } else if value != executeTime { + t.Error("Incorrect execute time value") + } + + // Set & get action time + var actionTime uint64 = 10 + if proposalId, _, err := trustednode.ProposeProposalActionTime(rp, actionTime, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalActionTime(rp, nil); err != nil { + t.Error(err) + } else if value != actionTime { + t.Error("Incorrect action time value") + } + + // Set & get vote delay time + var voteDelayTime uint64 = 1000 + if proposalId, _, err := trustednode.ProposeProposalVoteDelayTime(rp, voteDelayTime, trustedNodeAccount1.GetTransactor()); err != nil { + t.Error(err) + } else if err := daoutils.PassAndExecuteProposal(rp, proposalId, []*accounts.Account{trustedNodeAccount1, trustedNodeAccount2}); err != nil { + t.Error(err) + } else if value, err := trustednode.GetProposalVoteDelayTime(rp, nil); err != nil { + t.Error(err) + } else if value != voteDelayTime { + t.Error("Incorrect vote delay time value") + } } - diff --git a/tests/testutils/accounts/accounts.go b/tests/testutils/accounts/accounts.go index 8c2ee0e07..b1c8f9c17 100644 --- a/tests/testutils/accounts/accounts.go +++ b/tests/testutils/accounts/accounts.go @@ -1,49 +1,49 @@ package accounts import ( - "context" - "crypto/ecdsa" - "encoding/hex" + "context" + "crypto/ecdsa" + "encoding/hex" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) - // An account containing a keypair and address type Account struct { - PrivateKey *ecdsa.PrivateKey - Address common.Address + PrivateKey *ecdsa.PrivateKey + Address common.Address } - // Get an account by index func GetAccount(index uint8) (*Account, error) { - // Get private key data - privateKeyBytes, err := hex.DecodeString(tests.AccountPrivateKeys[index]) - if err != nil { return nil, err } + // Get private key data + privateKeyBytes, err := hex.DecodeString(tests.AccountPrivateKeys[index]) + if err != nil { + return nil, err + } - // Get private key - privateKey, err := crypto.ToECDSA(privateKeyBytes) - if err != nil { return nil, err } + // Get private key + privateKey, err := crypto.ToECDSA(privateKeyBytes) + if err != nil { + return nil, err + } - // Return account - return &Account{ - PrivateKey: privateKey, - Address: crypto.PubkeyToAddress(privateKey.PublicKey), - }, nil + // Return account + return &Account{ + PrivateKey: privateKey, + Address: crypto.PubkeyToAddress(privateKey.PublicKey), + }, nil } - // Get a transactor for an account func (a *Account) GetTransactor() *bind.TransactOpts { - opts := bind.NewKeyedTransactor(a.PrivateKey) - opts.Context = context.Background() - return opts + opts := bind.NewKeyedTransactor(a.PrivateKey) + opts.Context = context.Background() + return opts } - diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index 0c77ef1a0..f6b920b6c 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -19,41 +19,60 @@ import ( // Create an amount of slashed RPL in the auction contract func CreateSlashedRPL(t *testing.T, rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount, trustedNodeAccount2 *accounts.Account, userAccount *accounts.Account) error { - // Stake a large amount of RPL against the node - if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { return err } + // Stake a large amount of RPL against the node + if err := nodeutils.StakeRPL(rp, ownerAccount, trustedNodeAccount, eth.EthToWei(1000000)); err != nil { + return err + } - // Make user deposit - depositOpts := userAccount.GetTransactor(); - depositOpts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, depositOpts); err != nil { return err } + // Make user deposit + depositOpts := userAccount.GetTransactor() + depositOpts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, depositOpts); err != nil { + return err + } - // Create unbonded minipool - mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(16), 1) - if err != nil { return err } + // Create unbonded minipool + mp, err := minipoolutils.CreateMinipool(t, rp, ownerAccount, trustedNodeAccount, eth.EthToWei(16), 1) + if err != nil { + return err + } - // Deposit user ETH to minipool - opts := userAccount.GetTransactor() - opts.Value = eth.EthToWei(16) - if _, err := deposit.Deposit(rp, opts); err != nil { return err } + // Deposit user ETH to minipool + opts := userAccount.GetTransactor() + opts.Value = eth.EthToWei(16) + if _, err := deposit.Deposit(rp, opts); err != nil { + return err + } - // Delay for the time between depositing and staking - scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) - if err != nil { return err } - err = evm.IncreaseTime(int(scrubPeriod + 1)) - if err != nil { return fmt.Errorf("Could not increase time: %w", err) } + // Delay for the time between depositing and staking + scrubPeriod, err := trustednode.GetScrubPeriod(rp, nil) + if err != nil { + return err + } + err = evm.IncreaseTime(int(scrubPeriod + 1)) + if err != nil { + return fmt.Errorf("Could not increase time: %w", err) + } - // Stake minipool - if err := minipoolutils.StakeMinipool(rp, mp, trustedNodeAccount); err != nil { return err } + // Stake minipool + if err := minipoolutils.StakeMinipool(rp, mp, trustedNodeAccount); err != nil { + return err + } - // Mark minipool as withdrawable with zero end balance - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { return err } - if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount2.GetTransactor()); err != nil { return err } + // Mark minipool as withdrawable with zero end balance + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount.GetTransactor()); err != nil { + return err + } + if _, err := minipool.SubmitMinipoolWithdrawable(rp, mp.Address, trustedNodeAccount2.GetTransactor()); err != nil { + return err + } - // Distribute balance and finalise pool to send slashed RPL to auction contract - if _, err := mp.DistributeBalanceAndFinalise(trustedNodeAccount.GetTransactor()); err != nil { return err } + // Distribute balance and finalise pool to send slashed RPL to auction contract + if _, err := mp.DistributeBalanceAndFinalise(trustedNodeAccount.GetTransactor()); err != nil { + return err + } - // Return - return nil + // Return + return nil } - diff --git a/tests/testutils/dao/proposals.go b/tests/testutils/dao/proposals.go index 762cc8166..b687a2166 100644 --- a/tests/testutils/dao/proposals.go +++ b/tests/testutils/dao/proposals.go @@ -1,42 +1,48 @@ package dao import ( - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/rocketpool-go/dao" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + rptypes "github.com/rocket-pool/rocketpool-go/types" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) - // Pass and execute a proposal func PassAndExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, trustedNodeAccounts []*accounts.Account) error { - // Get proposal voting delay - voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) - if err != nil { return err } - - // Increase time until proposal voting delay has passed - if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { return err } - - // Vote on proposal until passed - for _, account := range trustedNodeAccounts { - if state, err := dao.GetProposalState(rp, proposalId, nil); err != nil { - return err - } else if state == rptypes.Succeeded { - break; - } - if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, account.GetTransactor()); err != nil { return err } - } - - // Execute proposal - if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccounts[0].GetTransactor()); err != nil { return err } - - // Return - return nil + // Get proposal voting delay + voteDelayTime, err := trustednodesettings.GetProposalVoteDelayTime(rp, nil) + if err != nil { + return err + } + + // Increase time until proposal voting delay has passed + if err := evm.IncreaseTime(int(voteDelayTime)); err != nil { + return err + } + + // Vote on proposal until passed + for _, account := range trustedNodeAccounts { + if state, err := dao.GetProposalState(rp, proposalId, nil); err != nil { + return err + } else if state == rptypes.Succeeded { + break + } + if _, err := trustednodedao.VoteOnProposal(rp, proposalId, true, account.GetTransactor()); err != nil { + return err + } + } + + // Execute proposal + if _, err := trustednodedao.ExecuteProposal(rp, proposalId, trustedNodeAccounts[0].GetTransactor()); err != nil { + return err + } + + // Return + return nil } - diff --git a/tests/testutils/evm/mining.go b/tests/testutils/evm/mining.go index eacf06c69..3d80324f3 100644 --- a/tests/testutils/evm/mining.go +++ b/tests/testutils/evm/mining.go @@ -9,34 +9,42 @@ import ( // Mine a number of blocks func MineBlocks(numBlocks int) error { - // Initialize RPC client - client, err := rpc.Dial(tests.Eth1ProviderAddress) - if err != nil { return err } - - // Make RPC calls - for bi := 0; bi < numBlocks; bi++ { - if err := client.Call(nil, "evm_mine"); err != nil { return err } - } - - // Return - return nil + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { + return err + } + + // Make RPC calls + for bi := 0; bi < numBlocks; bi++ { + if err := client.Call(nil, "evm_mine"); err != nil { + return err + } + } + + // Return + return nil } - // Fast forward to some number of seconds func IncreaseTime(time int) error { - // Initialize RPC client - client, err := rpc.Dial(tests.Eth1ProviderAddress) - if err != nil { return err } + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { + return err + } - // Make RPC calls - if err := client.Call(nil, "evm_increaseTime", time); err != nil { return err } - if err := MineBlocks(1); err != nil { return err } + // Make RPC calls + if err := client.Call(nil, "evm_increaseTime", time); err != nil { + return err + } + if err := MineBlocks(1); err != nil { + return err + } - // Return - return nil + // Return + return nil } - diff --git a/tests/testutils/evm/snapshots.go b/tests/testutils/evm/snapshots.go index 3c2ceb047..a5eba8090 100644 --- a/tests/testutils/evm/snapshots.go +++ b/tests/testutils/evm/snapshots.go @@ -1,43 +1,45 @@ package evm import ( - "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/rpc" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/rocketpool-go/tests" ) - // The ID of the current snapshot of the EVM state var snapshotId string - // Take a snapshot of the EVM state func TakeSnapshot() error { - // Initialize RPC client - client, err := rpc.Dial(tests.Eth1ProviderAddress) - if err != nil { return err } + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { + return err + } - // Make RPC call - var response string - if err := client.Call(&response, "evm_snapshot"); err != nil { return err } + // Make RPC call + var response string + if err := client.Call(&response, "evm_snapshot"); err != nil { + return err + } - // Set snapshot ID & return - snapshotId = response - return nil + // Set snapshot ID & return + snapshotId = response + return nil } - // Restore a snapshot of the EVM state func RevertSnapshot() error { - // Initialize RPC client - client, err := rpc.Dial(tests.Eth1ProviderAddress) - if err != nil { return err } + // Initialize RPC client + client, err := rpc.Dial(tests.Eth1ProviderAddress) + if err != nil { + return err + } - // Make RPC call & return - return client.Call(nil, "evm_revert", snapshotId) + // Make RPC call & return + return client.Call(nil, "evm_revert", snapshotId) } - diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index a33a7e2b8..5fe51a72d 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -21,85 +21,101 @@ import ( // Minipool created event type minipoolCreated struct { - Minipool common.Address - Node common.Address - Time *big.Int + Minipool common.Address + Node common.Address + Time *big.Int } - // Create a minipool func CreateMinipool(t *testing.T, rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, depositAmount *big.Int, pubkey int) (*minipool.Minipool, error) { - // Mint & stake RPL required for mininpool - rplRequired, err := GetMinipoolRPLRequired(rp) - if err != nil { return nil, err } - if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { return nil, err } - - // Do the node deposit to generate the minipool - expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(t, rp, nodeAccount, depositAmount, pubkey) - if err != nil { - return nil, fmt.Errorf("Could not do node deposit: %w", err) - } - - // Get minipool manager contract - rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager") - if err != nil { return nil, err } - - // Get created minipool address - minipoolCreatedEvents, err := rocketMinipoolManager.GetTransactionEvents(txReceipt, "MinipoolCreated", minipoolCreated{}) - if err != nil || len(minipoolCreatedEvents) == 0 { - return nil, errors.New("Could not get minipool created event") - } - minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool - - // Sanity check to verify the created minipool is at the expected address - if expectedMinipoolAddress != minipoolAddress { - return nil, errors.New(fmt.Sprintf("Expected minipool address %s but got %s", expectedMinipoolAddress.Hex(), minipoolAddress.Hex())) - } - - // Return minipool instance - return minipool.NewMinipool(rp, minipoolAddress) + // Mint & stake RPL required for mininpool + rplRequired, err := GetMinipoolRPLRequired(rp) + if err != nil { + return nil, err + } + if err := nodeutils.StakeRPL(rp, ownerAccount, nodeAccount, rplRequired); err != nil { + return nil, err + } + + // Do the node deposit to generate the minipool + expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(t, rp, nodeAccount, depositAmount, pubkey) + if err != nil { + return nil, fmt.Errorf("Could not do node deposit: %w", err) + } + + // Get minipool manager contract + rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager") + if err != nil { + return nil, err + } + + // Get created minipool address + minipoolCreatedEvents, err := rocketMinipoolManager.GetTransactionEvents(txReceipt, "MinipoolCreated", minipoolCreated{}) + if err != nil || len(minipoolCreatedEvents) == 0 { + return nil, errors.New("Could not get minipool created event") + } + minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool + + // Sanity check to verify the created minipool is at the expected address + if expectedMinipoolAddress != minipoolAddress { + return nil, errors.New(fmt.Sprintf("Expected minipool address %s but got %s", expectedMinipoolAddress.Hex(), minipoolAddress.Hex())) + } + + // Return minipool instance + return minipool.NewMinipool(rp, minipoolAddress) } - // Stake a minipool func StakeMinipool(rp *rocketpool.RocketPool, mp *minipool.Minipool, nodeAccount *accounts.Account) error { - // Get validator & deposit data - validatorPubkey, err := validator.GetValidatorPubkey(1) - if err != nil { return err } - withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) - if err != nil { return err } - validatorSignature, err := validator.GetValidatorSignature(1) - if err != nil { return err } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) - if err != nil { return err } - - // Stake minipool & return - _, err = mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()) - return err + // Get validator & deposit data + validatorPubkey, err := validator.GetValidatorPubkey(1) + if err != nil { + return err + } + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, mp.Address, nil) + if err != nil { + return err + } + validatorSignature, err := validator.GetValidatorSignature(1) + if err != nil { + return err + } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) + if err != nil { + return err + } + + // Stake minipool & return + _, err = mp.Stake(validatorSignature, depositDataRoot, nodeAccount.GetTransactor()) + return err } - // Get the RPL required per minipool func GetMinipoolRPLRequired(rp *rocketpool.RocketPool) (*big.Int, error) { - // Get data - depositUserAmount, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil) - if err != nil { return nil, err } - minimumPerMinipoolStake, err := protocol.GetMinimumPerMinipoolStake(rp, nil) - if err != nil { return nil, err } - rplPrice, err := network.GetRPLPrice(rp, nil) - if err != nil { return nil, err } - - // Calculate and return RPL required - var tmp big.Int - var rplRequired big.Int - tmp.Mul(depositUserAmount, eth.EthToWei(minimumPerMinipoolStake)) - rplRequired.Quo(&tmp, rplPrice) - return &rplRequired, nil + // Get data + depositUserAmount, err := protocol.GetMinipoolHalfDepositUserAmount(rp, nil) + if err != nil { + return nil, err + } + minimumPerMinipoolStake, err := protocol.GetMinimumPerMinipoolStake(rp, nil) + if err != nil { + return nil, err + } + rplPrice, err := network.GetRPLPrice(rp, nil) + if err != nil { + return nil, err + } + + // Calculate and return RPL required + var tmp big.Int + var rplRequired big.Int + tmp.Mul(depositUserAmount, eth.EthToWei(minimumPerMinipoolStake)) + rplRequired.Quo(&tmp, rplPrice) + return &rplRequired, nil } - diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go index 23d111ca9..aa33fa8e8 100644 --- a/tests/testutils/node/deposit.go +++ b/tests/testutils/node/deposit.go @@ -21,43 +21,57 @@ var salt int64 = 0 // Returns a unique salt for minipool address generation func GetSalt() *big.Int { - salt += 1 - return big.NewInt(salt) + salt += 1 + return big.NewInt(salt) } - // Call deposit on the node using the validator test values func Deposit(t *testing.T, rp *rocketpool.RocketPool, nodeAccount *accounts.Account, depositAmount *big.Int, pubkey int) (common.Address, *types.Receipt, error) { - // Get the next salt - salt := GetSalt() - - // Get validator & deposit data - depositType, err := node.GetDepositType(rp, depositAmount, nil) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting deposit type: %w", err) } - validatorPubkey, err := validator.GetValidatorPubkey(pubkey) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator pubkey: %w", err) } - expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, depositType, salt, nil) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error generating minipool address: %w", err) } - withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, expectedMinipoolAddress, nil) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting minipool withdrawal credentials: %w", err) } - validatorSignature, err := validator.GetValidatorSignature(pubkey) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting validator signature: %w", err) } - depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error getting deposit data root: %w", err) } - - // Make node deposit - opts := nodeAccount.GetTransactor() - opts.Value = depositAmount - - minNodeFee := 0.0 - //t.Logf("Deposit:\n\tMin Node Fee: %f\n\tValidator Pubkey: %s\n\tValidator Signature: %s\n\tDeposit Data Root: %s\n\tNode Address: %s\n\tSalt: %s\n\tExpected Minipool: %s\n", - // minNodeFee, validatorPubkey.Hex(), validatorSignature.Hex(), depositDataRoot.Hex(), nodeAccount.Address.Hex(), GetDefaultSalt().String(), expectedMinipoolAddress.Hex()) - hash, err := node.Deposit(rp, minNodeFee, validatorPubkey, validatorSignature, depositDataRoot, salt, expectedMinipoolAddress, opts) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error executing deposit: %w", err) } - txReceipt, err := utils.WaitForTransaction(rp.Client, hash) - if err != nil { return common.Address{}, nil, fmt.Errorf("Error waiting for deposit transaction: %w", err) } - - return expectedMinipoolAddress, txReceipt, nil -} + // Get the next salt + salt := GetSalt() + + // Get validator & deposit data + depositType, err := node.GetDepositType(rp, depositAmount, nil) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error getting deposit type: %w", err) + } + validatorPubkey, err := validator.GetValidatorPubkey(pubkey) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error getting validator pubkey: %w", err) + } + expectedMinipoolAddress, err := utils.GenerateAddress(rp, nodeAccount.Address, depositType, salt, nil) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error generating minipool address: %w", err) + } + withdrawalCredentials, err := minipool.GetMinipoolWithdrawalCredentials(rp, expectedMinipoolAddress, nil) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error getting minipool withdrawal credentials: %w", err) + } + validatorSignature, err := validator.GetValidatorSignature(pubkey) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error getting validator signature: %w", err) + } + depositDataRoot, err := validator.GetDepositDataRoot(validatorPubkey, withdrawalCredentials, validatorSignature) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error getting deposit data root: %w", err) + } + // Make node deposit + opts := nodeAccount.GetTransactor() + opts.Value = depositAmount + + minNodeFee := 0.0 + //t.Logf("Deposit:\n\tMin Node Fee: %f\n\tValidator Pubkey: %s\n\tValidator Signature: %s\n\tDeposit Data Root: %s\n\tNode Address: %s\n\tSalt: %s\n\tExpected Minipool: %s\n", + // minNodeFee, validatorPubkey.Hex(), validatorSignature.Hex(), depositDataRoot.Hex(), nodeAccount.Address.Hex(), GetDefaultSalt().String(), expectedMinipoolAddress.Hex()) + hash, err := node.Deposit(rp, minNodeFee, validatorPubkey, validatorSignature, depositDataRoot, salt, expectedMinipoolAddress, opts) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error executing deposit: %w", err) + } + txReceipt, err := utils.WaitForTransaction(rp.Client, hash) + if err != nil { + return common.Address{}, nil, fmt.Errorf("Error waiting for deposit transaction: %w", err) + } + + return expectedMinipoolAddress, txReceipt, nil +} diff --git a/tests/testutils/node/node.go b/tests/testutils/node/node.go index da8e99f43..dcaf52ab2 100644 --- a/tests/testutils/node/node.go +++ b/tests/testutils/node/node.go @@ -1,62 +1,74 @@ package node import ( - "fmt" + "fmt" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" + trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - // Trusted node counter var trustedNodeIndex = 0 - // Register a trusted node func RegisterTrustedNode(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { - // Register node - if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { return err } + // Register node + if _, err := node.RegisterNode(rp, "Australia/Brisbane", trustedNodeAccount.GetTransactor()); err != nil { + return err + } - // Bootstrap trusted node DAO member - if _, err := trustednodedao.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { return err } + // Bootstrap trusted node DAO member + if _, err := trustednodedao.BootstrapMember(rp, fmt.Sprintf("tn%d", trustedNodeIndex), fmt.Sprintf("tn%d@rocketpool.net", trustedNodeIndex), trustedNodeAccount.Address, ownerAccount.GetTransactor()); err != nil { + return err + } - // Mint trusted node RPL bond - if err := MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount); err != nil { return err } + // Mint trusted node RPL bond + if err := MintTrustedNodeBond(rp, ownerAccount, trustedNodeAccount); err != nil { + return err + } - // Join trusted node DAO - if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { return err } + // Join trusted node DAO + if _, err := trustednodedao.Join(rp, trustedNodeAccount.GetTransactor()); err != nil { + return err + } - // Increment trusted node counter & return - trustedNodeIndex++ - return nil + // Increment trusted node counter & return + trustedNodeIndex++ + return nil } - // Mint trusted node DAO RPL bond to a node account and approve it for spending func MintTrustedNodeBond(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, trustedNodeAccount *accounts.Account) error { - // Get RPL bond amount - rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) - if err != nil { return err } - - // Get RocketDAONodeTrustedActions contract address - rocketDAONodeTrustedActionsAddress, err := rp.GetAddress("rocketDAONodeTrustedActions") - if err != nil { return err } - - // Mint RPL to node & allow trusted node DAO contract to spend it - if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { return err } - if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { return err } - - // Return - return nil + // Get RPL bond amount + rplBondAmount, err := trustednodesettings.GetRPLBond(rp, nil) + if err != nil { + return err + } + + // Get RocketDAONodeTrustedActions contract address + rocketDAONodeTrustedActionsAddress, err := rp.GetAddress("rocketDAONodeTrustedActions") + if err != nil { + return err + } + + // Mint RPL to node & allow trusted node DAO contract to spend it + if err := rplutils.MintRPL(rp, ownerAccount, trustedNodeAccount, rplBondAmount); err != nil { + return err + } + if _, err := tokens.ApproveRPL(rp, *rocketDAONodeTrustedActionsAddress, rplBondAmount, trustedNodeAccount.GetTransactor()); err != nil { + return err + } + + // Return + return nil } - diff --git a/tests/testutils/node/staking.go b/tests/testutils/node/staking.go index 39207ac4d..70ef91dae 100644 --- a/tests/testutils/node/staking.go +++ b/tests/testutils/node/staking.go @@ -1,31 +1,37 @@ package node import ( - "math/big" + "math/big" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - // Mint & stake an amount of RPL against a node func StakeRPL(rp *rocketpool.RocketPool, ownerAccount, nodeAccount *accounts.Account, amount *big.Int) error { - // Get RocketNodeStaking contract address - rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") - if err != nil { return err } - - // Mint, approve & stake RPL - if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, amount); err != nil { return err } - if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, amount, nodeAccount.GetTransactor()); err != nil { return err } - if _, err := node.StakeRPL(rp, amount, nodeAccount.GetTransactor()); err != nil { return err } - - // Return - return nil + // Get RocketNodeStaking contract address + rocketNodeStakingAddress, err := rp.GetAddress("rocketNodeStaking") + if err != nil { + return err + } + + // Mint, approve & stake RPL + if err := rplutils.MintRPL(rp, ownerAccount, nodeAccount, amount); err != nil { + return err + } + if _, err := tokens.ApproveRPL(rp, *rocketNodeStakingAddress, amount, nodeAccount.GetTransactor()); err != nil { + return err + } + if _, err := node.StakeRPL(rp, amount, nodeAccount.GetTransactor()); err != nil { + return err + } + + // Return + return nil } - diff --git a/tests/testutils/tokens/reth/reth.go b/tests/testutils/tokens/reth/reth.go index d08b115ec..2d73b5170 100644 --- a/tests/testutils/tokens/reth/reth.go +++ b/tests/testutils/tokens/reth/reth.go @@ -1,28 +1,28 @@ package tokens import ( - "math/big" + "math/big" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/deposit" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - // Mint an amount of rETH to an account func MintRETH(rp *rocketpool.RocketPool, toAccount *accounts.Account, amount *big.Int) error { - // Get ETH value of amount - ethValue, err := tokens.GetETHValueOfRETH(rp, amount, nil) - if err != nil { return err } + // Get ETH value of amount + ethValue, err := tokens.GetETHValueOfRETH(rp, amount, nil) + if err != nil { + return err + } - // Deposit from account to mint rETH - opts := toAccount.GetTransactor() - opts.Value = ethValue - _, err = deposit.Deposit(rp, opts) - return err + // Deposit from account to mint rETH + opts := toAccount.GetTransactor() + opts.Value = ethValue + _, err = deposit.Deposit(rp, opts) + return err } - diff --git a/tests/testutils/tokens/rpl/rpl.go b/tests/testutils/tokens/rpl/rpl.go index 0573e323e..6a8be2253 100644 --- a/tests/testutils/tokens/rpl/rpl.go +++ b/tests/testutils/tokens/rpl/rpl.go @@ -1,43 +1,48 @@ package rpl import ( - "fmt" - "math/big" + "fmt" + "math/big" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - // Mint an amount of RPL to an account func MintRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { - // Get RPL token contract address - rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") - if err != nil { return err } - - // Mint, approve & swap fixed-supply RPL - if err := MintFixedSupplyRPL(rp, ownerAccount, toAccount, amount); err != nil { return err } - if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, amount, toAccount.GetTransactor()); err != nil { return err } - if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, amount, toAccount.GetTransactor()); err != nil { return err } - - // Return - return nil + // Get RPL token contract address + rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") + if err != nil { + return err + } + + // Mint, approve & swap fixed-supply RPL + if err := MintFixedSupplyRPL(rp, ownerAccount, toAccount, amount); err != nil { + return err + } + if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, amount, toAccount.GetTransactor()); err != nil { + return err + } + if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, amount, toAccount.GetTransactor()); err != nil { + return err + } + + // Return + return nil } - // Mint an amount of fixed-supply RPL to an account func MintFixedSupplyRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Account, toAccount *accounts.Account, amount *big.Int) error { - rocketTokenFixedSupplyRPL, err := rp.GetContract("rocketTokenRPLFixedSupply") - if err != nil { - return err - } - if _, err := rocketTokenFixedSupplyRPL.Transact(ownerAccount.GetTransactor(), "mint", toAccount.Address, amount); err != nil { - return fmt.Errorf("Could not mint fixed-supply RPL tokens to %s: %w", toAccount.Address.Hex(), err) - } - return nil + rocketTokenFixedSupplyRPL, err := rp.GetContract("rocketTokenRPLFixedSupply") + if err != nil { + return err + } + if _, err := rocketTokenFixedSupplyRPL.Transact(ownerAccount.GetTransactor(), "mint", toAccount.Address, amount); err != nil { + return fmt.Errorf("Could not mint fixed-supply RPL tokens to %s: %w", toAccount.Address.Hex(), err) + } + return nil } - diff --git a/tests/testutils/validator/deposit-data.go b/tests/testutils/validator/deposit-data.go index 6c6de461e..ddd1faa0d 100644 --- a/tests/testutils/validator/deposit-data.go +++ b/tests/testutils/validator/deposit-data.go @@ -14,51 +14,46 @@ import ( // Deposit settings const depositAmount = 16000000000 // gwei - // Deposit data type depositData struct { - PublicKey []byte `ssz-size:"48"` - WithdrawalCredentials []byte `ssz-size:"32"` - Amount uint64 - Signature []byte `ssz-size:"96"` + PublicKey []byte `ssz-size:"48"` + WithdrawalCredentials []byte `ssz-size:"32"` + Amount uint64 + Signature []byte `ssz-size:"96"` } - // Get the validator pubkey func GetValidatorPubkey(pubkey int) (types.ValidatorPubkey, error) { - if pubkey == 1 { - return types.HexToValidatorPubkey(tests.ValidatorPubkey) - } else if pubkey == 2 { - return types.HexToValidatorPubkey(tests.ValidatorPubkey2) - } else if pubkey == 3 { - return types.HexToValidatorPubkey(tests.ValidatorPubkey3) - } else { - return types.ValidatorPubkey{}, fmt.Errorf("Invalid pubkey index %d", pubkey) - } + if pubkey == 1 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey) + } else if pubkey == 2 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey2) + } else if pubkey == 3 { + return types.HexToValidatorPubkey(tests.ValidatorPubkey3) + } else { + return types.ValidatorPubkey{}, fmt.Errorf("Invalid pubkey index %d", pubkey) + } } - // Get the validator deposit signature func GetValidatorSignature(pubkey int) (types.ValidatorSignature, error) { - if pubkey == 1 { - return types.HexToValidatorSignature(tests.ValidatorSignature) - } else if pubkey == 2 { - return types.HexToValidatorSignature(tests.ValidatorSignature2) - } else if pubkey == 3 { - return types.HexToValidatorSignature(tests.ValidatorSignature3) - } else { - return types.ValidatorSignature{}, fmt.Errorf("Invalid pubkey index %d", pubkey) - } + if pubkey == 1 { + return types.HexToValidatorSignature(tests.ValidatorSignature) + } else if pubkey == 2 { + return types.HexToValidatorSignature(tests.ValidatorSignature2) + } else if pubkey == 3 { + return types.HexToValidatorSignature(tests.ValidatorSignature3) + } else { + return types.ValidatorSignature{}, fmt.Errorf("Invalid pubkey index %d", pubkey) + } } - // Get the validator deposit depositDataRoot func GetDepositDataRoot(validatorPubkey types.ValidatorPubkey, withdrawalCredentials common.Hash, validatorSignature types.ValidatorSignature) (common.Hash, error) { - return ssz.HashTreeRoot(depositData{ - PublicKey: validatorPubkey.Bytes(), - WithdrawalCredentials: withdrawalCredentials[:], - Amount: depositAmount, - Signature: validatorSignature.Bytes(), - }) + return ssz.HashTreeRoot(depositData{ + PublicKey: validatorPubkey.Bytes(), + WithdrawalCredentials: withdrawalCredentials[:], + Amount: depositAmount, + Signature: validatorSignature.Bytes(), + }) } - diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 5bb80fafa..551a4375b 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -14,44 +14,55 @@ import ( "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) - var ( - client *uc.EthClientProxy - rp *rocketpool.RocketPool - - ownerAccount *accounts.Account - trustedNodeAccount *accounts.Account - userAccount1 *accounts.Account - userAccount2 *accounts.Account - swcAccount *accounts.Account -) + client *uc.EthClientProxy + rp *rocketpool.RocketPool + ownerAccount *accounts.Account + trustedNodeAccount *accounts.Account + userAccount1 *accounts.Account + userAccount2 *accounts.Account + swcAccount *accounts.Account +) func TestMain(m *testing.M) { - var err error - - // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - if err != nil { log.Fatal(err) } - - // Initialize contract manager - rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) - if err != nil { log.Fatal(err) } - - // Initialize accounts - ownerAccount, err = accounts.GetAccount(0) - if err != nil { log.Fatal(err) } - trustedNodeAccount, err = accounts.GetAccount(1) - if err != nil { log.Fatal(err) } - userAccount1, err = accounts.GetAccount(7) - if err != nil { log.Fatal(err) } - userAccount2, err = accounts.GetAccount(8) - if err != nil { log.Fatal(err) } - swcAccount, err = accounts.GetAccount(9) - if err != nil { log.Fatal(err) } - - // Run tests - os.Exit(m.Run()) + var err error -} + // Initialize eth client + client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } + // Initialize contract manager + rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) + if err != nil { + log.Fatal(err) + } + + // Initialize accounts + ownerAccount, err = accounts.GetAccount(0) + if err != nil { + log.Fatal(err) + } + trustedNodeAccount, err = accounts.GetAccount(1) + if err != nil { + log.Fatal(err) + } + userAccount1, err = accounts.GetAccount(7) + if err != nil { + log.Fatal(err) + } + userAccount2, err = accounts.GetAccount(8) + if err != nil { + log.Fatal(err) + } + swcAccount, err = accounts.GetAccount(9) + if err != nil { + log.Fatal(err) + } + + // Run tests + os.Exit(m.Run()) + +} diff --git a/tests/tokens/reth_test.go b/tests/tokens/reth_test.go index 3b8373f8c..915b86878 100644 --- a/tests/tokens/reth_test.go +++ b/tests/tokens/reth_test.go @@ -1,199 +1,240 @@ package tokens import ( - "testing" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" ) - // GetRETHContractETHBalance test under minipool.TestWithdrawValidatorBalance // GetRETHTotalCollateral test under minipool.TestWithdrawValidatorBalance // GetRETHCollateralRate test under minipool.TestWithdrawValidatorBalance - func TestRETHBalances(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - - // Get & check rETH total supply - if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { - t.Error(err) - } else if rethTotalSupply.Cmp(rethAmount) != 0 { - t.Errorf("Incorrect rETH total supply %s", rethTotalSupply.String()) - } - - // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if rethBalance.Cmp(rethAmount) != 0 { - t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { + t.Fatal(err) + } + + // Get & check rETH total supply + if rethTotalSupply, err := tokens.GetRETHTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if rethTotalSupply.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH total supply %s", rethTotalSupply.String()) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } } - func TestTransferRETH(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - - // Mine pre-requisite 5760 blocks before being able to transfer - if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } - - // Transfer rETH - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if rethBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { + t.Fatal(err) + } + + // Mine pre-requisite 5760 blocks before being able to transfer + if err := evm.MineBlocks(5760); err != nil { + t.Fatal(err) + } + + // Transfer rETH + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferRETH(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } } - func TestTransferFromRETH(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - - // Approve rETH spender - sendAmount := eth.EthToWei(50) - if _, err := tokens.ApproveRETH(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check spender allowance - if allowance, err := tokens.GetRETHAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { - t.Error(err) - } else if allowance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect rETH spender allowance %s", allowance.String()) - } - - // Mine pre-requisite 5760 blocks before being able to transfer - if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } - - // Transfer rETH from account - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := tokens.TransferFromRETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check rETH account balance - if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if rethBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { + t.Fatal(err) + } + + // Approve rETH spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveRETH(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetRETHAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH spender allowance %s", allowance.String()) + } + + // Mine pre-requisite 5760 blocks before being able to transfer + if err := evm.MineBlocks(5760); err != nil { + t.Fatal(err) + } + + // Transfer rETH from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromRETH(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check rETH account balance + if rethBalance, err := tokens.GetRETHBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rethBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect rETH account balance %s", rethBalance.String()) + } } - func TestRETHExchangeRate(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Register trusted node - if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { t.Fatal(err) } - - // Submit network balances - if _, err := network.SubmitBalances(rp, 1, eth.EthToWei(100), eth.EthToWei(100), eth.EthToWei(50), trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Get & check ETH value of rETH amount - rethAmount := eth.EthToWei(1) - if ethValue, err := tokens.GetETHValueOfRETH(rp, rethAmount, nil); err != nil { - t.Error(err) - } else if ethValue.Cmp(eth.EthToWei(2)) != 0 { - t.Errorf("Incorrect ETH value %s of rETH amount %s", ethValue.String(), rethAmount.String()) - } - - // Get & check rETH value of ETH amount - ethAmount := eth.EthToWei(2) - if rethValue, err := tokens.GetRETHValueOfETH(rp, ethAmount, nil); err != nil { - t.Error(err) - } else if rethValue.Cmp(eth.EthToWei(1)) != 0 { - t.Errorf("Incorrect rETH value %s of ETH amount %s", rethValue.String(), ethAmount.String()) - } - - // Get & check ETH : rETH exchange rate - if exchangeRate, err := tokens.GetRETHExchangeRate(rp, nil); err != nil { - t.Error(err) - } else if exchangeRate != 2 { - t.Errorf("Incorrect ETH : rETH exchange rate %f : 1", exchangeRate) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Register trusted node + if err := nodeutils.RegisterTrustedNode(rp, ownerAccount, trustedNodeAccount); err != nil { + t.Fatal(err) + } + + // Submit network balances + if _, err := network.SubmitBalances(rp, 1, eth.EthToWei(100), eth.EthToWei(100), eth.EthToWei(50), trustedNodeAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check ETH value of rETH amount + rethAmount := eth.EthToWei(1) + if ethValue, err := tokens.GetETHValueOfRETH(rp, rethAmount, nil); err != nil { + t.Error(err) + } else if ethValue.Cmp(eth.EthToWei(2)) != 0 { + t.Errorf("Incorrect ETH value %s of rETH amount %s", ethValue.String(), rethAmount.String()) + } + + // Get & check rETH value of ETH amount + ethAmount := eth.EthToWei(2) + if rethValue, err := tokens.GetRETHValueOfETH(rp, ethAmount, nil); err != nil { + t.Error(err) + } else if rethValue.Cmp(eth.EthToWei(1)) != 0 { + t.Errorf("Incorrect rETH value %s of ETH amount %s", rethValue.String(), ethAmount.String()) + } + + // Get & check ETH : rETH exchange rate + if exchangeRate, err := tokens.GetRETHExchangeRate(rp, nil); err != nil { + t.Error(err) + } else if exchangeRate != 2 { + t.Errorf("Incorrect ETH : rETH exchange rate %f : 1", exchangeRate) + } } - func TestBurnRETH(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(100) - if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - - // Get initial balances - balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { - t.Fatal(err) - } - - // Mine pre-requisite 5760 blocks before being able to burn - if err := evm.MineBlocks(5760); err != nil { t.Fatal(err) } - - // Burn rETH - burnAmount := eth.EthToWei(50) - if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated balances - balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) - if err != nil { - t.Fatal(err) - } else { - if balances2.RETH.Cmp(balances1.RETH) != -1 { - t.Error("rETH balance did not decrease after burning rETH") - } - if balances2.ETH.Cmp(balances1.ETH) != 1 { - t.Error("ETH balance did not increase after burning rETH") - } - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint rETH + rethAmount := eth.EthToWei(100) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { + t.Fatal(err) + } + + // Get initial balances + balances1, err := tokens.GetBalances(rp, userAccount1.Address, nil) + if err != nil { + t.Fatal(err) + } + + // Mine pre-requisite 5760 blocks before being able to burn + if err := evm.MineBlocks(5760); err != nil { + t.Fatal(err) + } + + // Burn rETH + burnAmount := eth.EthToWei(50) + if _, err := tokens.BurnRETH(rp, burnAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated balances + balances2, err := tokens.GetBalances(rp, userAccount1.Address, nil) + if err != nil { + t.Fatal(err) + } else { + if balances2.RETH.Cmp(balances1.RETH) != -1 { + t.Error("rETH balance did not decrease after burning rETH") + } + if balances2.ETH.Cmp(balances1.ETH) != 1 { + t.Error("ETH balance did not increase after burning rETH") + } + } } - diff --git a/tests/tokens/rpl_fixed_test.go b/tests/tokens/rpl_fixed_test.go index bc00ff93a..3a7f1bbdc 100644 --- a/tests/tokens/rpl_fixed_test.go +++ b/tests/tokens/rpl_fixed_test.go @@ -1,107 +1,127 @@ package tokens import ( - "testing" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - func TestFixedSupplyRPLBalances(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint fixed-supply RPL - fixedRplAmount := eth.EthToWei(100) - if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } - - // Get & check fixed-supply RPL total supply - if fixedRplTotalSupply, err := tokens.GetFixedSupplyRPLTotalSupply(rp, nil); err != nil { - t.Error(err) - } else if fixedRplTotalSupply.Cmp(fixedRplAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL total supply %s", fixedRplTotalSupply.String()) - } - - // Get & check fixed-supply RPL account balance - if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if fixedRplBalance.Cmp(fixedRplAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { + t.Fatal(err) + } + + // Get & check fixed-supply RPL total supply + if fixedRplTotalSupply, err := tokens.GetFixedSupplyRPLTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if fixedRplTotalSupply.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL total supply %s", fixedRplTotalSupply.String()) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } } - func TestTransferFixedSupplyRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint fixed-supply RPL - fixedRplAmount := eth.EthToWei(100) - if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } - - // Transfer fixed-supply RPL - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferFixedSupplyRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check fixed-supply RPL account balance - if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if fixedRplBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { + t.Fatal(err) + } + + // Transfer fixed-supply RPL + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferFixedSupplyRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } } - func TestTransferFromFixedSupplyRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint fixed-supply RPL - fixedRplAmount := eth.EthToWei(100) - if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } - - // Approve fixed-supply RPL spender - sendAmount := eth.EthToWei(50) - if _, err := tokens.ApproveFixedSupplyRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check spender allowance - if allowance, err := tokens.GetFixedSupplyRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { - t.Error(err) - } else if allowance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL spender allowance %s", allowance.String()) - } - - // Transfer fixed-supply RPL from account - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := tokens.TransferFromFixedSupplyRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check fixed-supply RPL account balance - if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if fixedRplBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { + t.Fatal(err) + } + + // Approve fixed-supply RPL spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveFixedSupplyRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetFixedSupplyRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL spender allowance %s", allowance.String()) + } + + // Transfer fixed-supply RPL from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromFixedSupplyRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check fixed-supply RPL account balance + if fixedRplBalance, err := tokens.GetFixedSupplyRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if fixedRplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL account balance %s", fixedRplBalance.String()) + } } - diff --git a/tests/tokens/rpl_test.go b/tests/tokens/rpl_test.go index c9c26634b..4c785a85a 100644 --- a/tests/tokens/rpl_test.go +++ b/tests/tokens/rpl_test.go @@ -1,174 +1,218 @@ package tokens import ( - "testing" - "time" + "testing" + "time" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - func TestRPLBalances(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint RPL - rplAmount := eth.EthToWei(100) - if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } - - // Get & check RPL account balance - if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) - } - - // Get & check RPL total supply - initialTotalSupply := eth.EthToWei(18000000) - if rplTotalSupply, err := tokens.GetRPLTotalSupply(rp, nil); err != nil { - t.Error(err) - } else if rplTotalSupply.Cmp(initialTotalSupply) != 0 { - t.Errorf("Incorrect RPL total supply %s", rplTotalSupply.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } + + // Get & check RPL total supply + initialTotalSupply := eth.EthToWei(18000000) + if rplTotalSupply, err := tokens.GetRPLTotalSupply(rp, nil); err != nil { + t.Error(err) + } else if rplTotalSupply.Cmp(initialTotalSupply) != 0 { + t.Errorf("Incorrect RPL total supply %s", rplTotalSupply.String()) + } } - func TestTransferRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint RPL - rplAmount := eth.EthToWei(100) - if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } - - // Transfer RPL - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - if _, err := tokens.TransferRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check RPL account balance - if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { + t.Fatal(err) + } + + // Transfer RPL + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + if _, err := tokens.TransferRPL(rp, toAddress, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } } - func TestTransferFromRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint RPL - rplAmount := eth.EthToWei(100) - if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } - - // Approve RPL spender - sendAmount := eth.EthToWei(50) - if _, err := tokens.ApproveRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check spender allowance - if allowance, err := tokens.GetRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { - t.Error(err) - } else if allowance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect RPL spender allowance %s", allowance.String()) - } - - // Transfer RPL from account - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - if _, err := tokens.TransferFromRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check RPL account balance - if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { + t.Fatal(err) + } + + // Approve RPL spender + sendAmount := eth.EthToWei(50) + if _, err := tokens.ApproveRPL(rp, userAccount2.Address, sendAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check spender allowance + if allowance, err := tokens.GetRPLAllowance(rp, userAccount1.Address, userAccount2.Address, nil); err != nil { + t.Error(err) + } else if allowance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL spender allowance %s", allowance.String()) + } + + // Transfer RPL from account + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + if _, err := tokens.TransferFromRPL(rp, userAccount1.Address, toAddress, sendAmount, userAccount2.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, toAddress, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } } - func TestMintInflationRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Constants - oneDay := 24 * 60 * 60 - - // Start RPL inflation - if _, err := protocol.BootstrapInflationStartTime(rp, uint64(time.Now().Unix() + 3600), ownerAccount.GetTransactor()); err != nil { t.Fatal(err) } - - // Increase time until rewards are available - if err := evm.IncreaseTime(3600 + oneDay); err != nil { t.Fatal(err) } - - // Get initial total supply - rplTotalSupply1, err := tokens.GetRPLTotalSupply(rp, nil) - if err != nil { t.Fatal(err) } - - // Mint RPL from inflation - if _, err := tokens.MintInflationRPL(rp, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check updated total supply - rplTotalSupply2, err := tokens.GetRPLTotalSupply(rp, nil) - if err != nil { t.Fatal(err) } - if rplTotalSupply2.Cmp(rplTotalSupply1) != 1 { - t.Errorf("Incorrect updated RPL total supply %s", rplTotalSupply2.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Constants + oneDay := 24 * 60 * 60 + + // Start RPL inflation + if _, err := protocol.BootstrapInflationStartTime(rp, uint64(time.Now().Unix()+3600), ownerAccount.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Increase time until rewards are available + if err := evm.IncreaseTime(3600 + oneDay); err != nil { + t.Fatal(err) + } + + // Get initial total supply + rplTotalSupply1, err := tokens.GetRPLTotalSupply(rp, nil) + if err != nil { + t.Fatal(err) + } + + // Mint RPL from inflation + if _, err := tokens.MintInflationRPL(rp, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check updated total supply + rplTotalSupply2, err := tokens.GetRPLTotalSupply(rp, nil) + if err != nil { + t.Fatal(err) + } + if rplTotalSupply2.Cmp(rplTotalSupply1) != 1 { + t.Errorf("Incorrect updated RPL total supply %s", rplTotalSupply2.String()) + } } - func TestSwapFixedSupplyRPLForRPL(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint fixed-supply RPL - rplAmount := eth.EthToWei(100) - if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } - - // Approve fixed-supply RPL spend - rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") - if err != nil { t.Fatal(err) } - if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, rplAmount, userAccount1.GetTransactor()); err != nil { t.Fatal(err) } - - // Swap fixed-supply RP for RPL - if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, rplAmount, userAccount1.GetTransactor()); err != nil { - t.Fatal(err) - } - - // Get & check RPL account balance - if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else if rplBalance.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint fixed-supply RPL + rplAmount := eth.EthToWei(100) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { + t.Fatal(err) + } + + // Approve fixed-supply RPL spend + rocketTokenRPLAddress, err := rp.GetAddress("rocketTokenRPL") + if err != nil { + t.Fatal(err) + } + if _, err := tokens.ApproveFixedSupplyRPL(rp, *rocketTokenRPLAddress, rplAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Swap fixed-supply RP for RPL + if _, err := tokens.SwapFixedSupplyRPLForRPL(rp, rplAmount, userAccount1.GetTransactor()); err != nil { + t.Fatal(err) + } + + // Get & check RPL account balance + if rplBalance, err := tokens.GetRPLBalance(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else if rplBalance.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL account balance %s", rplBalance.String()) + } } - diff --git a/tests/tokens/tokens_test.go b/tests/tokens/tokens_test.go index e96d5b606..2d6d3c1f6 100644 --- a/tests/tokens/tokens_test.go +++ b/tests/tokens/tokens_test.go @@ -1,53 +1,63 @@ package tokens import ( - "math/big" - "testing" + "math/big" + "testing" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" + rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" ) - func TestTokenBalances(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Mint rETH - rethAmount := eth.EthToWei(102) - if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { t.Fatal(err) } - - // Mint RPL - rplAmount := eth.EthToWei(103) - if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { t.Fatal(err) } - - // Mint fixed-supply RPL - fixedRplAmount := eth.EthToWei(104) - if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { t.Fatal(err) } - - // Get & check token balances - if balances, err := tokens.GetBalances(rp, userAccount1.Address, nil); err != nil { - t.Error(err) - } else { - if balances.ETH.Cmp(big.NewInt(0)) != 1 { - t.Errorf("Incorrect ETH balance %s", balances.ETH.String()) - } - if balances.RETH.Cmp(rethAmount) != 0 { - t.Errorf("Incorrect rETH balance %s", balances.RETH.String()) - } - if balances.RPL.Cmp(rplAmount) != 0 { - t.Errorf("Incorrect RPL balance %s", balances.RPL.String()) - } - if balances.FixedSupplyRPL.Cmp(fixedRplAmount) != 0 { - t.Errorf("Incorrect fixed-supply RPL balance %s", balances.FixedSupplyRPL.String()) - } - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Mint rETH + rethAmount := eth.EthToWei(102) + if err := rethutils.MintRETH(rp, userAccount1, rethAmount); err != nil { + t.Fatal(err) + } + + // Mint RPL + rplAmount := eth.EthToWei(103) + if err := rplutils.MintRPL(rp, ownerAccount, userAccount1, rplAmount); err != nil { + t.Fatal(err) + } + + // Mint fixed-supply RPL + fixedRplAmount := eth.EthToWei(104) + if err := rplutils.MintFixedSupplyRPL(rp, ownerAccount, userAccount1, fixedRplAmount); err != nil { + t.Fatal(err) + } + + // Get & check token balances + if balances, err := tokens.GetBalances(rp, userAccount1.Address, nil); err != nil { + t.Error(err) + } else { + if balances.ETH.Cmp(big.NewInt(0)) != 1 { + t.Errorf("Incorrect ETH balance %s", balances.ETH.String()) + } + if balances.RETH.Cmp(rethAmount) != 0 { + t.Errorf("Incorrect rETH balance %s", balances.RETH.String()) + } + if balances.RPL.Cmp(rplAmount) != 0 { + t.Errorf("Incorrect RPL balance %s", balances.RPL.String()) + } + if balances.FixedSupplyRPL.Cmp(fixedRplAmount) != 0 { + t.Errorf("Incorrect fixed-supply RPL balance %s", balances.FixedSupplyRPL.String()) + } + } } - diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index e4e01d7d6..23e6c4f46 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -16,41 +16,47 @@ import ( "github.com/rocket-pool/rocketpool-go/utils" ) - func TestSendTransaction(t *testing.T) { - // State snapshotting - if err := evm.TakeSnapshot(); err != nil { t.Fatal(err) } - t.Cleanup(func() { if err := evm.RevertSnapshot(); err != nil { t.Fatal(err) } }) - - // Initialize eth client - client := uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) - - // Initialize accounts - userAccount, err := accounts.GetAccount(9) - if err != nil { t.Fatal(err) } - - // Transaction parameters - toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") - sendAmount := eth.EthToWei(50) - - // Send transaction - opts := userAccount.GetTransactor() - opts.Value = sendAmount - hash, err := eth.SendTransaction(client, toAddress, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 - if err != nil { - t.Fatal(err) - } - if _, err := utils.WaitForTransaction(client, hash); err != nil { - t.Fatal(err) - } - - // Get & check to address balance - if balance, err := client.BalanceAt(context.Background(), toAddress, nil); err != nil { - t.Error(err) - } else if balance.Cmp(sendAmount) != 0 { - t.Errorf("Incorrect to address balance %s", balance.String()) - } + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + // Initialize eth client + client := uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + + // Initialize accounts + userAccount, err := accounts.GetAccount(9) + if err != nil { + t.Fatal(err) + } + + // Transaction parameters + toAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + sendAmount := eth.EthToWei(50) + + // Send transaction + opts := userAccount.GetTransactor() + opts.Value = sendAmount + hash, err := eth.SendTransaction(client, toAddress, big.NewInt(1337), opts) // Ganache's default chain ID is 1337 + if err != nil { + t.Fatal(err) + } + if _, err := utils.WaitForTransaction(client, hash); err != nil { + t.Fatal(err) + } + + // Get & check to address balance + if balance, err := client.BalanceAt(context.Background(), toAddress, nil); err != nil { + t.Error(err) + } else if balance.Cmp(sendAmount) != 0 { + t.Errorf("Incorrect to address balance %s", balance.String()) + } } - diff --git a/tests/utils/eth/units_test.go b/tests/utils/eth/units_test.go index cb3fae72f..afea60810 100644 --- a/tests/utils/eth/units_test.go +++ b/tests/utils/eth/units_test.go @@ -1,40 +1,38 @@ package eth import ( - "math/big" - "testing" + "math/big" + "testing" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) - func TestConversion(t *testing.T) { - // Equivalent unit amounts - weiAmount := new(big.Int) - weiAmount.SetString("999999999999999000000", 0) - var gweiAmount float64 = 999999999999.999000000 - var ethAmount float64 = 999.999999999999000000 + // Equivalent unit amounts + weiAmount := new(big.Int) + weiAmount.SetString("999999999999999000000", 0) + var gweiAmount float64 = 999999999999.999000000 + var ethAmount float64 = 999.999999999999000000 - // Convert wei to eth - if toEthAmount := eth.WeiToEth(weiAmount); toEthAmount != ethAmount { - t.Errorf("Incorrect eth amount %f", toEthAmount) - } + // Convert wei to eth + if toEthAmount := eth.WeiToEth(weiAmount); toEthAmount != ethAmount { + t.Errorf("Incorrect eth amount %f", toEthAmount) + } - // Convert eth to wei - if toWeiAmount := eth.EthToWei(ethAmount); toWeiAmount.Cmp(weiAmount) != 0 { - t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) - } + // Convert eth to wei + if toWeiAmount := eth.EthToWei(ethAmount); toWeiAmount.Cmp(weiAmount) != 0 { + t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) + } - // Convert wei to gigawei - if toGweiAmount := eth.WeiToGwei(weiAmount); toGweiAmount != gweiAmount { - t.Errorf("Incorrect gwei amount %f", toGweiAmount) - } + // Convert wei to gigawei + if toGweiAmount := eth.WeiToGwei(weiAmount); toGweiAmount != gweiAmount { + t.Errorf("Incorrect gwei amount %f", toGweiAmount) + } - // Convert eth to gwei - if toWeiAmount := eth.GweiToWei(gweiAmount); toWeiAmount.Cmp(weiAmount) != 0 { - t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) - } + // Convert eth to gwei + if toWeiAmount := eth.GweiToWei(gweiAmount); toWeiAmount.Cmp(weiAmount) != 0 { + t.Errorf("Incorrect wei amount %s", toWeiAmount.String()) + } } - diff --git a/tests/utils/stage4_bootstrap.go b/tests/utils/stage4_bootstrap.go index 8cc801bb5..3fc7d7ecf 100644 --- a/tests/utils/stage4_bootstrap.go +++ b/tests/utils/stage4_bootstrap.go @@ -12,20 +12,19 @@ import ( // Bootstrap all of the parameters to mimic Stage 4 so the unit tests work correctly func Stage4Bootstrap(rp *rocketpool.RocketPool, ownerAccount *accounts.Account) { - opts := ownerAccount.GetTransactor() + opts := ownerAccount.GetTransactor() - protocol.BootstrapDepositEnabled(rp, true, opts) - protocol.BootstrapAssignDepositsEnabled(rp, true, opts) - protocol.BootstrapMaximumDepositPoolSize(rp, eth.EthToWei(1000), opts) - protocol.BootstrapNodeRegistrationEnabled(rp, true, opts) - protocol.BootstrapNodeDepositEnabled(rp, true, opts) - protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, true, opts) - protocol.BootstrapMinimumNodeFee(rp, 0.05, opts) - protocol.BootstrapTargetNodeFee(rp, 0.1, opts) - protocol.BootstrapMaximumNodeFee(rp, 0.2, opts) - protocol.BootstrapNodeFeeDemandRange(rp, eth.EthToWei(1000), opts) - protocol.BootstrapInflationStartTime(rp, - uint64(time.Now().Unix() + (60 * 60 * 24 * 14)), opts) + protocol.BootstrapDepositEnabled(rp, true, opts) + protocol.BootstrapAssignDepositsEnabled(rp, true, opts) + protocol.BootstrapMaximumDepositPoolSize(rp, eth.EthToWei(1000), opts) + protocol.BootstrapNodeRegistrationEnabled(rp, true, opts) + protocol.BootstrapNodeDepositEnabled(rp, true, opts) + protocol.BootstrapMinipoolSubmitWithdrawableEnabled(rp, true, opts) + protocol.BootstrapMinimumNodeFee(rp, 0.05, opts) + protocol.BootstrapTargetNodeFee(rp, 0.1, opts) + protocol.BootstrapMaximumNodeFee(rp, 0.2, opts) + protocol.BootstrapNodeFeeDemandRange(rp, eth.EthToWei(1000), opts) + protocol.BootstrapInflationStartTime(rp, + uint64(time.Now().Unix()+(60*60*24*14)), opts) } - diff --git a/tokens/reth.go b/tokens/reth.go index 2a9125e10..72b9b561a 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -18,213 +18,194 @@ import ( // Get rETH total supply func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return totalSupply(rocketTokenRETH, "rETH", opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketTokenRETH, "rETH", opts) } - // Get rETH balance func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return balanceOf(rocketTokenRETH, "rETH", address, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketTokenRETH, "rETH", address, opts) } - // Get rETH allowance func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return allowance(rocketTokenRETH, "rETH", owner, spender, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenRETH, "rETH", owner, spender, opts) } - // Estimate the gas of TransferRETH func EstimateTransferRETHGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferGas(rocketTokenRETH, "rETH", to, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenRETH, "rETH", to, amount, opts) } - // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return common.Hash{}, err - } - return transfer(rocketTokenRETH, "rETH", to, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return common.Hash{}, err + } + return transfer(rocketTokenRETH, "rETH", to, amount, opts) } - // Estimate the gas of ApproveRETH func EstimateApproveRETHGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateApproveGas(rocketTokenRETH, "rETH", spender, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenRETH, "rETH", spender, amount, opts) } - // Approve a rETH spender func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return common.Hash{}, err - } - return approve(rocketTokenRETH, "rETH", spender, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return common.Hash{}, err + } + return approve(rocketTokenRETH, "rETH", spender, amount, opts) } - // Estimate the gas of TransferFromRETH func EstimateTransferFromRETHGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferFromGas(rocketTokenRETH, "rETH", from, to, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenRETH, "rETH", from, to, amount, opts) } - // Transfer rETH from a sender func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return common.Hash{}, err - } - return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return common.Hash{}, err + } + return transferFrom(rocketTokenRETH, "rETH", from, to, amount, opts) } - // // rETH functions // - // Get the rETH contract ETH balance func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - return contractETHBalance(rp, rocketTokenRETH, opts) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + return contractETHBalance(rp, rocketTokenRETH, opts) } - // Get the ETH value of an amount of rETH func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - ethValue := new(*big.Int) - if err := rocketTokenRETH.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { - return nil, fmt.Errorf("Could not get ETH value of rETH amount: %w", err) - } - return *ethValue, nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + ethValue := new(*big.Int) + if err := rocketTokenRETH.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { + return nil, fmt.Errorf("Could not get ETH value of rETH amount: %w", err) + } + return *ethValue, nil } - // Get the rETH value of an amount of ETH func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - rethValue := new(*big.Int) - if err := rocketTokenRETH.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { - return nil, fmt.Errorf("Could not get rETH value of ETH amount: %w", err) - } - return *rethValue, nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + rethValue := new(*big.Int) + if err := rocketTokenRETH.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { + return nil, fmt.Errorf("Could not get rETH value of ETH amount: %w", err) + } + return *rethValue, nil } - // Get the current ETH : rETH exchange rate func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return 0, err - } - exchangeRate := new(*big.Int) - if err := rocketTokenRETH.Call(opts, exchangeRate, "getExchangeRate"); err != nil { - return 0, fmt.Errorf("Could not get rETH exchange rate: %w", err) - } - return eth.WeiToEth(*exchangeRate), nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return 0, err + } + exchangeRate := new(*big.Int) + if err := rocketTokenRETH.Call(opts, exchangeRate, "getExchangeRate"); err != nil { + return 0, fmt.Errorf("Could not get rETH exchange rate: %w", err) + } + return eth.WeiToEth(*exchangeRate), nil } - // Get the total amount of ETH collateral available for rETH trades func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return nil, err - } - totalCollateral := new(*big.Int) - if err := rocketTokenRETH.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { - return nil, fmt.Errorf("Could not get rETH total collateral: %w", err) - } - return *totalCollateral, nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return nil, err + } + totalCollateral := new(*big.Int) + if err := rocketTokenRETH.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { + return nil, fmt.Errorf("Could not get rETH total collateral: %w", err) + } + return *totalCollateral, nil } - // Get the rETH collateralization rate func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return 0, err - } - collateralRate := new(*big.Int) - if err := rocketTokenRETH.Call(opts, collateralRate, "getCollateralRate"); err != nil { - return 0, fmt.Errorf("Could not get rETH collateral rate: %w", err) - } - return eth.WeiToEth(*collateralRate), nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return 0, err + } + collateralRate := new(*big.Int) + if err := rocketTokenRETH.Call(opts, collateralRate, "getCollateralRate"); err != nil { + return 0, fmt.Errorf("Could not get rETH collateral rate: %w", err) + } + return eth.WeiToEth(*collateralRate), nil } - // Estimate the gas of BurnRETH func EstimateBurnRETHGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketTokenRETH.GetTransactionGasInfo(opts, "burn", amount) + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRETH.GetTransactionGasInfo(opts, "burn", amount) } - // Burn rETH for ETH func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketTokenRETH.Transact(opts, "burn", amount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not burn rETH: %w", err) - } - return hash, nil + rocketTokenRETH, err := getRocketTokenRETH(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketTokenRETH.Transact(opts, "burn", amount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not burn rETH: %w", err) + } + return hash, nil } - // // Contracts // - // Get contracts var rocketTokenRETHLock sync.Mutex + func getRocketTokenRETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketTokenRETHLock.Lock() - defer rocketTokenRETHLock.Unlock() - return rp.GetContract("rocketTokenRETH") + rocketTokenRETHLock.Lock() + defer rocketTokenRETHLock.Unlock() + return rp.GetContract("rocketTokenRETH") } - diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go index 203910dd7..00562d24c 100644 --- a/tokens/rpl-fixed.go +++ b/tokens/rpl-fixed.go @@ -16,104 +16,94 @@ import ( // Get fixed-supply RPL total supply func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return nil, err - } - return totalSupply(rocketTokenFixedSupplyRPL, "fixed-supply RPL", opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketTokenFixedSupplyRPL, "fixed-supply RPL", opts) } - // Get fixed-supply RPL balance func GetFixedSupplyRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return nil, err - } - return balanceOf(rocketTokenFixedSupplyRPL, "fixed-supply RPL", address, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketTokenFixedSupplyRPL, "fixed-supply RPL", address, opts) } - // Get fixed-supply RPL allowance func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return nil, err - } - return allowance(rocketTokenFixedSupplyRPL, "fixed-supply RPL", owner, spender, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenFixedSupplyRPL, "fixed-supply RPL", owner, spender, opts) } - // Estimate the gas of TransferFixedSupplyRPL func EstimateTransferFixedSupplyRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) } - // Transfer fixed-supply RPL func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return common.Hash{}, err - } - return transfer(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return common.Hash{}, err + } + return transfer(rocketTokenFixedSupplyRPL, "fixed-supply RPL", to, amount, opts) } - // Estimate the gas of ApproveFixedSupplyRPL func EstimateApproveFixedSupplyRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateApproveGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) } - // Approve an fixed-supply RPL spender func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return common.Hash{}, err - } - return approve(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return common.Hash{}, err + } + return approve(rocketTokenFixedSupplyRPL, "fixed-supply RPL", spender, amount, opts) } - // Estimate the gas of TransferFromFixedSupplyRPL func EstimateTransferFromFixedSupplyRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferFromGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) } - // Transfer fixed-supply RPL from a sender func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) - if err != nil { - return common.Hash{}, err - } - return transferFrom(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + if err != nil { + return common.Hash{}, err + } + return transferFrom(rocketTokenFixedSupplyRPL, "fixed-supply RPL", from, to, amount, opts) } - // // Contracts // - // Get contracts var rocketTokenFixedSupplyRPLLock sync.Mutex + func getRocketTokenRPLFixedSupply(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketTokenFixedSupplyRPLLock.Lock() - defer rocketTokenFixedSupplyRPLLock.Unlock() - return rp.GetContract("rocketTokenRPLFixedSupply") + rocketTokenFixedSupplyRPLLock.Lock() + defer rocketTokenFixedSupplyRPLLock.Unlock() + return rp.GetContract("rocketTokenRPLFixedSupply") } - diff --git a/tokens/rpl.go b/tokens/rpl.go index de22e88f3..0f4fc703b 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -17,171 +17,155 @@ import ( // Get RPL total supply func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return nil, err - } - return totalSupply(rocketTokenRPL, "RPL", opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return totalSupply(rocketTokenRPL, "RPL", opts) } - // Get RPL balance func GetRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return nil, err - } - return balanceOf(rocketTokenRPL, "RPL", address, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return balanceOf(rocketTokenRPL, "RPL", address, opts) } - // Get RPL allowance func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return nil, err - } - return allowance(rocketTokenRPL, "RPL", owner, spender, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + return allowance(rocketTokenRPL, "RPL", owner, spender, opts) } - // Estimate the gas of TransferRPL func EstimateTransferRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferGas(rocketTokenRPL, "RPL", to, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferGas(rocketTokenRPL, "RPL", to, amount, opts) } - // Transfer RPL func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return common.Hash{}, err - } - return transfer(rocketTokenRPL, "RPL", to, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return common.Hash{}, err + } + return transfer(rocketTokenRPL, "RPL", to, amount, opts) } - // Estimate the gas of ApproveRPL func EstimateApproveRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateApproveGas(rocketTokenRPL, "RPL", spender, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateApproveGas(rocketTokenRPL, "RPL", spender, amount, opts) } - // Approve an RPL spender func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return common.Hash{}, err - } - return approve(rocketTokenRPL, "RPL", spender, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return common.Hash{}, err + } + return approve(rocketTokenRPL, "RPL", spender, amount, opts) } - // Estimate the gas of TransferFromRPL func EstimateTransferFromRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return estimateTransferFromGas(rocketTokenRPL, "RPL", from, to, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return estimateTransferFromGas(rocketTokenRPL, "RPL", from, to, amount, opts) } - // Transfer RPL from a sender func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return common.Hash{}, err - } - return transferFrom(rocketTokenRPL, "RPL", from, to, amount, opts) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return common.Hash{}, err + } + return transferFrom(rocketTokenRPL, "RPL", from, to, amount, opts) } - // // RPL functions // - // Estimate the gas of MintInflationRPL func EstimateMintInflationRPLGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketTokenRPL.GetTransactionGasInfo(opts, "inflationMintTokens") + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRPL.GetTransactionGasInfo(opts, "inflationMintTokens") } - // Mint new RPL tokens from inflation func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) - } - return hash, nil + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) + } + return hash, nil } - // Estimate the gas of SwapFixedSupplyRPLForRPL func EstimateSwapFixedSupplyRPLForRPLGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketTokenRPL.GetTransactionGasInfo(opts, "swapTokens", amount) + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketTokenRPL.GetTransactionGasInfo(opts, "swapTokens", amount) } - // Swap fixed-supply RPL for new RPL tokens func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return common.Hash{}, err - } - hash, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) - } - return hash, nil + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) + } + return hash, nil } - // Get the RPL inflation interval rate func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) - if err != nil { - return nil, err - } - rate := new(*big.Int) - if err := rocketTokenRPL.Call(opts, rate, "getInflationIntervalRate"); err != nil { - return nil, fmt.Errorf("Could not get RPL inflation interval rate: %w", err) - } - return *rate, nil + rocketTokenRPL, err := getRocketTokenRPL(rp) + if err != nil { + return nil, err + } + rate := new(*big.Int) + if err := rocketTokenRPL.Call(opts, rate, "getInflationIntervalRate"); err != nil { + return nil, fmt.Errorf("Could not get RPL inflation interval rate: %w", err) + } + return *rate, nil } - // // Contracts // - // Get contracts var rocketTokenRPLLock sync.Mutex + func getRocketTokenRPL(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketTokenRPLLock.Lock() - defer rocketTokenRPLLock.Unlock() - return rp.GetContract("rocketTokenRPL") + rocketTokenRPLLock.Lock() + defer rocketTokenRPLLock.Unlock() + return rp.GetContract("rocketTokenRPL") } - diff --git a/tokens/tokens.go b/tokens/tokens.go index 82ffc56fe..9706fdc95 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -14,147 +14,139 @@ import ( // Token balances type Balances struct { - ETH *big.Int `json:"eth"` - RETH *big.Int `json:"reth"` - RPL *big.Int `json:"rpl"` - FixedSupplyRPL *big.Int `json:"fixedSupplyRpl"` + ETH *big.Int `json:"eth"` + RETH *big.Int `json:"reth"` + RPL *big.Int `json:"rpl"` + FixedSupplyRPL *big.Int `json:"fixedSupplyRpl"` } - // Get token balances of an address func GetBalances(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Balances, error) { - // Get call options block number - var blockNumber *big.Int - if opts != nil { blockNumber = opts.BlockNumber } - - // Data - var wg errgroup.Group - var ethBalance *big.Int - var rethBalance *big.Int - var rplBalance *big.Int - var fixedSupplyRplBalance *big.Int - - // Load data - wg.Go(func() error { - var err error - ethBalance, err = rp.Client.BalanceAt(context.Background(), address, blockNumber) - return err - }) - wg.Go(func() error { - var err error - rethBalance, err = GetRETHBalance(rp, address, opts) - return err - }) - wg.Go(func() error { - var err error - rplBalance, err = GetRPLBalance(rp, address, opts) - return err - }) - wg.Go(func() error { - var err error - fixedSupplyRplBalance, err = GetFixedSupplyRPLBalance(rp, address, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return Balances{}, err - } - - // Return - return Balances{ - ETH: ethBalance, - RETH: rethBalance, - RPL: rplBalance, - FixedSupplyRPL: fixedSupplyRplBalance, - }, nil + // Get call options block number + var blockNumber *big.Int + if opts != nil { + blockNumber = opts.BlockNumber + } + + // Data + var wg errgroup.Group + var ethBalance *big.Int + var rethBalance *big.Int + var rplBalance *big.Int + var fixedSupplyRplBalance *big.Int + + // Load data + wg.Go(func() error { + var err error + ethBalance, err = rp.Client.BalanceAt(context.Background(), address, blockNumber) + return err + }) + wg.Go(func() error { + var err error + rethBalance, err = GetRETHBalance(rp, address, opts) + return err + }) + wg.Go(func() error { + var err error + rplBalance, err = GetRPLBalance(rp, address, opts) + return err + }) + wg.Go(func() error { + var err error + fixedSupplyRplBalance, err = GetFixedSupplyRPLBalance(rp, address, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return Balances{}, err + } + + // Return + return Balances{ + ETH: ethBalance, + RETH: rethBalance, + RPL: rplBalance, + FixedSupplyRPL: fixedSupplyRplBalance, + }, nil } - // Get a token contract's ETH balance func contractETHBalance(rp *rocketpool.RocketPool, tokenContract *rocketpool.Contract, opts *bind.CallOpts) (*big.Int, error) { - var blockNumber *big.Int - if opts != nil { blockNumber = opts.BlockNumber } - return rp.Client.BalanceAt(context.Background(), *(tokenContract.Address), blockNumber) + var blockNumber *big.Int + if opts != nil { + blockNumber = opts.BlockNumber + } + return rp.Client.BalanceAt(context.Background(), *(tokenContract.Address), blockNumber) } - // Get a token's total supply func totalSupply(tokenContract *rocketpool.Contract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { - totalSupply := new(*big.Int) - if err := tokenContract.Call(opts, totalSupply, "totalSupply"); err != nil { - return nil, fmt.Errorf("Could not get %s total supply: %w", tokenName, err) - } - return *totalSupply, nil + totalSupply := new(*big.Int) + if err := tokenContract.Call(opts, totalSupply, "totalSupply"); err != nil { + return nil, fmt.Errorf("Could not get %s total supply: %w", tokenName, err) + } + return *totalSupply, nil } - // Get a token balance func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - balance := new(*big.Int) - if err := tokenContract.Call(opts, balance, "balanceOf", address); err != nil { - return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) - } - return *balance, nil + balance := new(*big.Int) + if err := tokenContract.Call(opts, balance, "balanceOf", address); err != nil { + return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) + } + return *balance, nil } - // Get a spender's allowance for an address func allowance(tokenContract *rocketpool.Contract, tokenName string, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - allowance := new(*big.Int) - if err := tokenContract.Call(opts, allowance, "allowance", owner, spender); err != nil { - return nil, fmt.Errorf("Could not get %s allowance of %s for %s: %w", tokenName, spender.Hex(), owner.Hex(), err) - } - return *allowance, nil + allowance := new(*big.Int) + if err := tokenContract.Call(opts, allowance, "allowance", owner, spender); err != nil { + return nil, fmt.Errorf("Could not get %s allowance of %s for %s: %w", tokenName, spender.Hex(), owner.Hex(), err) + } + return *allowance, nil } - // Estimate the gas of transfer func estimateTransferGas(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return tokenContract.GetTransactionGasInfo(opts, "transfer", to, amount) + return tokenContract.GetTransactionGasInfo(opts, "transfer", to, amount) } - // Transfer tokens to an address func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "transfer", to, amount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) - } - return hash, nil + hash, err := tokenContract.Transact(opts, "transfer", to, amount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) + } + return hash, nil } - // Estimate the gas of approve func estimateApproveGas(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return tokenContract.GetTransactionGasInfo(opts, "approve", spender, amount) + return tokenContract.GetTransactionGasInfo(opts, "approve", spender, amount) } - // Approve a token allowance for a spender func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "approve", spender, amount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) - } - return hash, nil + hash, err := tokenContract.Transact(opts, "approve", spender, amount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) + } + return hash, nil } - // Estimate the gas of transferFrom func estimateTransferFromGas(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return tokenContract.GetTransactionGasInfo(opts, "transferFrom", from, to, amount) + return tokenContract.GetTransactionGasInfo(opts, "transferFrom", from, to, amount) } - // Transfer tokens from a sender to an address func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) - } - return hash, nil + hash, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) + } + return hash, nil } - diff --git a/types/beacon.go b/types/beacon.go index ec4d55544..6cb71e9bd 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -1,105 +1,104 @@ package types import ( - "fmt" + "fmt" - "encoding/hex" - "encoding/json" + "encoding/hex" + "encoding/json" ) - // Validator pubkey const ValidatorPubkeyLength = 48 // bytes type ValidatorPubkey [ValidatorPubkeyLength]byte - // Bytes conversion func (v ValidatorPubkey) Bytes() []byte { - return v[:] + return v[:] } func BytesToValidatorPubkey(value []byte) ValidatorPubkey { - var pubkey ValidatorPubkey - copy(pubkey[:], value) - return pubkey + var pubkey ValidatorPubkey + copy(pubkey[:], value) + return pubkey } - // String conversion func (v ValidatorPubkey) Hex() string { - return hex.EncodeToString(v.Bytes()) + return hex.EncodeToString(v.Bytes()) } func (v ValidatorPubkey) String() string { - return v.Hex() + return v.Hex() } func HexToValidatorPubkey(value string) (ValidatorPubkey, error) { - pubkey := make([]byte, ValidatorPubkeyLength) - if len(value) != hex.EncodedLen(ValidatorPubkeyLength) { - return ValidatorPubkey{}, fmt.Errorf("Invalid validator public key hex string %s: invalid length %d", value, len(value)) - } - if _, err := hex.Decode(pubkey, []byte(value)); err != nil { - return ValidatorPubkey{}, err - } - return BytesToValidatorPubkey(pubkey), nil + pubkey := make([]byte, ValidatorPubkeyLength) + if len(value) != hex.EncodedLen(ValidatorPubkeyLength) { + return ValidatorPubkey{}, fmt.Errorf("Invalid validator public key hex string %s: invalid length %d", value, len(value)) + } + if _, err := hex.Decode(pubkey, []byte(value)); err != nil { + return ValidatorPubkey{}, err + } + return BytesToValidatorPubkey(pubkey), nil } - // JSON encoding func (v ValidatorPubkey) MarshalJSON() ([]byte, error) { - return json.Marshal(v.Hex()) + return json.Marshal(v.Hex()) } func (v *ValidatorPubkey) UnmarshalJSON(data []byte) error { - var dataStr string - if err := json.Unmarshal(data, &dataStr); err != nil { return err } - pubkey, err := HexToValidatorPubkey(dataStr) - if err == nil { *v = pubkey } - return err + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + pubkey, err := HexToValidatorPubkey(dataStr) + if err == nil { + *v = pubkey + } + return err } - // Validator signature const ValidatorSignatureLength = 96 // bytes type ValidatorSignature [ValidatorSignatureLength]byte - // Bytes conversion func (v ValidatorSignature) Bytes() []byte { - return v[:] + return v[:] } func BytesToValidatorSignature(value []byte) ValidatorSignature { - var signature ValidatorSignature - copy(signature[:], value) - return signature + var signature ValidatorSignature + copy(signature[:], value) + return signature } - // String conversion func (v ValidatorSignature) Hex() string { - return hex.EncodeToString(v.Bytes()) + return hex.EncodeToString(v.Bytes()) } func (v ValidatorSignature) String() string { - return v.Hex() + return v.Hex() } func HexToValidatorSignature(value string) (ValidatorSignature, error) { - signature := make([]byte, ValidatorSignatureLength) - if len(value) != hex.EncodedLen(ValidatorSignatureLength) { - return ValidatorSignature{}, fmt.Errorf("Invalid validator signature hex string %s: invalid length %d", value, len(value)) - } - if _, err := hex.Decode(signature, []byte(value)); err != nil { - return ValidatorSignature{}, err - } - return BytesToValidatorSignature(signature), nil + signature := make([]byte, ValidatorSignatureLength) + if len(value) != hex.EncodedLen(ValidatorSignatureLength) { + return ValidatorSignature{}, fmt.Errorf("Invalid validator signature hex string %s: invalid length %d", value, len(value)) + } + if _, err := hex.Decode(signature, []byte(value)); err != nil { + return ValidatorSignature{}, err + } + return BytesToValidatorSignature(signature), nil } - // JSON encoding func (v ValidatorSignature) MarshalJSON() ([]byte, error) { - return json.Marshal(v.Hex()) + return json.Marshal(v.Hex()) } func (v *ValidatorSignature) UnmarshalJSON(data []byte) error { - var dataStr string - if err := json.Unmarshal(data, &dataStr); err != nil { return err } - signature, err := HexToValidatorSignature(dataStr) - if err == nil { *v = signature } - return err + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + signature, err := HexToValidatorSignature(dataStr) + if err == nil { + *v = signature + } + return err } - diff --git a/types/dao.go b/types/dao.go index b5da9beb5..241c0cc04 100644 --- a/types/dao.go +++ b/types/dao.go @@ -1,51 +1,57 @@ package types import ( - "encoding/json" - "fmt" + "encoding/json" + "fmt" ) - // DAO proposal states type ProposalState uint8 + const ( - Pending ProposalState = iota - Active - Cancelled - Defeated - Succeeded - Expired - Executed + Pending ProposalState = iota + Active + Cancelled + Defeated + Succeeded + Expired + Executed ) -var ProposalStates = []string{"Pending", "Active", "Cancelled", "Defeated", "Succeeded", "Expired", "Executed"} +var ProposalStates = []string{"Pending", "Active", "Cancelled", "Defeated", "Succeeded", "Expired", "Executed"} // String conversion func (s ProposalState) String() string { - if int(s) >= len(ProposalStates) { return "" } - return ProposalStates[s] + if int(s) >= len(ProposalStates) { + return "" + } + return ProposalStates[s] } func StringToProposalState(value string) (ProposalState, error) { - for state, str := range ProposalStates { - if value == str { return ProposalState(state), nil } - } - return 0, fmt.Errorf("Invalid proposal state '%s'", value) + for state, str := range ProposalStates { + if value == str { + return ProposalState(state), nil + } + } + return 0, fmt.Errorf("Invalid proposal state '%s'", value) } - // JSON encoding func (s ProposalState) MarshalJSON() ([]byte, error) { - str := s.String() - if str == "" { - return []byte{}, fmt.Errorf("Invalid proposal state '%d'", s) - } - return json.Marshal(str) + str := s.String() + if str == "" { + return []byte{}, fmt.Errorf("Invalid proposal state '%d'", s) + } + return json.Marshal(str) } func (s *ProposalState) UnmarshalJSON(data []byte) error { - var dataStr string - if err := json.Unmarshal(data, &dataStr); err != nil { return err } - state, err := StringToProposalState(dataStr) - if err == nil { *s = state } - return err + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + state, err := StringToProposalState(dataStr) + if err == nil { + *s = state + } + return err } - diff --git a/types/minipool.go b/types/minipool.go index f711733d2..d8eb436fa 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -1,90 +1,103 @@ package types import ( - "encoding/json" - "fmt" + "encoding/json" + "fmt" ) - // Minipool statuses type MinipoolStatus uint8 + const ( - Initialized MinipoolStatus = iota - Prelaunch - Staking - Withdrawable - Dissolved + Initialized MinipoolStatus = iota + Prelaunch + Staking + Withdrawable + Dissolved ) -var MinipoolStatuses = []string{"Initialized", "Prelaunch", "Staking", "Withdrawable", "Dissolved"} +var MinipoolStatuses = []string{"Initialized", "Prelaunch", "Staking", "Withdrawable", "Dissolved"} // String conversion func (s MinipoolStatus) String() string { - if int(s) >= len(MinipoolStatuses) { return "" } - return MinipoolStatuses[s] + if int(s) >= len(MinipoolStatuses) { + return "" + } + return MinipoolStatuses[s] } func StringToMinipoolStatus(value string) (MinipoolStatus, error) { - for status, str := range MinipoolStatuses { - if value == str { return MinipoolStatus(status), nil } - } - return 0, fmt.Errorf("Invalid minipool status '%s'", value) + for status, str := range MinipoolStatuses { + if value == str { + return MinipoolStatus(status), nil + } + } + return 0, fmt.Errorf("Invalid minipool status '%s'", value) } - // JSON encoding func (s MinipoolStatus) MarshalJSON() ([]byte, error) { - str := s.String() - if str == "" { - return []byte{}, fmt.Errorf("Invalid minipool status '%d'", s) - } - return json.Marshal(str) + str := s.String() + if str == "" { + return []byte{}, fmt.Errorf("Invalid minipool status '%d'", s) + } + return json.Marshal(str) } func (s *MinipoolStatus) UnmarshalJSON(data []byte) error { - var dataStr string - if err := json.Unmarshal(data, &dataStr); err != nil { return err } - status, err := StringToMinipoolStatus(dataStr) - if err == nil { *s = status } - return err + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + status, err := StringToMinipoolStatus(dataStr) + if err == nil { + *s = status + } + return err } - // Minipool deposit types type MinipoolDeposit uint8 + const ( - None MinipoolDeposit = iota - Full - Half - Empty + None MinipoolDeposit = iota + Full + Half + Empty ) -var MinipoolDepositTypes = []string{"None", "Full", "Half", "Empty"} +var MinipoolDepositTypes = []string{"None", "Full", "Half", "Empty"} // String conversion func (d MinipoolDeposit) String() string { - if int(d) >= len(MinipoolDepositTypes) { return "" } - return MinipoolDepositTypes[d] + if int(d) >= len(MinipoolDepositTypes) { + return "" + } + return MinipoolDepositTypes[d] } func StringToMinipoolDeposit(value string) (MinipoolDeposit, error) { - for depositType, str := range MinipoolDepositTypes { - if value == str { return MinipoolDeposit(depositType), nil } - } - return 0, fmt.Errorf("Invalid minipool deposit type '%s'", value) + for depositType, str := range MinipoolDepositTypes { + if value == str { + return MinipoolDeposit(depositType), nil + } + } + return 0, fmt.Errorf("Invalid minipool deposit type '%s'", value) } - // JSON encoding func (d MinipoolDeposit) MarshalJSON() ([]byte, error) { - str := d.String() - if str == "" { - return []byte{}, fmt.Errorf("Invalid minipool deposit type '%d'", d) - } - return json.Marshal(str) + str := d.String() + if str == "" { + return []byte{}, fmt.Errorf("Invalid minipool deposit type '%d'", d) + } + return json.Marshal(str) } func (d *MinipoolDeposit) UnmarshalJSON(data []byte) error { - var dataStr string - if err := json.Unmarshal(data, &dataStr); err != nil { return err } - depositType, err := StringToMinipoolDeposit(dataStr) - if err == nil { *d = depositType } - return err + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + depositType, err := StringToMinipoolDeposit(dataStr) + if err == nil { + *d = depositType + } + return err } - diff --git a/utils/address_generation.go b/utils/address_generation.go index 5ca1ba07e..7145f7c35 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -14,59 +14,57 @@ import ( // Combine a node's address and a salt to retreive a new salt compatible with depositing func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { - // Create a new salt by hashing the original and the node address - saltBytes := [32]byte{} - salt.FillBytes(saltBytes[:]) - saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) - return saltHash + // Create a new salt by hashing the original and the node address + saltBytes := [32]byte{} + salt.FillBytes(saltBytes[:]) + saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) + return saltHash } - // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { - // Get dependencies - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return common.Address{}, err - } - minipoolAbi, err := rp.GetABI("rocketMinipool") - if err != nil { - return common.Address{}, err - } + // Get dependencies + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAbi, err := rp.GetABI("rocketMinipool") + if err != nil { + return common.Address{}, err + } - if len(minipoolBytecode) == 0 { - minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) - if err != nil { - return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) - } - } - - // Create the hash of the minipool constructor call - depositTypeBytes := [32]byte{} - depositTypeBytes[0] = byte(depositType) - packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) - if err != nil { - return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) - } + if len(minipoolBytecode) == 0 { + minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + if err != nil { + return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) + } + } - // Get the node salt and initialization data - nodeSalt := GetNodeSalt(nodeAddress, salt) - initData := append(minipoolBytecode, packedConstructorArgs...) - initHash := crypto.Keccak256(initData) + // Create the hash of the minipool constructor call + depositTypeBytes := [32]byte{} + depositTypeBytes[0] = byte(depositType) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) + if err != nil { + return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) + } - address := crypto.CreateAddress2(*rocketMinipoolManager.Address, nodeSalt, initHash) - return address, nil + // Get the node salt and initialization data + nodeSalt := GetNodeSalt(nodeAddress, salt) + initData := append(minipoolBytecode, packedConstructorArgs...) + initHash := crypto.Keccak256(initData) -} + address := crypto.CreateAddress2(*rocketMinipoolManager.Address, nodeSalt, initHash) + return address, nil +} // Get contracts var rocketMinipoolManagerLock sync.Mutex + func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolManagerLock.Lock() - defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") } - diff --git a/utils/client/proxy.go b/utils/client/proxy.go index 1fdb28a72..fd8445628 100644 --- a/utils/client/proxy.go +++ b/utils/client/proxy.go @@ -15,374 +15,345 @@ import ( // This type wraps multiple ETH clients, providing natural fallback support if one of them fails. type EthClientProxy struct { - clientUrls []string - clients []*ethclient.Client - timeouts []time.Time - reconnectDelay time.Duration + clientUrls []string + clients []*ethclient.Client + timeouts []time.Time + reconnectDelay time.Duration } - -// This is a signature for a wrapped ethclient.Client function +// This is a signature for a wrapped ethclient.Client function type clientFunction func(*ethclient.Client) (interface{}, error) - // Creates a new Eth1ClientProxy instance based on the main and backup client URLs -func NewEth1ClientProxy(reconnectDelay time.Duration, urls ...string) (*EthClientProxy) { - - clients := []*ethclient.Client{} - timeouts := []time.Time{} - - // Clamp the delay - if reconnectDelay < 0 { - reconnectDelay = 0 - } - - // Try connecting to each client, but ignore errors - they'll be handled at runtime - for _, url := range urls { - client, err := ethclient.Dial(url) - if err != nil { - timeouts = append(timeouts, time.Now()) - } else { - timeouts = append(timeouts, time.Time{}) - } - clients = append(clients, client) - } - - return &EthClientProxy{ - clientUrls: urls, - clients: clients, - timeouts: timeouts, - reconnectDelay: reconnectDelay, - } +func NewEth1ClientProxy(reconnectDelay time.Duration, urls ...string) *EthClientProxy { + + clients := []*ethclient.Client{} + timeouts := []time.Time{} + + // Clamp the delay + if reconnectDelay < 0 { + reconnectDelay = 0 + } + + // Try connecting to each client, but ignore errors - they'll be handled at runtime + for _, url := range urls { + client, err := ethclient.Dial(url) + if err != nil { + timeouts = append(timeouts, time.Now()) + } else { + timeouts = append(timeouts, time.Time{}) + } + clients = append(clients, client) + } + + return &EthClientProxy{ + clientUrls: urls, + clients: clients, + timeouts: timeouts, + reconnectDelay: reconnectDelay, + } } - /// ======================== /// ContractCaller Functions /// ======================== - // CodeAt returns the code of the given account. This is needed to differentiate // between contract internal errors and the local chain being out of sync. func (p *EthClientProxy) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.CodeAt(ctx, contract, blockNumber) - }) - if err != nil { - return nil, err - } - return result.([]byte), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.CodeAt(ctx, contract, blockNumber) + }) + if err != nil { + return nil, err + } + return result.([]byte), err } - // CallContract executes an Ethereum contract call with the specified data as the // input. func (p *EthClientProxy) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.CallContract(ctx, call, blockNumber) - }) - if err != nil { - return nil, err - } - return result.([]byte), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.CallContract(ctx, call, blockNumber) + }) + if err != nil { + return nil, err + } + return result.([]byte), err } - /// ============================ /// ContractTransactor Functions /// ============================ - // HeaderByNumber returns a block header from the current canonical chain. If number is // nil, the latest known header is returned. func (p *EthClientProxy) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.HeaderByNumber(ctx, number) - }) - if err != nil { - return nil, err - } - return result.(*types.Header), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.HeaderByNumber(ctx, number) + }) + if err != nil { + return nil, err + } + return result.(*types.Header), err } - // PendingCodeAt returns the code of the given account in the pending state. func (p *EthClientProxy) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.PendingCodeAt(ctx, account) - }) - if err != nil { - return nil, err - } - return result.([]byte), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.PendingCodeAt(ctx, account) + }) + if err != nil { + return nil, err + } + return result.([]byte), err } - // PendingNonceAt retrieves the current pending nonce associated with an account. func (p *EthClientProxy) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.PendingNonceAt(ctx, account) - }) - if err != nil { - return 0, err - } - return result.(uint64), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.PendingNonceAt(ctx, account) + }) + if err != nil { + return 0, err + } + return result.(uint64), err } - // SuggestGasPrice retrieves the currently suggested gas price to allow a timely // execution of a transaction. func (p *EthClientProxy) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SuggestGasPrice(ctx) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SuggestGasPrice(ctx) + }) + if err != nil { + return nil, err + } + return result.(*big.Int), err } - // SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow // a timely execution of a transaction. func (p *EthClientProxy) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SuggestGasTipCap(ctx) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SuggestGasTipCap(ctx) + }) + if err != nil { + return nil, err + } + return result.(*big.Int), err } - // EstimateGas tries to estimate the gas needed to execute a specific // transaction based on the current pending state of the backend blockchain. // There is no guarantee that this is the true gas limit requirement as other // transactions may be added or removed by miners, but it should provide a basis // for setting a reasonable default. func (p *EthClientProxy) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.EstimateGas(ctx, call) - }) - if err != nil { - return 0, err - } - return result.(uint64), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.EstimateGas(ctx, call) + }) + if err != nil { + return 0, err + } + return result.(uint64), err } - // SendTransaction injects the transaction into the pending pool for execution. func (p *EthClientProxy) SendTransaction(ctx context.Context, tx *types.Transaction) error { - _, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return nil, client.SendTransaction(ctx, tx) - }) - return err + _, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return nil, client.SendTransaction(ctx, tx) + }) + return err } - /// ========================== /// ContractFilterer Functions /// ========================== - // FilterLogs executes a log filter operation, blocking during execution and // returning all the results in one batch. // // TODO(karalabe): Deprecate when the subscription one can return past data too. func (p *EthClientProxy) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.FilterLogs(ctx, query) - }) - if err != nil { - return nil, err - } - return result.([]types.Log), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.FilterLogs(ctx, query) + }) + if err != nil { + return nil, err + } + return result.([]types.Log), err } - // SubscribeFilterLogs creates a background log filtering operation, returning // a subscription immediately, which can be used to stream the found events. func (p *EthClientProxy) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SubscribeFilterLogs(ctx, query, ch) - }) - if err != nil { - return nil, err - } - return result.(ethereum.Subscription), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SubscribeFilterLogs(ctx, query, ch) + }) + if err != nil { + return nil, err + } + return result.(ethereum.Subscription), err } - /// ======================= /// DeployBackend Functions /// ======================= - // TransactionReceipt returns the receipt of a transaction by transaction hash. // Note that the receipt is not available for pending transactions. func (p *EthClientProxy) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.TransactionReceipt(ctx, txHash) - }) - if err != nil { - return nil, err - } - return result.(*types.Receipt), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.TransactionReceipt(ctx, txHash) + }) + if err != nil { + return nil, err + } + return result.(*types.Receipt), err } - /// ================ /// Client functions /// ================ - // BlockNumber returns the most recent block number func (p *EthClientProxy) BlockNumber(ctx context.Context) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.BlockNumber(ctx) - }) - if err != nil { - return 0, err - } - return result.(uint64), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.BlockNumber(ctx) + }) + if err != nil { + return 0, err + } + return result.(uint64), err } - // BalanceAt returns the wei balance of the given account. // The block number can be nil, in which case the balance is taken from the latest known block. func (p *EthClientProxy) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.BalanceAt(ctx, account, blockNumber) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.BalanceAt(ctx, account, blockNumber) + }) + if err != nil { + return nil, err + } + return result.(*big.Int), err } - // TransactionByHash returns the transaction with the given hash. func (p *EthClientProxy) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - tx, isPending, err := client.TransactionByHash(ctx, hash) - result := []interface{} { tx, isPending } - return result, err - }) - if err != nil { - return nil, false, err - } - - // TODO: Can we just use the named return values inside the closer to skip this? - resultArray := result.([]interface{}) - tx = resultArray[0].(*types.Transaction) - isPending = resultArray[1].(bool) - return tx, isPending, err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + tx, isPending, err := client.TransactionByHash(ctx, hash) + result := []interface{}{tx, isPending} + return result, err + }) + if err != nil { + return nil, false, err + } + + // TODO: Can we just use the named return values inside the closer to skip this? + resultArray := result.([]interface{}) + tx = resultArray[0].(*types.Transaction) + isPending = resultArray[1].(bool) + return tx, isPending, err } - // NonceAt returns the account nonce of the given account. // The block number can be nil, in which case the nonce is taken from the latest known block. func (p *EthClientProxy) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.NonceAt(ctx, account, blockNumber) - }) - if err != nil { - return 0, err - } - return result.(uint64), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.NonceAt(ctx, account, blockNumber) + }) + if err != nil { + return 0, err + } + return result.(uint64), err } - // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. func (p *EthClientProxy) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SyncProgress(ctx) - }) - if err != nil { - return nil, err - } - return result.(*ethereum.SyncProgress), err + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.SyncProgress(ctx) + }) + if err != nil { + return nil, err + } + return result.(*ethereum.SyncProgress), err } - /// ================== /// Internal functions /// ================== - // Attempts to run a function progressively through each client until one succeeds or they all fail. func (p *EthClientProxy) runFunction(function clientFunction) (interface{}, error) { - // A cumulative error string as each client gets tried - errorString := "" - - for i := 0; i < len(p.clients); i++ { - client, clientErr := p.getClient(i) - if client != nil { - - // This client is available, try running the function - result, err := function(client) - if err != nil { - - // If it's disconnected, log it and try the next client - errorString += fmt.Sprintf("\nError with client %d: %s", i, err.Error()) - if isDisconnected(err) { - p.clients[i] = nil - p.timeouts[i] = time.Now() - - // If it's a different error, just return it - } else { - return nil, fmt.Errorf(errorString) - } - - // If there's no error, return the result - } else { - return result, nil - } - - // Note a client failure and try the next one - } else { - errorString += fmt.Sprintf("\nError with client %d: %s", i, clientErr.Error()) - } - } - - // If none of the clients worked, return the aggregated error string - errorString += "\nNone of the clients were available." - return nil, fmt.Errorf(errorString) + // A cumulative error string as each client gets tried + errorString := "" -} + for i := 0; i < len(p.clients); i++ { + client, clientErr := p.getClient(i) + if client != nil { + // This client is available, try running the function + result, err := function(client) + if err != nil { + + // If it's disconnected, log it and try the next client + errorString += fmt.Sprintf("\nError with client %d: %s", i, err.Error()) + if isDisconnected(err) { + p.clients[i] = nil + p.timeouts[i] = time.Now() + + // If it's a different error, just return it + } else { + return nil, fmt.Errorf(errorString) + } + + // If there's no error, return the result + } else { + return result, nil + } + + // Note a client failure and try the next one + } else { + errorString += fmt.Sprintf("\nError with client %d: %s", i, clientErr.Error()) + } + } + + // If none of the clients worked, return the aggregated error string + errorString += "\nNone of the clients were available." + return nil, fmt.Errorf(errorString) -// Returns true if the error was a connection failure and a backup client is available -func isDisconnected(err error) (bool) { - return strings.Contains(err.Error(), "dial tcp") } +// Returns true if the error was a connection failure and a backup client is available +func isDisconnected(err error) bool { + return strings.Contains(err.Error(), "dial tcp") +} // Get the client at the given index, trying a reconnect if it's disconnected func (p *EthClientProxy) getClient(index int) (*ethclient.Client, error) { - // Try connecting to the client if it's dead - var err error - if p.clients[index] == nil { - - // Check if enough time has passed - if time.Since(p.timeouts[index]) > p.reconnectDelay { - p.clients[index], err = ethclient.Dial(p.clientUrls[index]) - - // If the connection failed, reset the timer - if err != nil { - p.timeouts[index] = time.Now() - } - - } else { - err = fmt.Errorf("Connection failure, waiting %s to reconnect", p.reconnectDelay) - } - } - - // Return the client regardless of its state - return p.clients[index], err + // Try connecting to the client if it's dead + var err error + if p.clients[index] == nil { + + // Check if enough time has passed + if time.Since(p.timeouts[index]) > p.reconnectDelay { + p.clients[index], err = ethclient.Dial(p.clientUrls[index]) + + // If the connection failed, reset the timer + if err != nil { + p.timeouts[index] = time.Now() + } + + } else { + err = fmt.Errorf("Connection failure, waiting %s to reconnect", p.reconnectDelay) + } + } + + // Return the client regardless of its state + return p.clients[index], err } - diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index d6862a39e..b667cce86 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -17,111 +17,107 @@ import ( // BeaconDepositEvent represents a DepositEvent event raised by the BeaconDeposit contract. type BeaconDepositEvent struct { - Pubkey []byte `abi:"pubkey"` + Pubkey []byte `abi:"pubkey"` WithdrawalCredentials []byte `abi:"withdrawal_credentials"` - Amount []byte `abi:"amount"` - Signature []byte `abi:"signature"` - Index []byte `abi:"index"` - Raw types.Log // Blockchain specific contextual infos + Amount []byte `abi:"amount"` + Signature []byte `abi:"signature"` + Index []byte `abi:"index"` + Raw types.Log // Blockchain specific contextual infos } - // Formatted Beacon deposit event data type DepositData struct { - Pubkey rptypes.ValidatorPubkey `json:"pubkey"` - WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` - Amount uint64 `json:"amount"` - Signature rptypes.ValidatorSignature `json:"signature"` - TxHash common.Hash `json:"txHash"` - BlockNumber uint64 `json:"blockNumber"` - TxIndex uint `json:"txIndex"` + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount uint64 `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + TxHash common.Hash `json:"txHash"` + BlockNumber uint64 `json:"blockNumber"` + TxIndex uint `json:"txIndex"` } - -// Gets all of the deposit contract's deposit events for the provided pubkeys -func GetDeposits(rp *rocketpool.RocketPool, pubkeys map[rptypes.ValidatorPubkey]bool, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) ( map[rptypes.ValidatorPubkey][]DepositData, error ) { - - // Get the deposit contract wrapper - casperDeposit, err := getCasperDeposit(rp) - if err != nil { - return nil, err - } - - // Create the initial map and pubkey lookup - depositMap := make(map[rptypes.ValidatorPubkey][]DepositData, len(pubkeys)) - - // Get the deposit events - addressFilter := []common.Address{*casperDeposit.Address} - topicFilter := [][]common.Hash{{casperDeposit.ABI.Events["DepositEvent"].ID}} - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) - if err != nil { - return nil, err - } - - // Process each event - for _, log := range logs { - depositEvent := new(BeaconDepositEvent) - err = casperDeposit.Contract.UnpackLog(depositEvent, "DepositEvent", log) - if err != nil { - return nil, err - } - - // Check if this is a deposit for one of the pubkeys we're looking for - pubkey := rptypes.BytesToValidatorPubkey(depositEvent.Pubkey) - _, exists := pubkeys[pubkey] - if exists { - // Convert the deposit amount from little-endian binary to a uint64 - var amount uint64 - buf := bytes.NewReader(depositEvent.Amount) - err = binary.Read(buf, binary.LittleEndian, &amount) - if err != nil { - return nil, err - } - - // Create the deposit data wrapper and add it to this pubkey's collection - depositData := DepositData{ - Pubkey: pubkey, - WithdrawalCredentials: common.BytesToHash(depositEvent.WithdrawalCredentials), - Amount: amount, - Signature: rptypes.BytesToValidatorSignature(depositEvent.Signature), - TxHash: log.TxHash, - BlockNumber: log.BlockNumber, - TxIndex: log.TxIndex, - } - depositMap[pubkey] = append(depositMap[pubkey], depositData) - } - } - - // Sort deposits by time - for _, deposits := range depositMap { - if len(deposits) > 1 { - sortDepositData(deposits) - } - } - - return depositMap, nil +// Gets all of the deposit contract's deposit events for the provided pubkeys +func GetDeposits(rp *rocketpool.RocketPool, pubkeys map[rptypes.ValidatorPubkey]bool, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) (map[rptypes.ValidatorPubkey][]DepositData, error) { + + // Get the deposit contract wrapper + casperDeposit, err := getCasperDeposit(rp) + if err != nil { + return nil, err + } + + // Create the initial map and pubkey lookup + depositMap := make(map[rptypes.ValidatorPubkey][]DepositData, len(pubkeys)) + + // Get the deposit events + addressFilter := []common.Address{*casperDeposit.Address} + topicFilter := [][]common.Hash{{casperDeposit.ABI.Events["DepositEvent"].ID}} + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Process each event + for _, log := range logs { + depositEvent := new(BeaconDepositEvent) + err = casperDeposit.Contract.UnpackLog(depositEvent, "DepositEvent", log) + if err != nil { + return nil, err + } + + // Check if this is a deposit for one of the pubkeys we're looking for + pubkey := rptypes.BytesToValidatorPubkey(depositEvent.Pubkey) + _, exists := pubkeys[pubkey] + if exists { + // Convert the deposit amount from little-endian binary to a uint64 + var amount uint64 + buf := bytes.NewReader(depositEvent.Amount) + err = binary.Read(buf, binary.LittleEndian, &amount) + if err != nil { + return nil, err + } + + // Create the deposit data wrapper and add it to this pubkey's collection + depositData := DepositData{ + Pubkey: pubkey, + WithdrawalCredentials: common.BytesToHash(depositEvent.WithdrawalCredentials), + Amount: amount, + Signature: rptypes.BytesToValidatorSignature(depositEvent.Signature), + TxHash: log.TxHash, + BlockNumber: log.BlockNumber, + TxIndex: log.TxIndex, + } + depositMap[pubkey] = append(depositMap[pubkey], depositData) + } + } + + // Sort deposits by time + for _, deposits := range depositMap { + if len(deposits) > 1 { + sortDepositData(deposits) + } + } + + return depositMap, nil } - // Sorts a slice of deposit data entries - lower blocks come first, and if multiple transactions occur // in the same block, lower transaction indices come first func sortDepositData(data []DepositData) { - sort.Slice(data, func(i int, j int) bool { - first := data[i] - second := data[j] - if first.BlockNumber == second.BlockNumber { - return first.TxIndex < second.TxIndex - } - return first.BlockNumber < second.BlockNumber - }) + sort.Slice(data, func(i int, j int) bool { + first := data[i] + second := data[j] + if first.BlockNumber == second.BlockNumber { + return first.TxIndex < second.TxIndex + } + return first.BlockNumber < second.BlockNumber + }) } - // Get contracts var casperDepositLock sync.Mutex + func getCasperDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - casperDepositLock.Lock() - defer casperDepositLock.Unlock() - return rp.GetContract("casperDeposit") + casperDepositLock.Lock() + defer casperDepositLock.Unlock() + return rp.GetContract("casperDeposit") } - diff --git a/utils/eth/logs.go b/utils/eth/logs.go index a79d156ec..a1f37e1e2 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -43,10 +43,9 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter } addresses = append(addresses, *currentAddress) // Perform the desired getLogs call and return results - return GetLogs(rp, addresses, q.Topics, intervalSize, q.FromBlock, q.ToBlock, q.BlockHash); + return GetLogs(rp, addresses, q.Topics, intervalSize, q.FromBlock, q.ToBlock, q.BlockHash) } - // Gets the logs for a particular log request, breaking the calls into batches if necessary func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFilter [][]common.Hash, intervalSize, fromBlock, toBlock *big.Int, blockHash *common.Hash) ([]types.Log, error) { var logs []types.Log @@ -65,9 +64,9 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil // Handle unlimited intervals with a single call logs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ Addresses: addressFilter, - Topics: topicFilter, + Topics: topicFilter, FromBlock: fromBlock, - ToBlock: toBlock, + ToBlock: toBlock, BlockHash: blockHash, }) if err != nil { @@ -96,9 +95,9 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil // Get the logs using the current interval newLogs, err := rp.Client.FilterLogs(context.Background(), ethereum.FilterQuery{ Addresses: addressFilter, - Topics: topicFilter, + Topics: topicFilter, FromBlock: start, - ToBlock: end, + ToBlock: end, BlockHash: blockHash, }) if err != nil { @@ -121,4 +120,4 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil } } } -} \ No newline at end of file +} diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 4e66e2715..09a67ae1e 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -15,92 +15,90 @@ import ( // Estimate the gas of SendTransaction func EstimateSendTransactionGas(client *client.EthClientProxy, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - // User-defined settings - response := rocketpool.GasInfo{} - - // Set default value - value := opts.Value - if value == nil { - value = big.NewInt(0) - } - - // Estimate gas limit - gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ - From: opts.From, - To: &toAddress, - GasPrice: big.NewInt(0), // set to 0 for simulation - Value: value, - }) - if err != nil { - return rocketpool.GasInfo{}, err - } - response.EstGasLimit = gasLimit - response.SafeGasLimit = gasLimit - - return response, err + // User-defined settings + response := rocketpool.GasInfo{} + + // Set default value + value := opts.Value + if value == nil { + value = big.NewInt(0) + } + + // Estimate gas limit + gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: &toAddress, + GasPrice: big.NewInt(0), // set to 0 for simulation + Value: value, + }) + if err != nil { + return rocketpool.GasInfo{}, err + } + response.EstGasLimit = gasLimit + response.SafeGasLimit = gasLimit + + return response, err } - // Send a transaction to an address func SendTransaction(client *client.EthClientProxy, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - var err error - - // Get from address nonce - var nonce uint64 - if opts.Nonce == nil { - nonce, err = client.PendingNonceAt(context.Background(), opts.From) - if err != nil { - return common.Hash{}, err - } - } else { - nonce = opts.Nonce.Uint64() - } - - // Set default value - value := opts.Value - if value == nil { - value = big.NewInt(0) - } - - // Estimate gas limit - gasLimit := opts.GasLimit - if gasLimit == 0 { - gasLimit, err = client.EstimateGas(context.Background(), ethereum.CallMsg{ - From: opts.From, - To: &toAddress, - GasPrice: big.NewInt(0), // use 0 gwei for simulation - Value: value, - }) - if err != nil { - return common.Hash{}, err - } - } - - // Initialize transaction - tx := types.NewTx(&types.DynamicFeeTx{ - ChainID: chainID, - Nonce: nonce, - GasTipCap: opts.GasTipCap, - GasFeeCap: opts.GasFeeCap, - Gas: gasLimit, - To: &toAddress, - Value: value, - Data: []byte{}, - AccessList: []types.AccessTuple{}, - }) - - // Sign transaction - signedTx, err := opts.Signer(opts.From, tx) - if err != nil { - return common.Hash{}, err - } - - // Send transaction - if err = client.SendTransaction(context.Background(), signedTx); err != nil { - return common.Hash{}, err - } - - return signedTx.Hash(), nil + var err error + + // Get from address nonce + var nonce uint64 + if opts.Nonce == nil { + nonce, err = client.PendingNonceAt(context.Background(), opts.From) + if err != nil { + return common.Hash{}, err + } + } else { + nonce = opts.Nonce.Uint64() + } + + // Set default value + value := opts.Value + if value == nil { + value = big.NewInt(0) + } + + // Estimate gas limit + gasLimit := opts.GasLimit + if gasLimit == 0 { + gasLimit, err = client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: opts.From, + To: &toAddress, + GasPrice: big.NewInt(0), // use 0 gwei for simulation + Value: value, + }) + if err != nil { + return common.Hash{}, err + } + } + + // Initialize transaction + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: chainID, + Nonce: nonce, + GasTipCap: opts.GasTipCap, + GasFeeCap: opts.GasFeeCap, + Gas: gasLimit, + To: &toAddress, + Value: value, + Data: []byte{}, + AccessList: []types.AccessTuple{}, + }) + + // Sign transaction + signedTx, err := opts.Signer(opts.From, tx) + if err != nil { + return common.Hash{}, err + } + + // Send transaction + if err = client.SendTransaction(context.Background(), signedTx); err != nil { + return common.Hash{}, err + } + + return signedTx.Hash(), nil } - diff --git a/utils/eth/units.go b/utils/eth/units.go index 83291492d..b105bb3ae 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -1,60 +1,54 @@ package eth import ( - "math/big" - "strconv" + "math/big" + "strconv" ) - // Conversion factors const ( - WeiPerEth float64 = 1e18 - WeiPerGwei float64 = 1e9 + WeiPerEth float64 = 1e18 + WeiPerGwei float64 = 1e9 ) - // Convert wei to eth func WeiToEth(wei *big.Int) float64 { - var weiFloat big.Float - var eth big.Float - weiFloat.SetInt(wei) - eth.Quo(&weiFloat, big.NewFloat(WeiPerEth)) - eth64, _ := eth.Float64() - return eth64 + var weiFloat big.Float + var eth big.Float + weiFloat.SetInt(wei) + eth.Quo(&weiFloat, big.NewFloat(WeiPerEth)) + eth64, _ := eth.Float64() + return eth64 } - // Convert eth to wei func EthToWei(eth float64) *big.Int { - var ethFloat big.Float - var weiFloat big.Float - var wei big.Int - ethFloat.SetString(strconv.FormatFloat(eth, 'f', -1, 64)) - weiFloat.Mul(ðFloat, big.NewFloat(WeiPerEth)) - weiFloat.Int(&wei) - return &wei + var ethFloat big.Float + var weiFloat big.Float + var wei big.Int + ethFloat.SetString(strconv.FormatFloat(eth, 'f', -1, 64)) + weiFloat.Mul(ðFloat, big.NewFloat(WeiPerEth)) + weiFloat.Int(&wei) + return &wei } - // Convert wei to gigawei func WeiToGwei(wei *big.Int) float64 { - var weiFloat big.Float - var gwei big.Float - weiFloat.SetInt(wei) - gwei.Quo(&weiFloat, big.NewFloat(WeiPerGwei)) - gwei64, _ := gwei.Float64() - return gwei64 + var weiFloat big.Float + var gwei big.Float + weiFloat.SetInt(wei) + gwei.Quo(&weiFloat, big.NewFloat(WeiPerGwei)) + gwei64, _ := gwei.Float64() + return gwei64 } - // Convert gigawei to wei func GweiToWei(gwei float64) *big.Int { - var gweiFloat big.Float - var weiFloat big.Float - var wei big.Int - gweiFloat.SetString(strconv.FormatFloat(gwei, 'f', -1, 64)) - weiFloat.Mul(&gweiFloat, big.NewFloat(WeiPerGwei)) - weiFloat.Int(&wei) - return &wei + var gweiFloat big.Float + var weiFloat big.Float + var wei big.Int + gweiFloat.SetString(strconv.FormatFloat(gwei, 'f', -1, 64)) + weiFloat.Mul(&gweiFloat, big.NewFloat(WeiPerGwei)) + weiFloat.Int(&wei) + return &wei } - diff --git a/utils/strings/sanitize.go b/utils/strings/sanitize.go index 0e3299ad1..ac8904f3a 100644 --- a/utils/strings/sanitize.go +++ b/utils/strings/sanitize.go @@ -1,18 +1,16 @@ package strings import ( - "strings" - "unicode" + "strings" + "unicode" ) - // Remove non-printable characters from a string func Sanitize(str string) string { - return strings.Map(func(r rune) rune { - if unicode.IsPrint(r) { - return r - } - return -1 - }, str) + return strings.Map(func(r rune) rune { + if unicode.IsPrint(r) { + return r + } + return -1 + }, str) } - diff --git a/utils/wait.go b/utils/wait.go index 90aa404ff..f3d50631b 100644 --- a/utils/wait.go +++ b/utils/wait.go @@ -14,40 +14,39 @@ import ( // Wait for a transaction to get mined func WaitForTransaction(client *client.EthClientProxy, hash common.Hash) (*types.Receipt, error) { - - var tx *types.Transaction - var err error - - // Get the transaction from its hash, retrying for 30 sec if it wasn't found - for i := 0; i < 30; i++ { - if i == 29 { - return nil, fmt.Errorf("Transaction not found after 30 seconds.") - } - - tx, _, err = client.TransactionByHash(context.Background(), hash) - if err != nil { - if err.Error() == "not found" { - time.Sleep(1 * time.Second) - continue; - } - return nil, err - } else { - break - } - } - - // Wait for transaction to be mined - txReceipt, err := bind.WaitMined(context.Background(), client, tx) - if err != nil { - return nil, err - } - - // Check transaction status - if txReceipt.Status == 0 { - return txReceipt, errors.New("Transaction failed with status 0") - } - - // Return - return txReceipt, nil -} + var tx *types.Transaction + var err error + + // Get the transaction from its hash, retrying for 30 sec if it wasn't found + for i := 0; i < 30; i++ { + if i == 29 { + return nil, fmt.Errorf("Transaction not found after 30 seconds.") + } + + tx, _, err = client.TransactionByHash(context.Background(), hash) + if err != nil { + if err.Error() == "not found" { + time.Sleep(1 * time.Second) + continue + } + return nil, err + } else { + break + } + } + + // Wait for transaction to be mined + txReceipt, err := bind.WaitMined(context.Background(), client, tx) + if err != nil { + return nil, err + } + + // Check transaction status + if txReceipt.Status == 0 { + return txReceipt, errors.New("Transaction failed with status 0") + } + + // Return + return txReceipt, nil +} From c7d15062ec3cd285e73f6dbeb7706213d5fd2106 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 10 Mar 2022 02:53:55 -0500 Subject: [PATCH 441/878] go mod tidy --- go.sum | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/go.sum b/go.sum index ac980060f..28421cb0e 100644 --- a/go.sum +++ b/go.sum @@ -128,8 +128,6 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= @@ -155,8 +153,6 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.15 h1:E9o0kMbD8HXhp7g6UwIwntY05WTDheCGziMhegcBsQw= -github.com/ethereum/go-ethereum v1.10.15/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -269,7 +265,6 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -321,8 +316,7 @@ github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19y github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= @@ -343,7 +337,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= From 34f1de0fef51c852ed79c4f5502d62ebf105321e Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Fri, 11 Mar 2022 12:49:13 +1000 Subject: [PATCH 442/878] Add method to get distributor address --- node/distributor.go | 33 +++++++++++++++++++++++++++++++++ test.sh | 4 ++-- tests/node/distributor_test.go | 30 ++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 node/distributor.go create mode 100644 tests/node/distributor_test.go diff --git a/node/distributor.go b/node/distributor.go new file mode 100644 index 000000000..ce1a9e5aa --- /dev/null +++ b/node/distributor.go @@ -0,0 +1,33 @@ +package node + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Gets the deterministic address for a node's reward distributor contract +func GetDistributorAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketNodeDistributorFactory, err := getRocketNodeDistributorFactory(rp) + if err != nil { + return common.Address{}, err + } + var address common.Address + if err := rocketNodeDistributorFactory.Call(opts, &address, "getProxyAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("Could not get distributor address: %w", err) + } + return address, nil +} + +// Get contracts +var rocketNodeDistributorFactoryLock sync.Mutex + +func getRocketNodeDistributorFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNodeDistributorFactoryLock.Lock() + defer rocketNodeDistributorFactoryLock.Unlock() + return rp.GetContract("rocketNodeDistributorFactory") +} diff --git a/test.sh b/test.sh index 191a465be..9b9153492 100755 --- a/test.sh +++ b/test.sh @@ -22,7 +22,7 @@ fi # Rocket Pool settings rp_repo_url="git@ssh.dev.azure.com:v3/rocket-pool/RocketPool/rocketpool" -rp_repo_branch="minipool-approval" +rp_repo_branch="merge-ready" # Dependencies rp_dependencies=( @@ -90,7 +90,7 @@ start_ganache() { # Migrate Rocket Pool contracts migrate_rp() { cd "$rp_path" - node_modules/.bin/truffle migrate + node_modules/.bin/truffle migrate --network localhost cd - > /dev/null } diff --git a/tests/node/distributor_test.go b/tests/node/distributor_test.go new file mode 100644 index 000000000..a33dd5488 --- /dev/null +++ b/tests/node/distributor_test.go @@ -0,0 +1,30 @@ +package node + +import ( + "github.com/rocket-pool/rocketpool-go/node" + "testing" + + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" +) + +func TestNodeDistributor(t *testing.T) { + + // State snapshotting + if err := evm.TakeSnapshot(); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if err := evm.RevertSnapshot(); err != nil { + t.Fatal(err) + } + }) + + distributorAddress, err := node.GetDistributorAddress(rp, nodeAccount.Address, nil) + if err != nil { + t.Fatal(err) + } + + if distributorAddress.Hex() == "0x0000000000000000000000000000000000000000" { + t.Errorf("Invalid distributor address") + } +} From 6cc5ab5edabd83847b9680478d34b66e874b8dbe Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Sat, 26 Mar 2022 17:12:35 -0400 Subject: [PATCH 443/878] Add a wrapper around the json package to create more verbose errors --- types/beacon.go | 3 ++- types/dao.go | 3 ++- types/minipool.go | 3 ++- utils/json/json.go | 19 +++++++++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 utils/json/json.go diff --git a/types/beacon.go b/types/beacon.go index 6cb71e9bd..8a476a88a 100644 --- a/types/beacon.go +++ b/types/beacon.go @@ -4,7 +4,8 @@ import ( "fmt" "encoding/hex" - "encoding/json" + + "github.com/rocket-pool/rocketpool-go/utils/json" ) // Validator pubkey diff --git a/types/dao.go b/types/dao.go index 241c0cc04..8026275f5 100644 --- a/types/dao.go +++ b/types/dao.go @@ -1,8 +1,9 @@ package types import ( - "encoding/json" "fmt" + + "github.com/rocket-pool/rocketpool-go/utils/json" ) // DAO proposal states diff --git a/types/minipool.go b/types/minipool.go index d8eb436fa..a6a83bbbd 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -1,8 +1,9 @@ package types import ( - "encoding/json" "fmt" + + "github.com/rocket-pool/rocketpool-go/utils/json" ) // Minipool statuses diff --git a/utils/json/json.go b/utils/json/json.go new file mode 100644 index 000000000..c9ac652ed --- /dev/null +++ b/utils/json/json.go @@ -0,0 +1,19 @@ +package json + +import ( + "encoding/json" + "fmt" +) + +func Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func Unmarshal(data []byte, v interface{}) error { + err := json.Unmarshal(data, v) + if err != nil { + return fmt.Errorf("%w\nUnable to Unmarshal JSON string %s", string(data)) + } + + return nil +} From 6e38b4dd310a6ee00277af5065b3a09301200f7b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 28 Mar 2022 14:11:35 -0400 Subject: [PATCH 444/878] Update json.go --- utils/json/json.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/json/json.go b/utils/json/json.go index c9ac652ed..4f6aed640 100644 --- a/utils/json/json.go +++ b/utils/json/json.go @@ -12,7 +12,7 @@ func Marshal(v interface{}) ([]byte, error) { func Unmarshal(data []byte, v interface{}) error { err := json.Unmarshal(data, v) if err != nil { - return fmt.Errorf("%w\nUnable to Unmarshal JSON string %s", string(data)) + return fmt.Errorf("%w\nUnable to Unmarshal JSON string %s", err, string(data)) } return nil From 90b114b73a0161f9df24fa60acede812065dd4a5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 4 Apr 2022 01:56:36 -0400 Subject: [PATCH 445/878] Updated to Geth v1.10.17 --- go.mod | 3 +-- go.sum | 79 +++++++++++++++++++++------------------------------------- 2 files changed, 29 insertions(+), 53 deletions(-) diff --git a/go.mod b/go.mod index c2b1e278f..1b8eda1c8 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,8 @@ module github.com/rocket-pool/rocketpool-go go 1.13 require ( - github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.16 + github.com/ethereum/go-ethereum v1.10.17 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index 28421cb0e..3ab924405 100644 --- a/go.sum +++ b/go.sum @@ -20,19 +20,9 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -48,7 +38,6 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -81,19 +70,10 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs= +github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -124,13 +104,15 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= @@ -141,6 +123,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczC github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= @@ -153,8 +137,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= -github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= +github.com/ethereum/go-ethereum v1.10.17 h1:XEcumY+qSr1cZQaWsQs5Kck3FHB0V2RiMHPdTBJ+oT8= +github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -215,6 +199,8 @@ github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -257,8 +243,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -298,8 +284,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 h1:+EYBkW+dbi3F/atB+LSQZSWh7+HNrV3A/N0y6DSoy9k= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -321,13 +307,10 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -344,7 +327,6 @@ github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -379,8 +361,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -420,6 +400,7 @@ github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjU github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -431,13 +412,10 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= @@ -579,7 +557,6 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -589,8 +566,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -633,7 +608,6 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -656,12 +630,14 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -675,7 +651,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -738,8 +713,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -865,8 +841,9 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 73093dd64cc4d3c938a61f8641840f096c3758bb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 4 Apr 2022 02:25:30 -0400 Subject: [PATCH 446/878] Added GetPendingRewards, changed the test script to point to the v1.1 branch --- rewards/rewards.go | 13 +++++++++++++ test.sh | 2 +- tests/rewards/node_test.go | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 3d75d0d7d..4bbadab8b 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -143,6 +143,19 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. return eth.WeiToEth(*perc), nil } +// Get the amount of RPL rewards that will be provided to node operators +func GetPendingRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + rewards := new(*big.Int) + if err := rocketRewardsPool.Call(opts, rewards, "getPendingRewards"); err != nil { + return 0, fmt.Errorf("Could not get pending rewards: %w", err) + } + return eth.WeiToEth(*rewards), nil +} + // Get contracts var rocketRewardsPoolLock sync.Mutex diff --git a/test.sh b/test.sh index 9b9153492..8dbf2e3de 100755 --- a/test.sh +++ b/test.sh @@ -22,7 +22,7 @@ fi # Rocket Pool settings rp_repo_url="git@ssh.dev.azure.com:v3/rocket-pool/RocketPool/rocketpool" -rp_repo_branch="merge-ready" +rp_repo_branch="v1.1" # Dependencies rp_dependencies=( diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index 5a77fb595..d4457aeba 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -118,6 +118,13 @@ func TestNodeRewards(t *testing.T) { t.Errorf("Incorrect initial node claim rewards amount %s", rewardsAmount.String()) } + // Get & check initial RPL rewards amount + if pendingRewards, err := rewards.GetPendingRewards(rp, nil); err != nil { + t.Error(err) + } else if pendingRewards != 0 { + t.Errorf("Incorrect initial pending rewards amount %f", pendingRewards) + } + // Start RPL inflation if header, err := rp.Client.HeaderByNumber(context.Background(), nil); err != nil { t.Fatal(err) @@ -137,6 +144,13 @@ func TestNodeRewards(t *testing.T) { t.Errorf("Incorrect updated node claim rewards amount %s", rewardsAmount.String()) } + // Get & check updated RPL rewards amount + if pendingRewards, err := rewards.GetPendingRewards(rp, nil); err != nil { + t.Error(err) + } else if pendingRewards <= 0 { + t.Errorf("Incorrect updated pending rewards amount %f", pendingRewards) + } + // Get & check initial node RPL balance if rplBalance, err := tokens.GetRPLBalance(rp, nodeAccount.Address, nil); err != nil { t.Error(err) From e5938313a3a1e4e0961d8d736d9305b5ae1b146c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 4 Apr 2022 03:20:06 -0400 Subject: [PATCH 447/878] Reverted to Geth v1.10.16 due to dependency conflicts --- go.mod | 2 +- go.sum | 69 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 1b8eda1c8..0f034ed27 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.17 + github.com/ethereum/go-ethereum v1.10.16 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index 3ab924405..2925fe017 100644 --- a/go.sum +++ b/go.sum @@ -20,9 +20,19 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -38,6 +48,7 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -70,10 +81,15 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs= -github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -104,15 +120,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= @@ -123,8 +136,6 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczC github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= @@ -137,8 +148,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.17 h1:XEcumY+qSr1cZQaWsQs5Kck3FHB0V2RiMHPdTBJ+oT8= -github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= +github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= +github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -199,8 +210,6 @@ github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -243,8 +252,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -284,8 +293,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 h1:+EYBkW+dbi3F/atB+LSQZSWh7+HNrV3A/N0y6DSoy9k= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= +github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -307,10 +316,12 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -327,6 +338,7 @@ github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -361,6 +373,8 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -400,7 +414,6 @@ github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjU github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -412,10 +425,12 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= @@ -557,6 +572,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -630,14 +646,12 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -651,6 +665,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -713,9 +728,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -841,9 +855,8 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 47b9c2b8f455eb69203d98f983c1a5400177e1a5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 7 Apr 2022 02:19:32 -0400 Subject: [PATCH 448/878] Added GetRewardNetwork and GetPendingRPLRewards --- node/node.go | 13 +++++++++++++ rewards/rewards.go | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/node/node.go b/node/node.go index 3d3eac142..81918e848 100644 --- a/node/node.go +++ b/node/node.go @@ -314,6 +314,19 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt return hash, nil } +// Get the network ID for a node's rewards +func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + rewardNetwork := new(*big.Int) + if err := rocketNodeManager.Call(opts, rewardNetwork, "getRewardNetwork", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s reward network: %w", nodeAddress.Hex(), err) + } + return (*rewardNetwork).Uint64(), nil +} + // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { // Get contracts diff --git a/rewards/rewards.go b/rewards/rewards.go index 4bbadab8b..3596b23f3 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -144,18 +144,57 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. } // Get the amount of RPL rewards that will be provided to node operators -func GetPendingRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { +func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return 0, err } rewards := new(*big.Int) - if err := rocketRewardsPool.Call(opts, rewards, "getPendingRewards"); err != nil { + if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { return 0, fmt.Errorf("Could not get pending rewards: %w", err) } return eth.WeiToEth(*rewards), nil } +// Get the percent of checkpoint rewards that goes to node operators +func GetNodeOperatorRewardsPercentRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the percent of checkpoint rewards that goes to ODAO members +func GetTrustedNodeOperatorRewardsPercentRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the amount of RPL rewards that will be provided to node operators +func GetPendingRPLRewardsRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rewards := new(*big.Int) + if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { + return nil, fmt.Errorf("Could not get pending rewards: %w", err) + } + return *rewards, nil +} + // Get contracts var rocketRewardsPoolLock sync.Mutex From 20c4dad1bbdf303597f60249feac00987234d0b1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 4 Apr 2022 03:20:06 -0400 Subject: [PATCH 449/878] Reverted to Geth v1.10.16 due to dependency conflicts --- go.mod | 2 +- go.sum | 69 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 1b8eda1c8..0f034ed27 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.17 + github.com/ethereum/go-ethereum v1.10.16 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 diff --git a/go.sum b/go.sum index 3ab924405..2925fe017 100644 --- a/go.sum +++ b/go.sum @@ -20,9 +20,19 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -38,6 +48,7 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -70,10 +81,15 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs= -github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -104,15 +120,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= @@ -123,8 +136,6 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczC github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= @@ -137,8 +148,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.17 h1:XEcumY+qSr1cZQaWsQs5Kck3FHB0V2RiMHPdTBJ+oT8= -github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= +github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= +github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -199,8 +210,6 @@ github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -243,8 +252,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -284,8 +293,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 h1:+EYBkW+dbi3F/atB+LSQZSWh7+HNrV3A/N0y6DSoy9k= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= +github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -307,10 +316,12 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -327,6 +338,7 @@ github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -361,6 +373,8 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -400,7 +414,6 @@ github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjU github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -412,10 +425,12 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= @@ -557,6 +572,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -630,14 +646,12 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -651,6 +665,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -713,9 +728,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -841,9 +855,8 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 7cb45fb2a2dc096aaffea78c54a9b200f6aa97be Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 7 Apr 2022 02:26:33 -0400 Subject: [PATCH 450/878] Added GetNodeManagerVersion --- node/node.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/node/node.go b/node/node.go index 3d3eac142..be9e83e21 100644 --- a/node/node.go +++ b/node/node.go @@ -54,6 +54,19 @@ type TrustedNodeParticipation struct { Participation map[common.Address][]bool } +// Get the version of the Node Manager contract +func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint8, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + version := new(uint8) + if err := rocketNodeManager.Call(opts, version, "version"); err != nil { + return 0, fmt.Errorf("Could not get node manager version: %w", err) + } + return *version, nil +} + // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { From d7b1c65d08e48a888357fb9f64a351f5901fc222 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 11 Apr 2022 01:30:42 -0400 Subject: [PATCH 451/878] Added legacy folder, updated minipool address generation --- legacy/v1.0.0/minipool/minipool.go | 548 ++++++++++++++++++++++ legacy/v1.0.0/utils/address_generation.go | 70 +++ minipool/factory.go | 32 ++ minipool/minipool.go | 13 - utils/address_generation.go | 14 +- 5 files changed, 657 insertions(+), 20 deletions(-) create mode 100644 legacy/v1.0.0/minipool/minipool.go create mode 100644 legacy/v1.0.0/utils/address_generation.go create mode 100644 minipool/factory.go diff --git a/legacy/v1.0.0/minipool/minipool.go b/legacy/v1.0.0/minipool/minipool.go new file mode 100644 index 000000000..aceca5d5e --- /dev/null +++ b/legacy/v1.0.0/minipool/minipool.go @@ -0,0 +1,548 @@ +package minipool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// Settings +const ( + MinipoolPrelaunchBatchSize = 250 + MinipoolAddressBatchSize = 50 + MinipoolDetailsBatchSize = 20 +) + +// Minipool details +type MinipoolDetails struct { + Address common.Address `json:"address"` + Exists bool `json:"exists"` + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` +} + +// The counts of minipools per status +type MinipoolCountsPerStatus struct { + Initialized *big.Int `abi:"initialisedCount"` + Prelaunch *big.Int `abi:"prelaunchCount"` + Staking *big.Int `abi:"stakingCount"` + Withdrawable *big.Int `abi:"withdrawableCount"` + Dissolved *big.Int `abi:"dissolvedCount"` +} + +// Get all minipool details +func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetMinipoolAddresses(rp, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts) +} + +// Get a node's minipool details +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) + if err != nil { + return []MinipoolDetails{}, err + } + return loadMinipoolDetails(rp, minipoolAddresses, opts) +} + +// Load minipool details +func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { + + // Load minipool details in batches + details := make([]MinipoolDetails, len(minipoolAddresses)) + for bsi := 0; bsi < len(minipoolAddresses); bsi += MinipoolDetailsBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolDetailsBatchSize + if mei > len(minipoolAddresses) { + mei = len(minipoolAddresses) + } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress := minipoolAddresses[mi] + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) + if err == nil { + details[mi] = minipoolDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []MinipoolDetails{}, err + } + + } + + // Return + return details, nil + +} + +// Get all minipool addresses +func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + // Get minipool count + minipoolCount, err := GetMinipoolCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load minipool addresses in batches + addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMinipoolAt(rp, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil + +} + +// Get the addresses of all minipools in prelaunch status +func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []common.Address{}, err + } + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return []common.Address{}, err + } + + totalMinipools := int64(totalMinipoolsUint) + addresses := []common.Address{} + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of addresses + offset := big.NewInt(i) + newAddresses := new([]common.Address) + if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { + return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + } + addresses = append(addresses, *newAddresses...) + } + + return addresses, nil +} + +// Get a node's minipool addresses +func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { + + // Get minipool count + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []common.Address{}, err + } + + // Load minipool addresses in batches + addresses := make([]common.Address, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil + +} + +// Get a node's validating minipool pubkeys +func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) { + + // Get minipool count + minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + // Load pubkeys in batches + var lock = sync.RWMutex{} + pubkeys := make([]rptypes.ValidatorPubkey, minipoolCount) + for bsi := uint64(0); bsi < minipoolCount; bsi += MinipoolAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MinipoolAddressBatchSize + if mei > minipoolCount { + mei = minipoolCount + } + + // Load pubkeys + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) + if err != nil { + return err + } + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) + if err != nil { + return err + } + lock.Lock() + pubkeys[mi] = pubkey + lock.Unlock() + return nil + }) + } + if err := wg.Wait(); err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + } + + // Return + return pubkeys, nil + +} + +// Get a minipool's details +func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (MinipoolDetails, error) { + + // Data + var wg errgroup.Group + var exists bool + var pubkey rptypes.ValidatorPubkey + + // Load data + wg.Go(func() error { + var err error + exists, err = GetMinipoolExists(rp, minipoolAddress, opts) + return err + }) + wg.Go(func() error { + var err error + pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return MinipoolDetails{}, err + } + + // Return + return MinipoolDetails{ + Address: minipoolAddress, + Exists: exists, + Pubkey: pubkey, + }, nil + +} + +// Get the minipool count +func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get the number of finalised minipools in the network +func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get the number of active minipools in the network +func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get the minipool count by status +func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + + // Get the total number of minipools + totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + if err != nil { + return MinipoolCountsPerStatus{}, err + } + + totalMinipools := int64(totalMinipoolsUint) + minipoolCounts := MinipoolCountsPerStatus{ + Initialized: big.NewInt(0), + Prelaunch: big.NewInt(0), + Staking: big.NewInt(0), + Dissolved: big.NewInt(0), + Withdrawable: big.NewInt(0), + } + limit := big.NewInt(MinipoolPrelaunchBatchSize) + for i := int64(0); i < totalMinipools; i += MinipoolPrelaunchBatchSize { + // Get a batch of counts + offset := big.NewInt(i) + newMinipoolCounts := new(MinipoolCountsPerStatus) + if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { + return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + } + if newMinipoolCounts != nil { + if newMinipoolCounts.Initialized != nil { + minipoolCounts.Initialized.Add(minipoolCounts.Initialized, newMinipoolCounts.Initialized) + } + if newMinipoolCounts.Prelaunch != nil { + minipoolCounts.Prelaunch.Add(minipoolCounts.Prelaunch, newMinipoolCounts.Prelaunch) + } + if newMinipoolCounts.Staking != nil { + minipoolCounts.Staking.Add(minipoolCounts.Staking, newMinipoolCounts.Staking) + } + if newMinipoolCounts.Dissolved != nil { + minipoolCounts.Dissolved.Add(minipoolCounts.Dissolved, newMinipoolCounts.Dissolved) + } + if newMinipoolCounts.Withdrawable != nil { + minipoolCounts.Withdrawable.Add(minipoolCounts.Withdrawable, newMinipoolCounts.Withdrawable) + } + } + } + return minipoolCounts, nil +} + +// Get a minipool address by index +func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + } + return *minipoolAddress, nil +} + +// Get a node's minipool count +func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get the number of minipools owned by a node that are not finalised +func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get the number of minipools owned by a node that are finalised +func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get a node's minipool address by index +func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil +} + +// Get a node's validating minipool count +func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) + } + return (*minipoolCount).Uint64(), nil +} + +// Get a node's validating minipool address by index +func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) + } + return *minipoolAddress, nil +} + +// Get a minipool address by validator pubkey +func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { + return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) + } + return *minipoolAddress, nil +} + +// Check whether a minipool exists +func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) + } + return *exists, nil +} + +// Get a minipool's validator pubkey +func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (rptypes.ValidatorPubkey, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return rptypes.ValidatorPubkey{}, err + } + pubkey := new(rptypes.ValidatorPubkey) + if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { + return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) + } + return *pubkey, nil +} + +// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits +func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return []byte{}, err + } + bytecode := new([]byte) + if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + } + return *bytecode, nil +} + +// Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool +func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Hash{}, err + } + withdrawalCredentials := new(common.Hash) + if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { + return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) + } + return *withdrawalCredentials, nil +} + +// Get contracts +var rocketMinipoolManagerLock sync.Mutex + +func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") +} diff --git a/legacy/v1.0.0/utils/address_generation.go b/legacy/v1.0.0/utils/address_generation.go new file mode 100644 index 000000000..9d929dc49 --- /dev/null +++ b/legacy/v1.0.0/utils/address_generation.go @@ -0,0 +1,70 @@ +package utils + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/legacy/v1.0.0/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// Combine a node's address and a salt to retreive a new salt compatible with depositing +func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { + // Create a new salt by hashing the original and the node address + saltBytes := [32]byte{} + salt.FillBytes(saltBytes[:]) + saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) + return saltHash +} + +// Precompute the address of a minipool based on the node wallet, deposit type, and unique salt +// If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { + + // Get dependencies + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + minipoolAbi, err := rp.GetABI("rocketMinipool") + if err != nil { + return common.Address{}, err + } + + if len(minipoolBytecode) == 0 { + minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + if err != nil { + return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) + } + } + + // Create the hash of the minipool constructor call + depositTypeBytes := [32]byte{} + depositTypeBytes[0] = byte(depositType) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) + if err != nil { + return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) + } + + // Get the node salt and initialization data + nodeSalt := GetNodeSalt(nodeAddress, salt) + initData := append(minipoolBytecode, packedConstructorArgs...) + initHash := crypto.Keccak256(initData) + + address := crypto.CreateAddress2(*rocketMinipoolManager.Address, nodeSalt, initHash) + return address, nil + +} + +// Get contracts +var rocketMinipoolManagerLock sync.Mutex + +func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolManagerLock.Lock() + defer rocketMinipoolManagerLock.Unlock() + return rp.GetContract("rocketMinipoolManager") +} diff --git a/minipool/factory.go b/minipool/factory.go new file mode 100644 index 000000000..d29bf3a70 --- /dev/null +++ b/minipool/factory.go @@ -0,0 +1,32 @@ +package minipool + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits +func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { + rocketMinipoolFactory, err := getRocketMinipooFactory(rp) + if err != nil { + return []byte{}, err + } + bytecode := new([]byte) + if err := rocketMinipoolFactory.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + } + return *bytecode, nil +} + +// Get contracts +var rocketMinipoolFactoryLock sync.Mutex + +func getRocketMinipooFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolFactoryLock.Lock() + defer rocketMinipoolFactoryLock.Unlock() + return rp.GetContract("rocketMinipoolFactory") +} diff --git a/minipool/minipool.go b/minipool/minipool.go index aceca5d5e..a266df4e9 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -512,19 +512,6 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address return *pubkey, nil } -// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits -func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) - if err != nil { - return []byte{}, err - } - bytecode := new([]byte) - if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) - } - return *bytecode, nil -} - // Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp) diff --git a/utils/address_generation.go b/utils/address_generation.go index 7145f7c35..94ec9edad 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -26,7 +26,7 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { // Get dependencies - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp) if err != nil { return common.Address{}, err } @@ -55,16 +55,16 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo initData := append(minipoolBytecode, packedConstructorArgs...) initHash := crypto.Keccak256(initData) - address := crypto.CreateAddress2(*rocketMinipoolManager.Address, nodeSalt, initHash) + address := crypto.CreateAddress2(*rocketMinipoolFactory.Address, nodeSalt, initHash) return address, nil } // Get contracts -var rocketMinipoolManagerLock sync.Mutex +var rocketMinipoolFactoryLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketMinipoolManagerLock.Lock() - defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") +func getRocketMinipoolFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketMinipoolFactoryLock.Lock() + defer rocketMinipoolFactoryLock.Unlock() + return rp.GetContract("rocketMinipoolFactory") } From f291a10d4ed5a2acfc77f2996731bd833b494c1b Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 12 Apr 2022 13:45:43 +1000 Subject: [PATCH 452/878] Add penalty submission function --- network/penalties.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 network/penalties.go diff --git a/network/penalties.go b/network/penalties.go new file mode 100644 index 000000000..a0233aa6d --- /dev/null +++ b/network/penalties.go @@ -0,0 +1,42 @@ +package network + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Estimate the gas of SubmitPenalty +func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, block uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkPenalties, err := getRocketNetworkPenalties(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkPenalties.GetTransactionGasInfo(opts, "submitPenalty", minipoolAddress, block) +} + +// Submit penalty for given minipool +func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, block uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkPrices, err := getRocketNetworkPenalties(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNetworkPrices.Transact(opts, "submitPenalty", minipoolAddress, block) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit penalty: %w", err) + } + return hash, nil +} + +// Get contracts +var rocketNetworkPenaltiesLock sync.Mutex + +func getRocketNetworkPenalties(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketNetworkPenaltiesLock.Lock() + defer rocketNetworkPenaltiesLock.Unlock() + return rp.GetContract("rocketNetworkPenalties") +} From 718517784ad59d87b52c7bb1b66d5d971d4a00c6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Apr 2022 02:00:50 -0400 Subject: [PATCH 453/878] Added fee distributor support --- node/distributor.go | 47 ++++++++++++++++++++++++++++++++++++++++++++ node/node.go | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/node/distributor.go b/node/distributor.go index ce1a9e5aa..9b9ae80b2 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -10,6 +10,30 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Distributor contract +type Distributor struct { + Address common.Address + Contract *rocketpool.Contract + RocketPool *rocketpool.RocketPool +} + +// Create new distributor contract +func NewDistributor(rp *rocketpool.RocketPool, address common.Address) (*Distributor, error) { + + // Get contract + contract, err := getDistributorContract(rp, address) + if err != nil { + return nil, err + } + + // Create and return + return &Distributor{ + Address: address, + Contract: contract, + RocketPool: rp, + }, nil +} + // Gets the deterministic address for a node's reward distributor contract func GetDistributorAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { rocketNodeDistributorFactory, err := getRocketNodeDistributorFactory(rp) @@ -23,6 +47,20 @@ func GetDistributorAddress(rp *rocketpool.RocketPool, nodeAddress common.Address return address, nil } +// Estimate the gas of a distribute +func (d *Distributor) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return d.Contract.GetTransactionGasInfo(opts, "distribute") +} + +// Distribute the contract's balance to the rETH contract and the user +func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { + hash, err := d.Contract.Transact(opts, "distribute") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not distribute fee distributor balance: %w", err) + } + return hash, nil +} + // Get contracts var rocketNodeDistributorFactoryLock sync.Mutex @@ -31,3 +69,12 @@ func getRocketNodeDistributorFactory(rp *rocketpool.RocketPool) (*rocketpool.Con defer rocketNodeDistributorFactoryLock.Unlock() return rp.GetContract("rocketNodeDistributorFactory") } + +// Get a distributor contract +var rocketDistributorLock sync.Mutex + +func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address) (*rocketpool.Contract, error) { + rocketDistributorLock.Lock() + defer rocketDistributorLock.Unlock() + return rp.MakeContract("rocketNodeDistributor", distributorAddress) +} diff --git a/node/node.go b/node/node.go index 54e0c432f..562e2e6a6 100644 --- a/node/node.go +++ b/node/node.go @@ -340,6 +340,54 @@ func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return (*rewardNetwork).Uint64(), nil } +// Check if a node's fee distributor has been initialized yet +func GetFeeDistributorInitialized(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return false, err + } + isInitialized := new(bool) + if err := rocketNodeManager.Call(opts, isInitialized, "getFeeDistributorInitialised", nodeAddress); err != nil { + return false, fmt.Errorf("Could not check if node %s's fee distributor is initialized: %w", nodeAddress.Hex(), err) + } + return *isInitialized, nil +} + +// Estimate the gas for creating the fee distributor contract for a node +func EstimateInitializeFeeDistributorGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "initialiseFeeDistributor") +} + +// Create the fee distributor contract for a node +func InitializeFeeDistributor(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNodeManager.Transact(opts, "initialiseFeeDistributor") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not initialize fee distributor: %w", err) + } + return hash, nil +} + +// Get a node's average minipool fee +func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (float64, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + avgFee := new(*big.Int) + if err := rocketNodeManager.Call(opts, avgFee, "getAverageNodeFee", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node %s average fee: %w", nodeAddress.Hex(), err) + } + return eth.WeiToEth(*avgFee), nil +} + // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { // Get contracts From ab3d5c4c67d51db427f5afbdeb31f4d1be74fae1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 12 Apr 2022 02:39:15 -0400 Subject: [PATCH 454/878] Temp changed the distributor contract ABI name --- node/distributor.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/node/distributor.go b/node/distributor.go index 9b9ae80b2..e05a027ce 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -76,5 +76,7 @@ var rocketDistributorLock sync.Mutex func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address) (*rocketpool.Contract, error) { rocketDistributorLock.Lock() defer rocketDistributorLock.Unlock() - return rp.MakeContract("rocketNodeDistributor", distributorAddress) + // TODO: REPLACE THIS ONCE THE CONTRACT ABI IS MERGED + // return rp.MakeContract("rocketNodeDistributor", distributorAddress) + return rp.MakeContract("rocketNodeDistributorDelegate", distributorAddress) } From 81daa6553ec3e1a951297a93030a8f5cc002516e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 15 Apr 2022 04:03:41 -0400 Subject: [PATCH 455/878] Updated with latest v1.1 contract revision --- {rewards => legacy/v1.0.0/rewards}/node.go | 0 legacy/v1.0.0/rewards/rewards.go | 153 ++++++++++++++++++ .../v1.0.0/rewards}/trusted-node.go | 0 node/distributor.go | 4 +- node/node.go | 13 ++ rewards/cumulative.go | 103 ++++++++++++ rewards/distributor-mainnet.go | 90 +++++++++++ rewards/rewards.go | 150 +++++------------ utils/eth/logs.go | 2 +- 9 files changed, 404 insertions(+), 111 deletions(-) rename {rewards => legacy/v1.0.0/rewards}/node.go (100%) create mode 100644 legacy/v1.0.0/rewards/rewards.go rename {rewards => legacy/v1.0.0/rewards}/trusted-node.go (100%) create mode 100644 rewards/cumulative.go create mode 100644 rewards/distributor-mainnet.go diff --git a/rewards/node.go b/legacy/v1.0.0/rewards/node.go similarity index 100% rename from rewards/node.go rename to legacy/v1.0.0/rewards/node.go diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go new file mode 100644 index 000000000..3d75d0d7d --- /dev/null +++ b/legacy/v1.0.0/rewards/rewards.go @@ -0,0 +1,153 @@ +package rewards + +import ( + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Get whether a claims contract is enabled +func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { + enabled := new(bool) + if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { + return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) + } + return *enabled, nil +} + +// Get whether a claimer can make a claim +// Use to check whether a claimer is able to make claims at all +func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { + claimPossible := new(bool) + if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { + return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimPossible, nil +} + +// Get the percentage of rewards available to a claimer +func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { + claimRewardsPerc := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { + return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return eth.WeiToEth(*claimRewardsPerc), nil +} + +// Get the total amount of rewards available to a claimer +// Use to check whether a claimer is able to make a claim for the current interval (returns zero if unable) +func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + claimRewardsAmount := new(*big.Int) + if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { + return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) + } + return *claimRewardsAmount, nil +} + +// Get the time that the user registered as a claimer +func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return time.Time{}, err + } + claimTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { + return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) + } + return time.Unix((*claimTime).Int64(), 0), nil +} + +// Get the total amount claimed in the current interval by the given claiming contract +func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + totalClaimed := new(*big.Int) + if err := rocketRewardsPool.Call(opts, totalClaimed, "getClaimingContractTotalClaimed", claimsContract); err != nil { + return nil, fmt.Errorf("Could not get total claimed for %s: %w", claimsContract, err) + } + return *totalClaimed, nil +} + +// Estimate the gas of claim +func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return claimsContract.GetTransactionGasInfo(opts, "claim") +} + +// Claim rewards +func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { + hash, err := claimsContract.Transact(opts, "claim") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) + } + return hash, nil +} + +// Get the timestamp that the current rewards interval started +func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return time.Time{}, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { + return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + } + return time.Unix(int64((*unixTime).Uint64()), 0), nil +} + +// Get the number of seconds in a claim interval +func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { + return 0, fmt.Errorf("Could not get claim interval time: %w", err) + } + return time.Duration((*unixTime).Int64()) * time.Second, nil +} + +// Get the percent of checkpoint rewards that goes to node operators +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil +} + +// Get the percent of checkpoint rewards that goes to ODAO members +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + } + return eth.WeiToEth(*perc), nil +} + +// Get contracts +var rocketRewardsPoolLock sync.Mutex + +func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketRewardsPoolLock.Lock() + defer rocketRewardsPoolLock.Unlock() + return rp.GetContract("rocketRewardsPool") +} diff --git a/rewards/trusted-node.go b/legacy/v1.0.0/rewards/trusted-node.go similarity index 100% rename from rewards/trusted-node.go rename to legacy/v1.0.0/rewards/trusted-node.go diff --git a/node/distributor.go b/node/distributor.go index e05a027ce..9b9ae80b2 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -76,7 +76,5 @@ var rocketDistributorLock sync.Mutex func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address) (*rocketpool.Contract, error) { rocketDistributorLock.Lock() defer rocketDistributorLock.Unlock() - // TODO: REPLACE THIS ONCE THE CONTRACT ABI IS MERGED - // return rp.MakeContract("rocketNodeDistributor", distributorAddress) - return rp.MakeContract("rocketNodeDistributorDelegate", distributorAddress) + return rp.MakeContract("rocketNodeDistributor", distributorAddress) } diff --git a/node/node.go b/node/node.go index 562e2e6a6..e56fad341 100644 --- a/node/node.go +++ b/node/node.go @@ -388,6 +388,19 @@ func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, op return eth.WeiToEth(*avgFee), nil } +// Get the time that the user registered as a claimer +func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return time.Time{}, err + } + claimTime := new(*big.Int) + if err := rocketNodeManager.Call(opts, claimTime, "getNodeRegistrationTime", address); err != nil { + return time.Time{}, fmt.Errorf("Could not get registration time for %s: %w", address.Hex(), err) + } + return time.Unix((*claimTime).Int64(), 0), nil +} + // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { // Get contracts diff --git a/rewards/cumulative.go b/rewards/cumulative.go new file mode 100644 index 000000000..202a214f1 --- /dev/null +++ b/rewards/cumulative.go @@ -0,0 +1,103 @@ +package rewards + +import ( + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Filters through token claim events and sums the total amount claimed by claimerAddress +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress *common.Address, legacyClaimNodeAddress *common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rocketClaimNode, err := getRocketClaimNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil +} + +// Filters through token claim events and sums the total amount claimed by claimerAddress +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress *common.Address, legacyClaimTrustedNodeAddress *common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketRewardsPool.Address} + // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return nil, err + } + + // Iterate over the logs and sum the amount + sum := big.NewInt(0) + for _, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + // Add the amount argument to our sum + amount := values["amount"].(*big.Int) + sum.Add(sum, amount) + } + // Return the result + return sum, nil +} + +// Get contracts +var rocketClaimNodeLock sync.Mutex +var rocketClaimTrustedNodeLock sync.Mutex + +func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketClaimNodeLock.Lock() + defer rocketClaimNodeLock.Unlock() + return rp.GetContract("rocketClaimNode") +} + +func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketClaimTrustedNodeLock.Lock() + defer rocketClaimTrustedNodeLock.Unlock() + return rp.GetContract("rocketClaimTrustedNode") +} diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go new file mode 100644 index 000000000..8b6f41f44 --- /dev/null +++ b/rewards/distributor-mainnet.go @@ -0,0 +1,90 @@ +package rewards + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Check if the given node has already claimed rewards for the given interval +func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return false, err + } + isClaimed := new(bool) + if err := rocketDistributorMainnet.Call(opts, isClaimed, "isClaimed", index, claimerAddress); err != nil { + return false, fmt.Errorf("Could not get rewards claim status for interval %s, node %s: %w", index.String(), claimerAddress.Hex(), err) + } + return *isClaimed, nil +} + +// Get the bitmap of intervals that the node has claimed so far +func ClaimedBitMap(rp *rocketpool.RocketPool, claimerAddress common.Address, bucket *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return nil, err + } + bitmap := new(*big.Int) + if err := rocketDistributorMainnet.Call(opts, bitmap, "claimedBitMap", claimerAddress, bucket); err != nil { + return nil, fmt.Errorf("Could not get claim bitmap for bucket %s, node %s: %w", bucket.String(), claimerAddress.Hex(), err) + } + return *bitmap, nil +} + +// Estimate claim rewards gas +func EstimateClaimGas(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claim", indices, amountRPL, amountETH, merkleProofs) +} + +// Claim rewards +func Claim(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (common.Hash, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDistributorMainnet.Transact(opts, "claim", indices, amountRPL, amountETH, merkleProofs) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) + } + return hash, nil +} + +// Estimate claim and restake rewards gas +func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claimAndStake", indices, amountRPL, amountETH, merkleProofs, stakeAmount) +} + +// Claim and restake rewards +func ClaimAndStake(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", indices, amountRPL, amountETH, merkleProofs, stakeAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) + } + return hash, nil +} + +// Get contracts +var rocketDistributorMainnetLock sync.Mutex + +func getRocketDistributorMainnet(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketDistributorMainnetLock.Lock() + defer rocketDistributorMainnetLock.Unlock() + return rp.GetContract("rocketMerkleDistributorMainnet") +} diff --git a/rewards/rewards.go b/rewards/rewards.go index 3596b23f3..9d1682130 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -8,87 +8,22 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Get whether a claims contract is enabled -func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { - enabled := new(bool) - if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { - return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) - } - return *enabled, nil -} - -// Get whether a claimer can make a claim -// Use to check whether a claimer is able to make claims at all -func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - claimPossible := new(bool) - if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { - return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return *claimPossible, nil -} - -// Get the percentage of rewards available to a claimer -func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - claimRewardsPerc := new(*big.Int) - if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { - return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return eth.WeiToEth(*claimRewardsPerc), nil -} - -// Get the total amount of rewards available to a claimer -// Use to check whether a claimer is able to make a claim for the current interval (returns zero if unable) -func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - claimRewardsAmount := new(*big.Int) - if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { - return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) - } - return *claimRewardsAmount, nil -} - -// Get the time that the user registered as a claimer -func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) - if err != nil { - return time.Time{}, err - } - claimTime := new(*big.Int) - if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) - } - return time.Unix((*claimTime).Int64(), 0), nil -} - -// Get the total amount claimed in the current interval by the given claiming contract -func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts) (*big.Int, error) { +// Get the index of the active rewards period +func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return nil, err } - totalClaimed := new(*big.Int) - if err := rocketRewardsPool.Call(opts, totalClaimed, "getClaimingContractTotalClaimed", claimsContract); err != nil { - return nil, fmt.Errorf("Could not get total claimed for %s: %w", claimsContract, err) + index := new(*big.Int) + if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { + return nil, fmt.Errorf("Could not get current reward index: %w", err) } - return *totalClaimed, nil -} - -// Estimate the gas of claim -func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return claimsContract.GetTransactionGasInfo(opts, "claim") -} - -// Claim rewards -func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := claimsContract.Transact(opts, "claim") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) - } - return hash, nil + return *index, nil } // Get the timestamp that the current rewards interval started @@ -118,81 +53,82 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. } // Get the percent of checkpoint rewards that goes to node operators -func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err + return nil, err } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) + return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) } - return eth.WeiToEth(*perc), nil + return *perc, nil } // Get the percent of checkpoint rewards that goes to ODAO members -func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err + return nil, err } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) } - return eth.WeiToEth(*perc), nil + return *perc, nil } // Get the amount of RPL rewards that will be provided to node operators -func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { +func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return 0, err + return nil, err } rewards := new(*big.Int) if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { - return 0, fmt.Errorf("Could not get pending rewards: %w", err) + return nil, fmt.Errorf("Could not get pending RPL rewards: %w", err) } - return eth.WeiToEth(*rewards), nil + return *rewards, nil } -// Get the percent of checkpoint rewards that goes to node operators -func GetNodeOperatorRewardsPercentRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// Get the amount of ETH rewards that will be provided to node operators +func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return nil, err } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) + rewards := new(*big.Int) + if err := rocketRewardsPool.Call(opts, rewards, "getPendingETHRewards"); err != nil { + return nil, fmt.Errorf("Could not get pending ETH rewards: %w", err) } - return *perc, nil + return *rewards, nil } -// Get the percent of checkpoint rewards that goes to ODAO members -func GetTrustedNodeOperatorRewardsPercentRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// Submit a Merkle Tree-based snapshot for a rewards interval +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot []byte, merkleTreeCID string, opts *bind.TransactOpts) (common.Hash, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return nil, err + return common.Hash{}, err } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } - return *perc, nil + return hash, nil } -// Get the amount of RPL rewards that will be provided to node operators -func GetPendingRPLRewardsRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) - if err != nil { - return nil, err +// Get the start block of the provided rewards interval +func GetStartBlockOfInterval(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (uint64, error) { + // 0 is a special case because the start time is based on the legacy rewards system + if index == 0 { + // Get the start time of the final legacy rewards interval + lastLegacyIntervalStartHash := crypto.Keccak256Hash([]byte("rewards.pool.claim.interval.time.last")) + rp.RocketStorage.GetUint(nil, lastLegacyIntervalStartHash) + } else { + // Find it based on the events } - rewards := new(*big.Int) - if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { - return nil, fmt.Errorf("Could not get pending rewards: %w", err) - } - return *rewards, nil + + return 0, nil } // Get contracts diff --git a/utils/eth/logs.go b/utils/eth/logs.go index a1f37e1e2..b66fa0f15 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -32,7 +32,7 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter if err != nil { return nil, err } - // Interate the logs and store every past contract address + // Iterate the logs and store every past contract address for _, log := range logs { addresses = append(addresses, common.HexToAddress(log.Topics[2].Hex())) } From 2d3201af01115e2938fbad4e3fd408f54578ee58 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 18 Apr 2022 21:28:31 -0400 Subject: [PATCH 456/878] Added more legacy rewards support --- rewards/cumulative.go | 63 ++++++++++++++++------------------ rewards/distributor-mainnet.go | 13 +++++++ 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/rewards/cumulative.go b/rewards/cumulative.go index 202a214f1..c28e577a8 100644 --- a/rewards/cumulative.go +++ b/rewards/cumulative.go @@ -1,9 +1,10 @@ package rewards import ( + "fmt" "math/big" - "sync" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -11,20 +12,25 @@ import ( ) // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress *common.Address, legacyClaimNodeAddress *common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) +func CalculateLegacyLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress common.Address, legacyRewardsPoolAbi string, legacyClaimNodeAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { + // Create RocketRewardsPool ABI + abi, err := rocketpool.DecodeAbi(legacyRewardsPoolAbi) if err != nil { - return nil, err + return nil, fmt.Errorf("error decoding legacy RocketRewardsPool ABI: %w", err) } - rocketClaimNode, err := getRocketClaimNode(rp) - if err != nil { - return nil, err + + // Create RocketRewardsPool contract + rocketRewardsPool := &rocketpool.Contract{ + Contract: bind.NewBoundContract(legacyRewardsPoolAddress, *abi, rp.Client, rp.Client, rp.Client), + Address: &legacyRewardsPoolAddress, + ABI: abi, + Client: rp.Client, } + // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketRewardsPool.Address} + addressFilter := []common.Address{legacyRewardsPoolAddress} // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {legacyClaimNodeAddress.Hash()}, {claimerAddress.Hash()}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) @@ -49,20 +55,25 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress *common.Address, legacyClaimTrustedNodeAddress *common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) +func CalculateLegacyLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress common.Address, legacyRewardsPoolAbi string, legacyClaimTrustedNodeAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { + // Create RocketRewardsPool ABI + abi, err := rocketpool.DecodeAbi(legacyRewardsPoolAbi) if err != nil { - return nil, err + return nil, fmt.Errorf("error decoding legacy RocketRewardsPool ABI: %w", err) } - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) - if err != nil { - return nil, err + + // Create RocketRewardsPool contract + rocketRewardsPool := &rocketpool.Contract{ + Contract: bind.NewBoundContract(legacyRewardsPoolAddress, *abi, rp.Client, rp.Client, rp.Client), + Address: &legacyRewardsPoolAddress, + ABI: abi, + Client: rp.Client, } + // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketRewardsPool.Address} // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {legacyClaimTrustedNodeAddress.Hash()}, {claimerAddress.Hash()}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) @@ -85,19 +96,3 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre // Return the result return sum, nil } - -// Get contracts -var rocketClaimNodeLock sync.Mutex -var rocketClaimTrustedNodeLock sync.Mutex - -func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketClaimNodeLock.Lock() - defer rocketClaimNodeLock.Unlock() - return rp.GetContract("rocketClaimNode") -} - -func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { - rocketClaimTrustedNodeLock.Lock() - defer rocketClaimTrustedNodeLock.Unlock() - return rp.GetContract("rocketClaimTrustedNode") -} diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index 8b6f41f44..3dc725a01 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -36,6 +36,19 @@ func ClaimedBitMap(rp *rocketpool.RocketPool, claimerAddress common.Address, buc return *bitmap, nil } +// Get the Merkle root for an interval +func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOpts) ([]byte, error) { + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + if err != nil { + return nil, err + } + bytes := new([32]byte) + if err := rocketDistributorMainnet.Call(opts, bytes, "merkleRoots", interval); err != nil { + return nil, fmt.Errorf("Could not get Merkle root for interval %s: %w", interval.String(), err) + } + return (*bytes)[:], nil +} + // Estimate claim rewards gas func EstimateClaimGas(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) From 28165de889f1eb81648cf9d669fac9bd021124ff Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Apr 2022 03:36:41 -0400 Subject: [PATCH 457/878] Added support for the rewards snapshot event --- .../{cumulative.go => legacy-functions.go} | 0 rewards/rewards.go | 70 ++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) rename rewards/{cumulative.go => legacy-functions.go} (100%) diff --git a/rewards/cumulative.go b/rewards/legacy-functions.go similarity index 100% rename from rewards/cumulative.go rename to rewards/legacy-functions.go diff --git a/rewards/rewards.go b/rewards/rewards.go index 9d1682130..32dbb5235 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -11,8 +11,20 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Info for a rewards snapshot event +type RewardsEvent struct { + Index *big.Int + Block *big.Int + RewardsPerNetworkRPL []*big.Int + RewardsPerNetworkETH []*big.Int + MerkleRoot []byte + MerkleTreeCID string + Time time.Time +} + // Get the index of the active rewards period func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) @@ -117,18 +129,56 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big. return hash, nil } -// Get the start block of the provided rewards interval -func GetStartBlockOfInterval(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (uint64, error) { - // 0 is a special case because the start time is based on the legacy rewards system - if index == 0 { - // Get the start time of the final legacy rewards interval - lastLegacyIntervalStartHash := crypto.Keccak256Hash([]byte("rewards.pool.claim.interval.time.last")) - rp.RocketStorage.GetUint(nil, lastLegacyIntervalStartHash) - } else { - // Find it based on the events +// Get the event info for a rewards snapshot +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int) (RewardsEvent, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return RewardsEvent{}, err + } + + // Construct a filter query for relevant logs + indexBig := big.NewInt(0).SetUint64(index) + indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) + addressFilter := []common.Address{*rocketRewardsPool.Address} + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {crypto.Keccak256Hash(indexBytes[:])}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return RewardsEvent{}, err + } + + // Get the log info + values := make(map[string]interface{}) + if len(logs) == 0 { + return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + } + if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + return RewardsEvent{}, err } - return 0, nil + // Get the decoded data + eventIndex := values["index"].(*big.Int) + eventBlock := values["block"].(*big.Int) + eventRpl := values["rewardsPerNetworkRPL"].([]*big.Int) + eventEth := values["rewardsPerNetworkETH"].([]*big.Int) + eventMerkleRoot := values["merkleRoot"].([]byte) + eventMerkleTreeCid := values["merkleTreeCID"].(string) + eventTime := values["time"].(*big.Int) + eventData := RewardsEvent{ + Index: eventIndex, + Block: eventBlock, + RewardsPerNetworkRPL: eventRpl, + RewardsPerNetworkETH: eventEth, + MerkleRoot: eventMerkleRoot, + MerkleTreeCID: eventMerkleTreeCid, + Time: time.Unix(eventTime.Int64(), 0), + } + + return eventData, nil + } // Get contracts From 3507e55c3c193c5bebd637010543f9e52c000f3d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 2 May 2022 04:26:57 -0400 Subject: [PATCH 458/878] Removed the EC proxy from the go lib --- rocketpool/contract.go | 3 +- rocketpool/ec-interface.go | 102 ++++++++++++++++++++++++ rocketpool/rocketpool.go | 5 +- tests/auction/main_test.go | 9 ++- tests/dao/main_test.go | 9 ++- tests/dao/trustednode/main_test.go | 9 ++- tests/deposit/main_test.go | 9 ++- tests/minipool/main_test.go | 9 ++- tests/network/main_test.go | 9 ++- tests/node/main_test.go | 10 ++- tests/rewards/main_test.go | 9 ++- tests/rocketpool/main_test.go | 9 ++- tests/settings/protocol/main_test.go | 9 ++- tests/settings/trustednode/main_test.go | 9 ++- tests/tokens/main_test.go | 6 +- tests/utils/eth/transactions_test.go | 7 +- utils/client/{proxy.go => proxy.go_old} | 0 utils/eth/transactions.go | 5 +- utils/wait.go | 4 +- 19 files changed, 183 insertions(+), 49 deletions(-) create mode 100644 rocketpool/ec-interface.go rename utils/client/{proxy.go => proxy.go_old} (100%) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 85fdbbdad..1d84442a7 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -13,7 +13,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/utils/client" ) // Transaction settings @@ -27,7 +26,7 @@ type Contract struct { Contract *bind.BoundContract Address *common.Address ABI *abi.ABI - Client *client.EthClientProxy + Client ExecutionClient } // Response for gas limits from network and from user request diff --git a/rocketpool/ec-interface.go b/rocketpool/ec-interface.go new file mode 100644 index 000000000..4f28628d7 --- /dev/null +++ b/rocketpool/ec-interface.go @@ -0,0 +1,102 @@ +package rocketpool + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// This is the common interface for execution clients. +type ExecutionClient interface { + + /// ======================== + /// ContractCaller Functions + /// ======================== + + // CodeAt returns the code of the given account. This is needed to differentiate + // between contract internal errors and the local chain being out of sync. + CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) + + // CallContract executes an Ethereum contract call with the specified data as the + // input. + CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) + + /// ============================ + /// ContractTransactor Functions + /// ============================ + + // HeaderByNumber returns a block header from the current canonical chain. If number is + // nil, the latest known header is returned. + HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) + + // PendingCodeAt returns the code of the given account in the pending state. + PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) + + // PendingNonceAt retrieves the current pending nonce associated with an account. + PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) + + // SuggestGasPrice retrieves the currently suggested gas price to allow a timely + // execution of a transaction. + SuggestGasPrice(ctx context.Context) (*big.Int, error) + + // SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow + // a timely execution of a transaction. + SuggestGasTipCap(ctx context.Context) (*big.Int, error) + + // EstimateGas tries to estimate the gas needed to execute a specific + // transaction based on the current pending state of the backend blockchain. + // There is no guarantee that this is the true gas limit requirement as other + // transactions may be added or removed by miners, but it should provide a basis + // for setting a reasonable default. + EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) + + // SendTransaction injects the transaction into the pending pool for execution. + SendTransaction(ctx context.Context, tx *types.Transaction) error + + /// ========================== + /// ContractFilterer Functions + /// ========================== + + // FilterLogs executes a log filter operation, blocking during execution and + // returning all the results in one batch. + // + // TODO(karalabe): Deprecate when the subscription one can return past data too. + FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) + + // SubscribeFilterLogs creates a background log filtering operation, returning + // a subscription immediately, which can be used to stream the found events. + SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) + + /// ======================= + /// DeployBackend Functions + /// ======================= + + // TransactionReceipt returns the receipt of a transaction by transaction hash. + // Note that the receipt is not available for pending transactions. + TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) + + /// ================ + /// Client functions + /// ================ + + // BlockNumber returns the most recent block number + BlockNumber(ctx context.Context) (uint64, error) + + // BalanceAt returns the wei balance of the given account. + // The block number can be nil, in which case the balance is taken from the latest known block. + BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + + // TransactionByHash returns the transaction with the given hash. + TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) + + // NonceAt returns the account nonce of the given account. + // The block number can be nil, in which case the nonce is taken from the latest known block. + NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) + + // SyncProgress retrieves the current progress of the sync algorithm. If there's + // no sync currently running, it returns nil. + SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) +} diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 55f43979e..b07c7bfac 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -13,7 +13,6 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/contracts" - "github.com/rocket-pool/rocketpool-go/utils/client" ) // Cache settings @@ -35,7 +34,7 @@ type cachedContract struct { // Rocket Pool contract manager type RocketPool struct { - Client *client.EthClientProxy + Client ExecutionClient RocketStorage *contracts.RocketStorage RocketStorageContract *Contract addresses map[string]cachedAddress @@ -47,7 +46,7 @@ type RocketPool struct { } // Create new contract manager -func NewRocketPool(client *client.EthClientProxy, rocketStorageAddress common.Address) (*RocketPool, error) { +func NewRocketPool(client ExecutionClient, rocketStorageAddress common.Address) (*RocketPool, error) { // Initialize RocketStorage contract rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) diff --git a/tests/auction/main_test.go b/tests/auction/main_test.go index d7bdab1d3..4b0e624b5 100644 --- a/tests/auction/main_test.go +++ b/tests/auction/main_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -16,7 +16,7 @@ import ( ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -31,7 +31,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/main_test.go b/tests/dao/main_test.go index fff24a9c9..4b8ec2495 100644 --- a/tests/dao/main_test.go +++ b/tests/dao/main_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" @@ -16,7 +16,7 @@ import ( ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -30,7 +30,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/dao/trustednode/main_test.go b/tests/dao/trustednode/main_test.go index 32c099de1..724154754 100644 --- a/tests/dao/trustednode/main_test.go +++ b/tests/dao/trustednode/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -30,7 +30,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/deposit/main_test.go b/tests/deposit/main_test.go index bd3960137..20dd37c8d 100644 --- a/tests/deposit/main_test.go +++ b/tests/deposit/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -27,7 +27,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/minipool/main_test.go b/tests/minipool/main_test.go index b5a1b1406..038ea510e 100644 --- a/tests/minipool/main_test.go +++ b/tests/minipool/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -29,7 +29,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/network/main_test.go b/tests/network/main_test.go index 10c58a737..854951708 100644 --- a/tests/network/main_test.go +++ b/tests/network/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -28,7 +28,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/node/main_test.go b/tests/node/main_test.go index b6c83ddd1..d12f5f1a7 100644 --- a/tests/node/main_test.go +++ b/tests/node/main_test.go @@ -6,16 +6,15 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" - "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -27,7 +26,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rewards/main_test.go b/tests/rewards/main_test.go index 20056b1e7..920876ef1 100644 --- a/tests/rewards/main_test.go +++ b/tests/rewards/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -27,7 +27,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/rocketpool/main_test.go b/tests/rocketpool/main_test.go index 5c42627dd..0c4da11e8 100644 --- a/tests/rocketpool/main_test.go +++ b/tests/rocketpool/main_test.go @@ -6,15 +6,15 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ) @@ -22,7 +22,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/protocol/main_test.go b/tests/settings/protocol/main_test.go index a107f9b8a..8d2ba8039 100644 --- a/tests/settings/protocol/main_test.go +++ b/tests/settings/protocol/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -25,7 +25,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/settings/trustednode/main_test.go b/tests/settings/trustednode/main_test.go index 7217a3603..1727002a9 100644 --- a/tests/settings/trustednode/main_test.go +++ b/tests/settings/trustednode/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -28,7 +28,10 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + log.Fatal(err) + } // Initialize contract manager rp, err = rocketpool.NewRocketPool(client, common.HexToAddress(tests.RocketStorageAddress)) diff --git a/tests/tokens/main_test.go b/tests/tokens/main_test.go index 551a4375b..54e00526d 100644 --- a/tests/tokens/main_test.go +++ b/tests/tokens/main_test.go @@ -6,16 +6,16 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/rocketpool" - uc "github.com/rocket-pool/rocketpool-go/utils/client" "github.com/rocket-pool/rocketpool-go/tests" "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" ) var ( - client *uc.EthClientProxy + client *ethclient.Client rp *rocketpool.RocketPool ownerAccount *accounts.Account @@ -29,7 +29,7 @@ func TestMain(m *testing.M) { var err error // Initialize eth client - client = uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err = ethclient.Dial(tests.Eth1ProviderAddress) if err != nil { log.Fatal(err) } diff --git a/tests/utils/eth/transactions_test.go b/tests/utils/eth/transactions_test.go index 23e6c4f46..1c99e6248 100644 --- a/tests/utils/eth/transactions_test.go +++ b/tests/utils/eth/transactions_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - uc "github.com/rocket-pool/rocketpool-go/utils/client" + "github.com/ethereum/go-ethereum/ethclient" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -29,7 +29,10 @@ func TestSendTransaction(t *testing.T) { }) // Initialize eth client - client := uc.NewEth1ClientProxy(0, tests.Eth1ProviderAddress) + client, err := ethclient.Dial(tests.Eth1ProviderAddress) + if err != nil { + t.Fatal(err) + } // Initialize accounts userAccount, err := accounts.GetAccount(9) diff --git a/utils/client/proxy.go b/utils/client/proxy.go_old similarity index 100% rename from utils/client/proxy.go rename to utils/client/proxy.go_old diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index 09a67ae1e..f74d80e7c 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -9,11 +9,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/client" ) // Estimate the gas of SendTransaction -func EstimateSendTransactionGas(client *client.EthClientProxy, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { // User-defined settings response := rocketpool.GasInfo{} @@ -41,7 +40,7 @@ func EstimateSendTransactionGas(client *client.EthClientProxy, toAddress common. } // Send a transaction to an address -func SendTransaction(client *client.EthClientProxy, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce diff --git a/utils/wait.go b/utils/wait.go index f3d50631b..2b32541eb 100644 --- a/utils/wait.go +++ b/utils/wait.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/utils/client" + "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Wait for a transaction to get mined -func WaitForTransaction(client *client.EthClientProxy, hash common.Hash) (*types.Receipt, error) { +func WaitForTransaction(client rocketpool.ExecutionClient, hash common.Hash) (*types.Receipt, error) { var tx *types.Transaction var err error From 1dc2f8f0a61283e1823e378d86ac4c2ed5c89306 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 4 May 2022 03:46:07 -0400 Subject: [PATCH 459/878] Removed the old EC proxy file --- utils/client/proxy.go_old | 359 -------------------------------------- 1 file changed, 359 deletions(-) delete mode 100644 utils/client/proxy.go_old diff --git a/utils/client/proxy.go_old b/utils/client/proxy.go_old deleted file mode 100644 index fd8445628..000000000 --- a/utils/client/proxy.go_old +++ /dev/null @@ -1,359 +0,0 @@ -package client - -import ( - "context" - "fmt" - "math/big" - "strings" - "time" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" -) - -// This type wraps multiple ETH clients, providing natural fallback support if one of them fails. -type EthClientProxy struct { - clientUrls []string - clients []*ethclient.Client - timeouts []time.Time - reconnectDelay time.Duration -} - -// This is a signature for a wrapped ethclient.Client function -type clientFunction func(*ethclient.Client) (interface{}, error) - -// Creates a new Eth1ClientProxy instance based on the main and backup client URLs -func NewEth1ClientProxy(reconnectDelay time.Duration, urls ...string) *EthClientProxy { - - clients := []*ethclient.Client{} - timeouts := []time.Time{} - - // Clamp the delay - if reconnectDelay < 0 { - reconnectDelay = 0 - } - - // Try connecting to each client, but ignore errors - they'll be handled at runtime - for _, url := range urls { - client, err := ethclient.Dial(url) - if err != nil { - timeouts = append(timeouts, time.Now()) - } else { - timeouts = append(timeouts, time.Time{}) - } - clients = append(clients, client) - } - - return &EthClientProxy{ - clientUrls: urls, - clients: clients, - timeouts: timeouts, - reconnectDelay: reconnectDelay, - } - -} - -/// ======================== -/// ContractCaller Functions -/// ======================== - -// CodeAt returns the code of the given account. This is needed to differentiate -// between contract internal errors and the local chain being out of sync. -func (p *EthClientProxy) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.CodeAt(ctx, contract, blockNumber) - }) - if err != nil { - return nil, err - } - return result.([]byte), err -} - -// CallContract executes an Ethereum contract call with the specified data as the -// input. -func (p *EthClientProxy) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.CallContract(ctx, call, blockNumber) - }) - if err != nil { - return nil, err - } - return result.([]byte), err -} - -/// ============================ -/// ContractTransactor Functions -/// ============================ - -// HeaderByNumber returns a block header from the current canonical chain. If number is -// nil, the latest known header is returned. -func (p *EthClientProxy) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.HeaderByNumber(ctx, number) - }) - if err != nil { - return nil, err - } - return result.(*types.Header), err -} - -// PendingCodeAt returns the code of the given account in the pending state. -func (p *EthClientProxy) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.PendingCodeAt(ctx, account) - }) - if err != nil { - return nil, err - } - return result.([]byte), err -} - -// PendingNonceAt retrieves the current pending nonce associated with an account. -func (p *EthClientProxy) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.PendingNonceAt(ctx, account) - }) - if err != nil { - return 0, err - } - return result.(uint64), err -} - -// SuggestGasPrice retrieves the currently suggested gas price to allow a timely -// execution of a transaction. -func (p *EthClientProxy) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SuggestGasPrice(ctx) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err -} - -// SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow -// a timely execution of a transaction. -func (p *EthClientProxy) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SuggestGasTipCap(ctx) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err -} - -// EstimateGas tries to estimate the gas needed to execute a specific -// transaction based on the current pending state of the backend blockchain. -// There is no guarantee that this is the true gas limit requirement as other -// transactions may be added or removed by miners, but it should provide a basis -// for setting a reasonable default. -func (p *EthClientProxy) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.EstimateGas(ctx, call) - }) - if err != nil { - return 0, err - } - return result.(uint64), err -} - -// SendTransaction injects the transaction into the pending pool for execution. -func (p *EthClientProxy) SendTransaction(ctx context.Context, tx *types.Transaction) error { - _, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return nil, client.SendTransaction(ctx, tx) - }) - return err -} - -/// ========================== -/// ContractFilterer Functions -/// ========================== - -// FilterLogs executes a log filter operation, blocking during execution and -// returning all the results in one batch. -// -// TODO(karalabe): Deprecate when the subscription one can return past data too. -func (p *EthClientProxy) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.FilterLogs(ctx, query) - }) - if err != nil { - return nil, err - } - return result.([]types.Log), err -} - -// SubscribeFilterLogs creates a background log filtering operation, returning -// a subscription immediately, which can be used to stream the found events. -func (p *EthClientProxy) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SubscribeFilterLogs(ctx, query, ch) - }) - if err != nil { - return nil, err - } - return result.(ethereum.Subscription), err -} - -/// ======================= -/// DeployBackend Functions -/// ======================= - -// TransactionReceipt returns the receipt of a transaction by transaction hash. -// Note that the receipt is not available for pending transactions. -func (p *EthClientProxy) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.TransactionReceipt(ctx, txHash) - }) - if err != nil { - return nil, err - } - return result.(*types.Receipt), err -} - -/// ================ -/// Client functions -/// ================ - -// BlockNumber returns the most recent block number -func (p *EthClientProxy) BlockNumber(ctx context.Context) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.BlockNumber(ctx) - }) - if err != nil { - return 0, err - } - return result.(uint64), err -} - -// BalanceAt returns the wei balance of the given account. -// The block number can be nil, in which case the balance is taken from the latest known block. -func (p *EthClientProxy) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.BalanceAt(ctx, account, blockNumber) - }) - if err != nil { - return nil, err - } - return result.(*big.Int), err -} - -// TransactionByHash returns the transaction with the given hash. -func (p *EthClientProxy) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - tx, isPending, err := client.TransactionByHash(ctx, hash) - result := []interface{}{tx, isPending} - return result, err - }) - if err != nil { - return nil, false, err - } - - // TODO: Can we just use the named return values inside the closer to skip this? - resultArray := result.([]interface{}) - tx = resultArray[0].(*types.Transaction) - isPending = resultArray[1].(bool) - return tx, isPending, err -} - -// NonceAt returns the account nonce of the given account. -// The block number can be nil, in which case the nonce is taken from the latest known block. -func (p *EthClientProxy) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.NonceAt(ctx, account, blockNumber) - }) - if err != nil { - return 0, err - } - return result.(uint64), err -} - -// SyncProgress retrieves the current progress of the sync algorithm. If there's -// no sync currently running, it returns nil. -func (p *EthClientProxy) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { - result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { - return client.SyncProgress(ctx) - }) - if err != nil { - return nil, err - } - return result.(*ethereum.SyncProgress), err -} - -/// ================== -/// Internal functions -/// ================== - -// Attempts to run a function progressively through each client until one succeeds or they all fail. -func (p *EthClientProxy) runFunction(function clientFunction) (interface{}, error) { - - // A cumulative error string as each client gets tried - errorString := "" - - for i := 0; i < len(p.clients); i++ { - client, clientErr := p.getClient(i) - if client != nil { - - // This client is available, try running the function - result, err := function(client) - if err != nil { - - // If it's disconnected, log it and try the next client - errorString += fmt.Sprintf("\nError with client %d: %s", i, err.Error()) - if isDisconnected(err) { - p.clients[i] = nil - p.timeouts[i] = time.Now() - - // If it's a different error, just return it - } else { - return nil, fmt.Errorf(errorString) - } - - // If there's no error, return the result - } else { - return result, nil - } - - // Note a client failure and try the next one - } else { - errorString += fmt.Sprintf("\nError with client %d: %s", i, clientErr.Error()) - } - } - - // If none of the clients worked, return the aggregated error string - errorString += "\nNone of the clients were available." - return nil, fmt.Errorf(errorString) - -} - -// Returns true if the error was a connection failure and a backup client is available -func isDisconnected(err error) bool { - return strings.Contains(err.Error(), "dial tcp") -} - -// Get the client at the given index, trying a reconnect if it's disconnected -func (p *EthClientProxy) getClient(index int) (*ethclient.Client, error) { - // Try connecting to the client if it's dead - var err error - if p.clients[index] == nil { - - // Check if enough time has passed - if time.Since(p.timeouts[index]) > p.reconnectDelay { - p.clients[index], err = ethclient.Dial(p.clientUrls[index]) - - // If the connection failed, reset the timer - if err != nil { - p.timeouts[index] = time.Now() - } - - } else { - err = fmt.Errorf("Connection failure, waiting %s to reconnect", p.reconnectDelay) - } - } - - // Return the client regardless of its state - return p.clients[index], err -} From 148729835f0235c4d1f2c8be105d984d4f63157f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 4 May 2022 22:38:53 -0400 Subject: [PATCH 460/878] Added smoothing pool registration functions --- legacy/v1.0.0/rewards/rewards.go | 2 +- node/node.go | 48 ++++++++++++++++++++++++++++++++ rewards/rewards.go | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index 3d75d0d7d..1e921595c 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -101,7 +101,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) } - return time.Unix(int64((*unixTime).Uint64()), 0), nil + return time.Unix((*unixTime).Int64(), 0), nil } // Get the number of seconds in a claim interval diff --git a/node/node.go b/node/node.go index e56fad341..bb31718aa 100644 --- a/node/node.go +++ b/node/node.go @@ -789,6 +789,54 @@ func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, interval return participationTable, nil } +// Get the smoothing pool opt-in status of a node +func GetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return false, err + } + state := new(bool) + if err := rocketNodeManager.Call(opts, state, "getSmoothingPoolRegistrationState", nodeAddress); err != nil { + return false, fmt.Errorf("Could not get node %s smoothing pool registration status: %w", nodeAddress.Hex(), err) + } + return *state, nil +} + +// Get the time of the previous smoothing pool opt-in / opt-out +func GetSmoothingPoolRegistrationChanged(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return time.Time{}, err + } + timestamp := new(*big.Int) + if err := rocketNodeManager.Call(opts, timestamp, "getSmoothingPoolRegistrationChanged", nodeAddress); err != nil { + return time.Time{}, fmt.Errorf("Could not get node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) + } + return time.Unix((*timestamp).Int64(), 0), nil +} + +// Estimate the gas for opting into / out of the smoothing pool +func EstimateSetSmoothingPoolRegistrationStateGas(rp *rocketpool.RocketPool, optIn bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "setSmoothingPoolRegistrationState", optIn) +} + +// Opt into / out of the smoothing pool +func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketNodeManager.Transact(opts, "setSmoothingPoolRegistrationState", optIn) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set smoothing pool registration state: %w", err) + } + return hash, nil +} + // Get contracts var rocketNodeManagerLock sync.Mutex diff --git a/rewards/rewards.go b/rewards/rewards.go index 32dbb5235..5accdeed3 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -48,7 +48,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) } - return time.Unix(int64((*unixTime).Uint64()), 0), nil + return time.Unix((*unixTime).Int64(), 0), nil } // Get the number of seconds in a claim interval From 91365204dcb5310ab03fc84ea94dcdfc6b8f2487 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 4 May 2022 22:41:58 -0400 Subject: [PATCH 461/878] Added address param to Claim and ClaimAndStake --- rewards/distributor-mainnet.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index 3dc725a01..cbdc86440 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -50,21 +50,21 @@ func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOp } // Estimate claim rewards gas -func EstimateClaimGas(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claim", indices, amountRPL, amountETH, merkleProofs) + return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs) } // Claim rewards -func Claim(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (common.Hash, error) { +func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (common.Hash, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketDistributorMainnet.Transact(opts, "claim", indices, amountRPL, amountETH, merkleProofs) + hash, err := rocketDistributorMainnet.Transact(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs) if err != nil { return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) } @@ -72,21 +72,21 @@ func Claim(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, } // Estimate claim and restake rewards gas -func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claimAndStake", indices, amountRPL, amountETH, merkleProofs, stakeAmount) + return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount) } // Claim and restake rewards -func ClaimAndStake(rp *rocketpool.RocketPool, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", indices, amountRPL, amountETH, merkleProofs, stakeAmount) + hash, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount) if err != nil { return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) } From 29a6cbc6aef03411473b079a538680b8c575b792 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 4 May 2022 22:44:55 -0400 Subject: [PATCH 462/878] Reward submission events now have start/end times --- rewards/rewards.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 5accdeed3..4b820a2d1 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -22,7 +22,8 @@ type RewardsEvent struct { RewardsPerNetworkETH []*big.Int MerkleRoot []byte MerkleTreeCID string - Time time.Time + IntervalStartTime time.Time + IntervalEndTime time.Time } // Get the index of the active rewards period @@ -166,7 +167,8 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz eventEth := values["rewardsPerNetworkETH"].([]*big.Int) eventMerkleRoot := values["merkleRoot"].([]byte) eventMerkleTreeCid := values["merkleTreeCID"].(string) - eventTime := values["time"].(*big.Int) + eventIntervalStartTime := values["intervalStartTime"].(*big.Int) + eventIntervalEndTime := values["intervalEndTime"].(*big.Int) eventData := RewardsEvent{ Index: eventIndex, Block: eventBlock, @@ -174,7 +176,8 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz RewardsPerNetworkETH: eventEth, MerkleRoot: eventMerkleRoot, MerkleTreeCID: eventMerkleTreeCid, - Time: time.Unix(eventTime.Int64(), 0), + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), } return eventData, nil From 1e1172590c45bcda6f0b24a78ffe275bba1176c2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 5 May 2022 03:06:04 -0400 Subject: [PATCH 463/878] Added EstimateSubmitRewardSnapshotGas --- rewards/rewards.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 4b820a2d1..dd3981dc2 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -117,13 +117,22 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. return *rewards, nil } +// Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot []byte, merkleTreeCID string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) +} + // Submit a Merkle Tree-based snapshot for a rewards interval func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot []byte, merkleTreeCID string, opts *bind.TransactOpts) (common.Hash, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) + hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } From 46820301cba98e020caa211e1e131272bb33bf03 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 5 May 2022 22:41:19 -0400 Subject: [PATCH 464/878] Changed merkleRoot to a keccak hash for solidity compatibility --- rewards/rewards.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index dd3981dc2..447df8d96 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -118,7 +118,7 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval -func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot []byte, merkleTreeCID string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return rocketpool.GasInfo{}, err @@ -127,7 +127,7 @@ func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, } // Submit a Merkle Tree-based snapshot for a rewards interval -func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot []byte, merkleTreeCID string, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, opts *bind.TransactOpts) (common.Hash, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return common.Hash{}, err From be1655b6e1afa9778dcdd8fb1a7a7d2611d51b4e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 6 May 2022 03:40:35 -0400 Subject: [PATCH 465/878] Claim functions now use common.Hash for the Merkle proofs --- rewards/distributor-mainnet.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index cbdc86440..7850d4a40 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -50,7 +50,7 @@ func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOp } // Estimate claim rewards gas -func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return rocketpool.GasInfo{}, err @@ -59,7 +59,7 @@ func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices } // Claim rewards -func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, opts *bind.TransactOpts) (common.Hash, error) { +func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, opts *bind.TransactOpts) (common.Hash, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return common.Hash{}, err @@ -72,7 +72,7 @@ func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int } // Estimate claim and restake rewards gas -func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return rocketpool.GasInfo{}, err @@ -81,7 +81,7 @@ func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, } // Claim and restake rewards -func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][][]byte, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) if err != nil { return common.Hash{}, err From 8369460f4220ae69fbd25cecf97e07e341808d0d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 9 May 2022 02:15:45 -0400 Subject: [PATCH 466/878] Added intervalsPassed to SubmitRewardSnapshot --- rewards/rewards.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 447df8d96..2cc9dba40 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -118,21 +118,21 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval -func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, intervalsPassed *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) + return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID, intervalsPassed) } // Submit a Merkle Tree-based snapshot for a rewards interval -func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, intervalsPassed *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID) + hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID, intervalsPassed) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } From 091a2c9ab75550308671672c049962d7a302e581 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 9 May 2022 03:01:12 -0400 Subject: [PATCH 467/878] Testing rewards event checking across all upgraded contracts --- rewards/rewards.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 2cc9dba40..fac7cc693 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -151,11 +151,14 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz indexBig := big.NewInt(0).SetUint64(index) indexBytes := [32]byte{} indexBig.FillBytes(indexBytes[:]) - addressFilter := []common.Address{*rocketRewardsPool.Address} topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {crypto.Keccak256Hash(indexBytes[:])}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + q := eth.FilterQuery{ + Topics: topicFilter, + FromBlock: startBlock, + } + logs, err := eth.FilterContractLogs(rp, "rocketRewardsPool", q, intervalSize) if err != nil { return RewardsEvent{}, err } From 2c509ef38f929a56367fbe1bdfae8de02fb88b82 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 9 May 2022 22:59:08 -0400 Subject: [PATCH 468/878] Revert "Testing rewards event checking across all upgraded contracts" This reverts commit 091a2c9ab75550308671672c049962d7a302e581. --- rewards/rewards.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index fac7cc693..2cc9dba40 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -151,14 +151,11 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz indexBig := big.NewInt(0).SetUint64(index) indexBytes := [32]byte{} indexBig.FillBytes(indexBytes[:]) + addressFilter := []common.Address{*rocketRewardsPool.Address} topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {crypto.Keccak256Hash(indexBytes[:])}} // Get the event logs - q := eth.FilterQuery{ - Topics: topicFilter, - FromBlock: startBlock, - } - logs, err := eth.FilterContractLogs(rp, "rocketRewardsPool", q, intervalSize) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) if err != nil { return RewardsEvent{}, err } From aafc3dd3fcdb1c32e51648bc2ea2792f653c54dc Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 10 May 2022 20:18:02 -0400 Subject: [PATCH 469/878] Fixed some snapshot event and penalty submission type issues --- network/penalties.go | 5 +++-- rewards/rewards.go | 12 +++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/network/penalties.go b/network/penalties.go index a0233aa6d..bc9cd77f0 100644 --- a/network/penalties.go +++ b/network/penalties.go @@ -2,6 +2,7 @@ package network import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -11,7 +12,7 @@ import ( ) // Estimate the gas of SubmitPenalty -func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, block uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, block *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkPenalties, err := getRocketNetworkPenalties(rp) if err != nil { return rocketpool.GasInfo{}, err @@ -20,7 +21,7 @@ func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common. } // Submit penalty for given minipool -func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, block uint64, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, block *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPenalties(rp) if err != nil { return common.Hash{}, err diff --git a/rewards/rewards.go b/rewards/rewards.go index 2cc9dba40..c06b1da00 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" @@ -20,7 +19,7 @@ type RewardsEvent struct { Block *big.Int RewardsPerNetworkRPL []*big.Int RewardsPerNetworkETH []*big.Int - MerkleRoot []byte + MerkleRoot common.Hash MerkleTreeCID string IntervalStartTime time.Time IntervalEndTime time.Time @@ -152,7 +151,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz indexBytes := [32]byte{} indexBig.FillBytes(indexBytes[:]) addressFilter := []common.Address{*rocketRewardsPool.Address} - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {crypto.Keccak256Hash(indexBytes[:])}} + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) @@ -170,20 +169,19 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the decoded data - eventIndex := values["index"].(*big.Int) eventBlock := values["block"].(*big.Int) eventRpl := values["rewardsPerNetworkRPL"].([]*big.Int) eventEth := values["rewardsPerNetworkETH"].([]*big.Int) - eventMerkleRoot := values["merkleRoot"].([]byte) + eventMerkleRoot := values["merkleRoot"].([32]byte) eventMerkleTreeCid := values["merkleTreeCID"].(string) eventIntervalStartTime := values["intervalStartTime"].(*big.Int) eventIntervalEndTime := values["intervalEndTime"].(*big.Int) eventData := RewardsEvent{ - Index: eventIndex, + Index: indexBig, Block: eventBlock, RewardsPerNetworkRPL: eventRpl, RewardsPerNetworkETH: eventEth, - MerkleRoot: eventMerkleRoot, + MerkleRoot: common.BytesToHash(eventMerkleRoot[:]), MerkleTreeCID: eventMerkleTreeCid, IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), From 4606b3ec48918890cb4cd64ddbb8ec38ad6a0d82 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 15 May 2022 21:24:29 -0400 Subject: [PATCH 470/878] Updated rewards with the new struct --- rewards/rewards.go | 71 ++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index c06b1da00..edff34cdc 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -15,14 +15,33 @@ import ( // Info for a rewards snapshot event type RewardsEvent struct { - Index *big.Int - Block *big.Int - RewardsPerNetworkRPL []*big.Int - RewardsPerNetworkETH []*big.Int - MerkleRoot common.Hash - MerkleTreeCID string - IntervalStartTime time.Time - IntervalEndTime time.Time + Index *big.Int + ExecutionBlock *big.Int + ConsensusBlock *big.Int + MerkleRoot common.Hash + MerkleTreeCID string + IntervalsPassed *big.Int + TreasuryRPL *big.Int + TrustedNodeRPL []*big.Int + NodeRPL []*big.Int + NodeETH []*big.Int + IntervalStartTime time.Time + IntervalEndTime time.Time + SubmissionTime time.Time +} + +// Struct for submitting the rewards for a checkpoint +type RewardSubmission struct { + RewardIndex *big.Int `abi:"rewardIndex"` + ExecutionBlock *big.Int `abi:"executionBlock"` + ConsensusBlock *big.Int `abi:"consensusBlock"` + MerkleRoot common.Hash `abi:"merkleRoot"` + MerkleTreeCID string `abi:"merkleTreeCID"` + IntervalsPassed *big.Int `abi:"intervalsPassed"` + TreasuryRPL *big.Int `abi:"treasuryRPL"` + TrustedNodeRPL []*big.Int `abi:"trustedNodeRPL"` + NodeRPL []*big.Int `abi:"nodeRPL"` + NodeETH []*big.Int `abi:"nodeETH"` } // Get the index of the active rewards period @@ -117,21 +136,21 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval -func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, intervalsPassed *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID, intervalsPassed) + return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", submission) } // Submit a Merkle Tree-based snapshot for a rewards interval -func SubmitRewardSnapshot(rp *rocketpool.RocketPool, index *big.Int, block *big.Int, rewardsPerNetworkRPL []*big.Int, rewardsPerNetworkETH []*big.Int, merkleRoot common.Hash, merkleTreeCID string, intervalsPassed *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (common.Hash, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { return common.Hash{}, err } - hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", index, block, rewardsPerNetworkRPL, rewardsPerNetworkETH, merkleRoot, merkleTreeCID, intervalsPassed) + hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } @@ -169,22 +188,24 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the decoded data - eventBlock := values["block"].(*big.Int) - eventRpl := values["rewardsPerNetworkRPL"].([]*big.Int) - eventEth := values["rewardsPerNetworkETH"].([]*big.Int) - eventMerkleRoot := values["merkleRoot"].([32]byte) - eventMerkleTreeCid := values["merkleTreeCID"].(string) + submission := values["submission"].(RewardSubmission) eventIntervalStartTime := values["intervalStartTime"].(*big.Int) eventIntervalEndTime := values["intervalEndTime"].(*big.Int) + submissionTime := values["time"].(*big.Int) eventData := RewardsEvent{ - Index: indexBig, - Block: eventBlock, - RewardsPerNetworkRPL: eventRpl, - RewardsPerNetworkETH: eventEth, - MerkleRoot: common.BytesToHash(eventMerkleRoot[:]), - MerkleTreeCID: eventMerkleTreeCid, - IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), - IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + Index: indexBig, + ExecutionBlock: submission.ExecutionBlock, + ConsensusBlock: submission.ConsensusBlock, + IntervalsPassed: submission.IntervalsPassed, + TreasuryRPL: submission.TreasuryRPL, + TrustedNodeRPL: submission.TrustedNodeRPL, + NodeRPL: submission.NodeRPL, + NodeETH: submission.NodeETH, + MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleTreeCID: submission.MerkleTreeCID, + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(submissionTime.Int64(), 0), } return eventData, nil From e6f7c496027d94b676c91bd73df63eb0e814e9d1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 15 May 2022 22:23:02 -0400 Subject: [PATCH 471/878] Added GetProtocolDaoRewardsPercent --- rewards/rewards.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index edff34cdc..e69a4ce76 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -109,6 +109,19 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. return *perc, nil } +// Get the percent of checkpoint rewards that goes to the PDAO +func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { + return nil, fmt.Errorf("Could not get protocol DAO rewards percent: %w", err) + } + return *perc, nil +} + // Get the amount of RPL rewards that will be provided to node operators func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp) From c577dff6122be8b6b4f6c3c7fdb3024e3a0a1c73 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 16 May 2022 00:07:22 -0400 Subject: [PATCH 472/878] Added GetNetworkEnabled --- settings/trustednode/rewards.go | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 settings/trustednode/rewards.go diff --git a/settings/trustednode/rewards.go b/settings/trustednode/rewards.go new file mode 100644 index 000000000..18c492550 --- /dev/null +++ b/settings/trustednode/rewards.go @@ -0,0 +1,39 @@ +package trustednode + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Config +const ( + RewardsSettingsContractName string = "rocketDAONodeTrustedSettingsRewards" + NetworkEnabledPath string = "rewards.network.enabled" +) + +// Get whether or not the provided rewards network is enabled +func GetNetworkEnabled(rp *rocketpool.RocketPool, network *big.Int, opts *bind.CallOpts) (bool, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp) + if err != nil { + return false, err + } + value := new(bool) + if err := rewardsSettingsContract.Call(opts, value, "getNetworkEnabled", network); err != nil { + return false, fmt.Errorf("Could not check if network %s is enabled: %w", network.String(), err) + } + return (*value), nil +} + +// Get contracts +var rewardsSettingsContractLock sync.Mutex + +func getRewardsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rewardsSettingsContractLock.Lock() + defer rewardsSettingsContractLock.Unlock() + return rp.GetContract(RewardsSettingsContractName) +} From c589c1acdd761615a9523a81b71bd08d98737427 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 16 May 2022 23:01:31 -0400 Subject: [PATCH 473/878] Added a legacy version management system --- go.mod | 1 + go.sum | 2 + legacy/v1.0.0/minipool/minipool.go | 2 +- legacy/v1.0.0/rewards/node.go | 2 +- legacy/v1.0.0/rewards/rewards.go | 2 +- legacy/v1.0.0/rewards/trusted-node.go | 2 +- rocketpool/rocketpool.go | 9 ++- rocketpool/v1.0.0-manager.go | 59 +++++++++++++++ rocketpool/version-manager.go | 101 ++++++++++++++++++++++++++ utils/version-checker.go | 28 +++++++ 10 files changed, 202 insertions(+), 6 deletions(-) create mode 100644 rocketpool/v1.0.0-manager.go create mode 100644 rocketpool/version-manager.go create mode 100644 utils/version-checker.go diff --git a/go.mod b/go.mod index 0f034ed27..09a461e7b 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/ethereum/go-ethereum v1.10.16 github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect + github.com/hashicorp/go-version v1.4.0 github.com/minio/highwayhash v1.0.2 // indirect github.com/princjef/gomarkdoc v0.3.0 github.com/protolambda/zssz v0.1.5 // indirect diff --git a/go.sum b/go.sum index 2925fe017..aa2e30283 100644 --- a/go.sum +++ b/go.sum @@ -278,6 +278,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= diff --git a/legacy/v1.0.0/minipool/minipool.go b/legacy/v1.0.0/minipool/minipool.go index aceca5d5e..2e4fa6d4a 100644 --- a/legacy/v1.0.0/minipool/minipool.go +++ b/legacy/v1.0.0/minipool/minipool.go @@ -544,5 +544,5 @@ var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") } diff --git a/legacy/v1.0.0/rewards/node.go b/legacy/v1.0.0/rewards/node.go index 7758bf666..ab52e0668 100644 --- a/legacy/v1.0.0/rewards/node.go +++ b/legacy/v1.0.0/rewards/node.go @@ -120,5 +120,5 @@ var rocketClaimNodeLock sync.Mutex func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketClaimNodeLock.Lock() defer rocketClaimNodeLock.Unlock() - return rp.GetContract("rocketClaimNode") + return rp.VersionManager.V1_0_0.GetContract("rocketClaimNode") } diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index 1e921595c..41b2d55ec 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -149,5 +149,5 @@ var rocketRewardsPoolLock sync.Mutex func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() - return rp.GetContract("rocketRewardsPool") + return rp.VersionManager.V1_0_0.GetContract("rocketRewardsPool") } diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/legacy/v1.0.0/rewards/trusted-node.go index 11c52b7b6..fd94c5171 100644 --- a/legacy/v1.0.0/rewards/trusted-node.go +++ b/legacy/v1.0.0/rewards/trusted-node.go @@ -120,5 +120,5 @@ var rocketClaimTrustedNodeLock sync.Mutex func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketClaimTrustedNodeLock.Lock() defer rocketClaimTrustedNodeLock.Unlock() - return rp.GetContract("rocketClaimTrustedNode") + return rp.VersionManager.V1_0_0.GetContract("rocketClaimTrustedNode") } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index b07c7bfac..b27f0bcc3 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -37,6 +37,7 @@ type RocketPool struct { Client ExecutionClient RocketStorage *contracts.RocketStorage RocketStorageContract *Contract + VersionManager *VersionManager addresses map[string]cachedAddress abis map[string]cachedABI contracts map[string]cachedContract @@ -67,14 +68,17 @@ func NewRocketPool(client ExecutionClient, rocketStorageAddress common.Address) } // Create and return - return &RocketPool{ + rp := &RocketPool{ Client: client, RocketStorage: rocketStorage, RocketStorageContract: contract, addresses: make(map[string]cachedAddress), abis: make(map[string]cachedABI), contracts: make(map[string]cachedContract), - }, nil + } + rp.VersionManager = NewVersionManager(rp) + + return rp, nil } @@ -106,6 +110,7 @@ func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { return &address, nil } + func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, error) { // Data diff --git a/rocketpool/v1.0.0-manager.go b/rocketpool/v1.0.0-manager.go new file mode 100644 index 000000000..d155378f4 --- /dev/null +++ b/rocketpool/v1.0.0-manager.go @@ -0,0 +1,59 @@ +package rocketpool + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/hashicorp/go-version" +) + +// A wrapper that holds the updated contract information for this version +type LegacyVersionWrapper_v1_0_0 struct { + rp *RocketPool + rpVersion *version.Version + contractNameMap map[string]string + abiMap map[string]string +} + +// Creates a new wrapper for this version +func newLegacyVersionWrapper_v1_0_0(rp *RocketPool) *LegacyVersionWrapper_v1_0_0 { + rpVersion, _ := version.NewSemver("1.0.0") + return &LegacyVersionWrapper_v1_0_0{ + rp: rp, + rpVersion: rpVersion, + contractNameMap: map[string]string{ + "rocketRewardsPool": "rocketRewardsPool.v1", + "rocketClaimNode": "rocketClaimNode.v1", + "rocketClaimTrustedNode": "rocketClaimTrustedNode.v1", + "rocketMinipoolManager": "rocketMinipoolManager.v1"}, + abiMap: map[string]string{ + "rocketRewardsPool": "eJzVWN9vmzAQ/lcmnvPADxtD37po0ia1VZVmT1U1HfYRoRKobJMmqvq/zxCSQBOatMsYe0vs43zfd2ffZ9+/WEn2VGhlXdyXPzXKDNLp6gmtC4vnmZbA9ZdJzh9R3+lcwgx/lEYxcLRGVgbz0vCXbBpcCiFRKTOt136gHnh9GFlKg8brQkOUpIlemdksz55gBVGKuy/MykrLghuHZlAlswx0Id/OvI5eLDCfr+Z5YQDEkCoctfEIXKKwLswX1UwLHmzjrGHwFJJ5ks3GNe4DCEafdtrNStPnFkPLaWH+u9TfOQWDOGvEtzH4jC+dzPGAp4etweT2apo/YqbGJRTjeWuMC6yiaCbIXlKMHYfboU89QpkTeg4NYrQjwimNInBsLlzhskAg4bHHfRFyZCSmFG2fUofXKOos7uJYoFRJnpn18kJ31WwZf7AD1wYWdJTgIsHnnWVcZFyvF6qqDQzGOtlvgJJYEEHtroBnqA13XyGFrNotR8JuZeVwRs4WuuuEAfpuJ9cm9Crb1WZfmDBN4u80SD0sGBF4hEck+jCMcT43xlUtDwmOZ3uIGJwKR92CUkMDYRMvYEy8tyv2cjIsBNQGN2ZIjyEoI78Cpa9BDAwBD23PYduG0BWW6aSmMzX6+Kbj30CzJ9Rmr/sMNJrlt2WitHqfhijP00McVONnJYARQhwRiD4JyEoNc2Qz9seAj8INKCUfZqBTBJ3EwjTXkO6EwoD2BBo54vgOPULIXlhrRjanVdU9pocl0+gc7O472ZOUay8o3xXa3Sn6qVB+B3VSkvqrV4f5IYt85/z12g+jE5yZAxAliuE1NJdEkTBa/H/ldgxZNTyUWvVC4hIW9322llSsz9dCyvXNa0BFZkgJGMW/UGSnkXKDy4ExAuZm66Af9czILUpeytJhkWGj6zJOnVOvBRN8BilUldqBIRGUUebCP0jrsIiIffBiH+OeibhM0/x5eE8qNoS+Z3N3oE1230mH0jVOqtfFut663wU3qbncPEYOKBk+w4Cw4FiHPguPbd3xC7f3wLf6o7aQtVJcC3DZIu7kF/IGE23kJLLRE+6xa85ZkO870XmfFcj3ROGf8xeGPo/AL5+KfwPvAY9J", + "rocketClaimNode": "eJzNlMFuwjAMhl9l6rmHUtoOuKFphx0mIbYbQshJ3CpaSVDiwtDEuy+ljNKNwg7dxK2Nnfj77V+efXhSrQqy3mhWfhIaBfnrdoXeyONakQFOd1PN35BeSBvI8KlMSoGj53sKlmXiwpwmjIUwaK0LU/UOHA52c9+zBITPBQGTuaStiyqtVrAFlmN9w1W2ZAruHnSHVmYKqDDfIzv/hH5+pFmjsVIrd1EX1KatcP+DWkFdugqcR11L3NSZaaE4VYX2VKDIGzk2bBIH73GUikjEQRtwhvSoygaIy8xM6/wc8v68U+LeQGAAqWgS/wCC46S/jKC0uDz/WvJDDnI50dbKavQ3ITyMwoClSfLnwqe4ASPsBA2/btQwTtqsWoa6NWu/z1nEgv/qwHipC8dyUz3oB3EUJ9C1/f0rxl6gaq7Bo78PCQYzad0DjW79eqmeyG/KBRb0WJQM2/YTL8fVcc0I73tiGLoWzz8BB105fQ==", + "rocketClaimTrustedNode": "eJzNlMFuwjAMhl9l6rmHUtoOuKFphx02IbYbQshN3CpaSVDiwNDEuy+ljNKNwg4McWtsx/7s/PXk0xNyYcl4g0n5SaglFG/rBXoDjylJGhjdjRV7R3olpSHHpzIoA4ae70mYl4EzfRgw5FyjMc5NVR7YGTZT3zMEhM+WIBWFoLXzSiUXsIa0wPqGq2xIW+YSOqMRuQSy+qdn4x/QT/c0S9RGKOkuKkttvVl37tUd1KUrx3HUpcBVHZlZyagqtKUCSd7AsWGTOPiIo4xHPA7agHOkR1kOgJ9mTpUqjiFv7Rcl7vQ4BpDxJvEvINi/9LcQXDJDyF8UPy2DuvOHAsR8pIwRlQJuov8wCoM0S5Jr9T/GFWhuRqjZedmGcdIm3NJ1Wel2uyyN0uDKgxjOlXVINzWKbhBHcQL/9E/4Z9Q+Q9lckXvR7wI05sKV0Y2h/XnhHkyh2TWkQSeNkn7b7mLlq124ZoT3Hd4P3aSnX+6rRSk=", + "rocketMinipoolManager": "eJztWU1v2zgQ/SuFzj5QEimSuWU/CvSQRbBdbA9BEAzJYSrElgyJcmIU/e+lbCuyHduSY7tQgd5scTic9zjDGQ7vvgVpNq1cGVzd1T8dFhmM/5tPMbgKdJ65ArT78G+un9B9dnkBj/ipFrKgMRgFGUxqwYdiXeDamALL0g+7pR5Yffh+PwpKBw5vKgcqHadu7kezPJvCHNQY2xl+5dIVlfYKg++jbwF4ofkkr7yZFsYljjatNviCJrjyMxYjGyDg1ZqVsZM0S6d5Pt5h3+hoZVlusEPRq8Ebmir/P2JJq8mlkzVNzXBN2UrgZmX3nwV6Ck0rizPMnP9bpo8ZuKqov5EXIhRVMlRgwUoZhZRpZgxHIoWx2qg4soJLHlIdMqoTFuqIMwGUag4ISH/zvsX7X+hdMp93Mx8TybUilsWJNkKEIVMipDJkhpOYmMiiZELSOGZcm0iFIDE0CgQkPEadyBWMFc+tITMsyjTP/Hp55fbFbA1AtOg2kYk9IThL8bmVtFWm3XKhRRyCx7jalk2gjFpDDSP7DH5E9+q0ebVgqsPyjZ3ZvStns977uCHKb+d+6z87eEqzxwGDSLjSEMXsAIiPqTcvLdEMGIYJERKNhzzp2mua4YAxaJSKS9jyp26zcmtLdDuMG3XPHaeTdNfU/TF4i4X3aleVR5Lndbh06UcN9++wd1rgGDyhX0/QUS6D8gQNz6n7agp4rmuOE9SYtCzz8Ww/Ief0rlgx1GhhcN5122xp42YdnrXK1Xf3uwKzHTxvojIWrUzYseQ9LIqJvvF13XEgvSli+lbI70SN1vI4lLYD9RuzHuri6mAR32L/x4sO+EwO/aGMOo4vTcHgk1MoKEVNwksT8SsUG0oIENLyS3Mx/OqRcUXRJurMTPRILf1O1vXTZWinq1AxISSSl/ai/308GXDDdiQrSZRwTYfsSG+JHJpLSQOEE9KVsNXc4TqH00o94bxdbzm+u0b5Y37bSA8IuLYJUJ4cn6abnlLPeGpY+PslLV1HnaqWrao3BCy+n/cOTxKlkgh/Fvr1RtYgCADOuBS8625zNgL6hMBWkO2KrvPd7VCxmOHxqeSd+L8099+6l2wwqy/2XdHwHjqmNcDj6Yi04omOL1efpZkucOJx96rSej9arAHcOtcl4ZEQ+mKADP5cQJwpJjW/3M1yY4d63ClOh6QIRSEScfEKBrNq8qE9iqd5ueixNOrM8stCeLt336ccKmF8uGWjF89HN+1jzIGo33oAbCbteAHsWyActScsFMhJrPd1hc0yke3EcgYnV4oSgLNXY+XBRHS63ZEPzIQaeqCX3laDDvXyJW0gZ78VTCWS+krw/gfIvWxo", + }, + } +} + +// Get the version for this manager +func (m *LegacyVersionWrapper_v1_0_0) GetVersion() *version.Version { + return m.rpVersion +} + +// Get the versioned name of the contract if it was upgraded as part of this deployment +func (m *LegacyVersionWrapper_v1_0_0) GetVersionedContractName(contractName string) (string, bool) { + legacyName, exists := m.contractNameMap[contractName] + return legacyName, exists +} + +// Get the ABI for the provided contract +func (m *LegacyVersionWrapper_v1_0_0) GetEncodedABI(contractName string) string { + return m.abiMap[contractName] +} + +// Get the contract with the provided name for this version of Rocket Pool +func (m *LegacyVersionWrapper_v1_0_0) GetContract(contractName string) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m) +} + +func (m *LegacyVersionWrapper_v1_0_0) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { + return getLegacyContractWithAddress(m.rp, contractName, address, m) +} diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go new file mode 100644 index 000000000..e71d0d4f5 --- /dev/null +++ b/rocketpool/version-manager.go @@ -0,0 +1,101 @@ +package rocketpool + +import ( + "fmt" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/hashicorp/go-version" +) + +// Wrapper for legacy contract versions +type LegacyVersionWrapper interface { + GetVersion() *version.Version + GetVersionedContractName(contractName string) (string, bool) + GetEncodedABI(contractName string) string + GetContract(contractName string) (*Contract, error) + GetContractWithAddress(contractName string, address common.Address) (*Contract, error) +} + +type VersionManager struct { + V1_0_0 LegacyVersionWrapper + + rp *RocketPool +} + +func NewVersionManager(rp *RocketPool) *VersionManager { + return &VersionManager{ + V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), + rp: rp, + } +} + +// Get the contract with the provided name and version wrapper +func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapper) (*Contract, error) { + + legacyName, exists := m.GetVersionedContractName(contractName) + if !exists { + // This wasn't upgraded in v1.0.0 + return rp.GetContract(contractName) + } + + // Check for cached contract + if cached, ok := rp.getCachedContract(legacyName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.contract, nil + } else { + rp.deleteCachedContract(legacyName) + } + } + + // Try to get the legacy address from RocketStorage first + emptyAddress := common.Address{} + address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(legacyName))) + if err != nil { + return nil, fmt.Errorf("Could not load v%s contract %s address: %w", m.GetVersion().String(), contractName, err) + } + + if address == emptyAddress { + // Not found, so v1.0.0 is still on the network - try loading the original contract name instead + return rp.GetContract(contractName) + } + + // If we're here, we have a legacy contract + abiEncoded := m.GetEncodedABI(contractName) + abi, err := DecodeAbi(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + } + + contract := &Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + } + + return contract, nil + +} + +// Get the contract with the provided name, address, and version wrapper +func getLegacyContractWithAddress(rp *RocketPool, contractName string, address common.Address, m LegacyVersionWrapper) (*Contract, error) { + + abiEncoded := m.GetEncodedABI(contractName) + abi, err := DecodeAbi(abiEncoded) + if err != nil { + return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + } + + contract := &Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + } + + return contract, nil + +} diff --git a/utils/version-checker.go b/utils/version-checker.go new file mode 100644 index 000000000..6d7edc9c9 --- /dev/null +++ b/utils/version-checker.go @@ -0,0 +1,28 @@ +package utils + +import ( + "fmt" + + "github.com/hashicorp/go-version" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { + + // Base version + rpVersion, _ := version.NewSemver("1.0.0") + + // Check for v1.1 + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, nil) + if err != nil { + return nil, fmt.Errorf("Error checking node manager version: %w", err) + } + if nodeMgrVersion == 2 { + rpVersion, _ = version.NewSemver("1.1.0") + } + + // Return whatever version was found + return rpVersion, nil + +} From c4692fe8533c7ec0d4730bb393a948ac46cd4efd Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 17 May 2022 00:14:54 -0400 Subject: [PATCH 474/878] Fixed a legacy contract getter --- legacy/v1.0.0/utils/address_generation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy/v1.0.0/utils/address_generation.go b/legacy/v1.0.0/utils/address_generation.go index 9d929dc49..8a4f624ef 100644 --- a/legacy/v1.0.0/utils/address_generation.go +++ b/legacy/v1.0.0/utils/address_generation.go @@ -66,5 +66,5 @@ var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") } From f0e3d6f285f166989c551fc015006d359b337a74 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 17 May 2022 02:01:41 -0400 Subject: [PATCH 475/878] Removed obsolete functions --- rewards/legacy-functions.go | 98 ------------------------------------- 1 file changed, 98 deletions(-) delete mode 100644 rewards/legacy-functions.go diff --git a/rewards/legacy-functions.go b/rewards/legacy-functions.go deleted file mode 100644 index c28e577a8..000000000 --- a/rewards/legacy-functions.go +++ /dev/null @@ -1,98 +0,0 @@ -package rewards - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" -) - -// Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLegacyLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress common.Address, legacyRewardsPoolAbi string, legacyClaimNodeAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Create RocketRewardsPool ABI - abi, err := rocketpool.DecodeAbi(legacyRewardsPoolAbi) - if err != nil { - return nil, fmt.Errorf("error decoding legacy RocketRewardsPool ABI: %w", err) - } - - // Create RocketRewardsPool contract - rocketRewardsPool := &rocketpool.Contract{ - Contract: bind.NewBoundContract(legacyRewardsPoolAddress, *abi, rp.Client, rp.Client, rp.Client), - Address: &legacyRewardsPoolAddress, - ABI: abi, - Client: rp.Client, - } - - // Construct a filter query for relevant logs - addressFilter := []common.Address{legacyRewardsPoolAddress} - // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {legacyClaimNodeAddress.Hash()}, {claimerAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) - if err != nil { - return nil, err - } - - // Iterate over the logs and sum the amount - sum := big.NewInt(0) - for _, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - // Add the amount argument to our sum - amount := values["amount"].(*big.Int) - sum.Add(sum, amount) - } - // Return the result - return sum, nil -} - -// Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLegacyLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, legacyRewardsPoolAddress common.Address, legacyRewardsPoolAbi string, legacyClaimTrustedNodeAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { - // Create RocketRewardsPool ABI - abi, err := rocketpool.DecodeAbi(legacyRewardsPoolAbi) - if err != nil { - return nil, fmt.Errorf("error decoding legacy RocketRewardsPool ABI: %w", err) - } - - // Create RocketRewardsPool contract - rocketRewardsPool := &rocketpool.Contract{ - Contract: bind.NewBoundContract(legacyRewardsPoolAddress, *abi, rp.Client, rp.Client, rp.Client), - Address: &legacyRewardsPoolAddress, - ABI: abi, - Client: rp.Client, - } - - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketRewardsPool.Address} - // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {legacyClaimTrustedNodeAddress.Hash()}, {claimerAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) - if err != nil { - return nil, err - } - - // Iterate over the logs and sum the amount - sum := big.NewInt(0) - for _, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketRewardsPool.ABI.Events["RPLTokensClaimed"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - // Add the amount argument to our sum - amount := values["amount"].(*big.Int) - sum.Add(sum, amount) - } - // Return the result - return sum, nil -} From 91804fa734b8aa8bc9ddd1b015e547e1db169025 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 19 May 2022 00:16:54 -0400 Subject: [PATCH 476/878] Added explicit address entry for legacy functions --- legacy/v1.0.0/minipool/minipool.go | 122 +++++++++++----------- legacy/v1.0.0/rewards/node.go | 46 ++++---- legacy/v1.0.0/rewards/rewards.go | 32 +++--- legacy/v1.0.0/rewards/trusted-node.go | 46 ++++---- legacy/v1.0.0/utils/address_generation.go | 14 ++- 5 files changed, 140 insertions(+), 120 deletions(-) diff --git a/legacy/v1.0.0/minipool/minipool.go b/legacy/v1.0.0/minipool/minipool.go index 2e4fa6d4a..fc03a671c 100644 --- a/legacy/v1.0.0/minipool/minipool.go +++ b/legacy/v1.0.0/minipool/minipool.go @@ -37,25 +37,25 @@ type MinipoolCountsPerStatus struct { } // Get all minipool details -func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { - minipoolAddresses, err := GetMinipoolAddresses(rp, opts) +func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetMinipoolAddresses(rp, opts, legacyRocketMinipoolManagerAddress) if err != nil { return []MinipoolDetails{}, err } - return loadMinipoolDetails(rp, minipoolAddresses, opts) + return loadMinipoolDetails(rp, minipoolAddresses, opts, legacyRocketMinipoolManagerAddress) } // Get a node's minipool details -func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { - minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts) +func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]MinipoolDetails, error) { + minipoolAddresses, err := GetNodeMinipoolAddresses(rp, nodeAddress, opts, legacyRocketMinipoolManagerAddress) if err != nil { return []MinipoolDetails{}, err } - return loadMinipoolDetails(rp, minipoolAddresses, opts) + return loadMinipoolDetails(rp, minipoolAddresses, opts, legacyRocketMinipoolManagerAddress) } // Load minipool details -func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { +func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]MinipoolDetails, error) { // Load minipool details in batches details := make([]MinipoolDetails, len(minipoolAddresses)) @@ -74,7 +74,7 @@ func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.A mi := mi wg.Go(func() error { minipoolAddress := minipoolAddresses[mi] - minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts) + minipoolDetails, err := GetMinipoolDetails(rp, minipoolAddress, opts, legacyRocketMinipoolManagerAddress) if err == nil { details[mi] = minipoolDetails } @@ -93,10 +93,10 @@ func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.A } // Get all minipool addresses -func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { +func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]common.Address, error) { // Get minipool count - minipoolCount, err := GetMinipoolCount(rp, opts) + minipoolCount, err := GetMinipoolCount(rp, opts, legacyRocketMinipoolManagerAddress) if err != nil { return []common.Address{}, err } @@ -117,7 +117,7 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com for mi := msi; mi < mei; mi++ { mi := mi wg.Go(func() error { - address, err := GetMinipoolAt(rp, mi, opts) + address, err := GetMinipoolAt(rp, mi, opts, legacyRocketMinipoolManagerAddress) if err == nil { addresses[mi] = address } @@ -136,15 +136,15 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com } // Get the addresses of all minipools in prelaunch status -func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { +func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return []common.Address{}, err } // Get the total number of minipools - totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + totalMinipoolsUint, err := GetMinipoolCount(rp, nil, legacyRocketMinipoolManagerAddress) if err != nil { return []common.Address{}, err } @@ -166,10 +166,10 @@ func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpt } // Get a node's minipool addresses -func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { +func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]common.Address, error) { // Get minipool count - minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts, legacyRocketMinipoolManagerAddress) if err != nil { return []common.Address{}, err } @@ -190,7 +190,7 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr for mi := msi; mi < mei; mi++ { mi := mi wg.Go(func() error { - address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts) + address, err := GetNodeMinipoolAt(rp, nodeAddress, mi, opts, legacyRocketMinipoolManagerAddress) if err == nil { addresses[mi] = address } @@ -209,10 +209,10 @@ func GetNodeMinipoolAddresses(rp *rocketpool.RocketPool, nodeAddress common.Addr } // Get a node's validating minipool pubkeys -func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) { +func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]rptypes.ValidatorPubkey, error) { // Get minipool count - minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts) + minipoolCount, err := GetNodeValidatingMinipoolCount(rp, nodeAddress, opts, legacyRocketMinipoolManagerAddress) if err != nil { return []rptypes.ValidatorPubkey{}, err } @@ -234,11 +234,11 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com for mi := msi; mi < mei; mi++ { mi := mi wg.Go(func() error { - minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts) + minipoolAddress, err := GetNodeValidatingMinipoolAt(rp, nodeAddress, mi, opts, legacyRocketMinipoolManagerAddress) if err != nil { return err } - pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts) + pubkey, err := GetMinipoolPubkey(rp, minipoolAddress, opts, legacyRocketMinipoolManagerAddress) if err != nil { return err } @@ -260,7 +260,7 @@ func GetNodeValidatingMinipoolPubkeys(rp *rocketpool.RocketPool, nodeAddress com } // Get a minipool's details -func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (MinipoolDetails, error) { +func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (MinipoolDetails, error) { // Data var wg errgroup.Group @@ -270,12 +270,12 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Load data wg.Go(func() error { var err error - exists, err = GetMinipoolExists(rp, minipoolAddress, opts) + exists, err = GetMinipoolExists(rp, minipoolAddress, opts, legacyRocketMinipoolManagerAddress) return err }) wg.Go(func() error { var err error - pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts) + pubkey, err = GetMinipoolPubkey(rp, minipoolAddress, opts, legacyRocketMinipoolManagerAddress) return err }) @@ -294,8 +294,8 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres } // Get the minipool count -func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) if err != nil { return 0, err } @@ -307,8 +307,8 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } // Get the number of finalised minipools in the network -func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) if err != nil { return 0, err } @@ -320,8 +320,8 @@ func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } // Get the number of active minipools in the network -func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) if err != nil { return 0, err } @@ -333,14 +333,14 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } // Get the minipool count by status -func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (MinipoolCountsPerStatus, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return MinipoolCountsPerStatus{}, err } // Get the total number of minipools - totalMinipoolsUint, err := GetMinipoolCount(rp, nil) + totalMinipoolsUint, err := GetMinipoolCount(rp, nil, legacyRocketMinipoolManagerAddress) if err != nil { return MinipoolCountsPerStatus{}, err } @@ -383,8 +383,8 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } // Get a minipool address by index -func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, err } @@ -396,8 +396,8 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) } // Get a node's minipool count -func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return 0, err } @@ -409,8 +409,8 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Get the number of minipools owned by a node that are not finalised -func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return 0, err } @@ -422,8 +422,8 @@ func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Ad } // Get the number of minipools owned by a node that are finalised -func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return 0, err } @@ -435,8 +435,8 @@ func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common } // Get a node's minipool address by index -func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, err } @@ -448,8 +448,8 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } // Get a node's validating minipool count -func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return 0, err } @@ -461,8 +461,8 @@ func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress commo } // Get a node's validating minipool address by index -func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, err } @@ -474,8 +474,8 @@ func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.A } // Get a minipool address by validator pubkey -func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, err } @@ -487,8 +487,8 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk } // Check whether a minipool exists -func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return false, err } @@ -500,8 +500,8 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address } // Get a minipool's validator pubkey -func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (rptypes.ValidatorPubkey, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (rptypes.ValidatorPubkey, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return rptypes.ValidatorPubkey{}, err } @@ -513,8 +513,8 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits -func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]byte, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return []byte{}, err } @@ -526,8 +526,8 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte } // Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool -func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) +func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Hash, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Hash{}, err } @@ -541,8 +541,12 @@ func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() - return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + if address == nil { + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + } else { + return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketMinipoolManager", *address) + } } diff --git a/legacy/v1.0.0/rewards/node.go b/legacy/v1.0.0/rewards/node.go index ab52e0668..627739f25 100644 --- a/legacy/v1.0.0/rewards/node.go +++ b/legacy/v1.0.0/rewards/node.go @@ -13,8 +13,8 @@ import ( ) // Get whether node reward claims are enabled -func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (bool, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return false, err } @@ -22,8 +22,8 @@ func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, } // Get whether a node rewards claimer can claim -func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (bool, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return false, err } @@ -31,8 +31,8 @@ func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Addre } // Get the percentage of rewards available for a node rewards claimer -func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (float64, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return 0, err } @@ -40,8 +40,8 @@ func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Ad } // Get the total amount of rewards available for a node rewards claimer -func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (*big.Int, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return nil, err } @@ -49,8 +49,8 @@ func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common. } // Estimate the gas of ClaimNodeRewards -func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimNodeAddress *common.Address) (rocketpool.GasInfo, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return rocketpool.GasInfo{}, err } @@ -58,8 +58,8 @@ func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactO } // Claim node rewards -func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketClaimNode, err := getRocketClaimNode(rp) +func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimNodeAddress *common.Address) (common.Hash, error) { + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return common.Hash{}, err } @@ -67,13 +67,13 @@ func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimNodeAddress *common.Address) (*big.Int, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } - rocketClaimNode, err := getRocketClaimNode(rp) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) if err != nil { return nil, err } @@ -105,20 +105,24 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm } // Get the time that the user registered as a claimer -func GetNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts) +func GetNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { + return getClaimingContractUserRegisteredTime(rp, "rocketClaimNode", claimerAddress, opts, legacyRocketRewardsPoolAddress) } // Get the total rewards claimed for this claiming contract this interval -func GetNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - return getClaimingContractTotalClaimed(rp, "rocketClaimNode", opts) +func GetNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + return getClaimingContractTotalClaimed(rp, "rocketClaimNode", opts, legacyRocketRewardsPoolAddress) } // Get contracts var rocketClaimNodeLock sync.Mutex -func getRocketClaimNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketClaimNode(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketClaimNodeLock.Lock() defer rocketClaimNodeLock.Unlock() - return rp.VersionManager.V1_0_0.GetContract("rocketClaimNode") + if address == nil { + return rp.VersionManager.V1_0_0.GetContract("rocketClaimNode") + } else { + return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketClaimNode", *address) + } } diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index 41b2d55ec..3371538d8 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -52,8 +52,8 @@ func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName strin } // Get the time that the user registered as a claimer -func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return time.Time{}, err } @@ -65,8 +65,8 @@ func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsCont } // Get the total amount claimed in the current interval by the given claiming contract -func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -92,8 +92,8 @@ func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.Tr } // Get the timestamp that the current rewards interval started -func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return time.Time{}, err } @@ -105,8 +105,8 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } // Get the number of seconds in a claim interval -func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Duration, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return 0, err } @@ -118,8 +118,8 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. } // Get the percent of checkpoint rewards that goes to node operators -func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return 0, err } @@ -131,8 +131,8 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt } // Get the percent of checkpoint rewards that goes to ODAO members -func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (float64, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return 0, err } @@ -146,8 +146,12 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. // Get contracts var rocketRewardsPoolLock sync.Mutex -func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() - return rp.VersionManager.V1_0_0.GetContract("rocketRewardsPool") + if address == nil { + return rp.VersionManager.V1_0_0.GetContract("rocketRewardsPool") + } else { + return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketRewardsPool", *address) + } } diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/legacy/v1.0.0/rewards/trusted-node.go index fd94c5171..e9d9a10f9 100644 --- a/legacy/v1.0.0/rewards/trusted-node.go +++ b/legacy/v1.0.0/rewards/trusted-node.go @@ -13,8 +13,8 @@ import ( ) // Get whether trusted node reward claims are enabled -func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (bool, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return false, err } @@ -22,8 +22,8 @@ func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) } // Get whether a trusted node rewards claimer can claim -func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (bool, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return false, err } @@ -31,8 +31,8 @@ func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress commo } // Get the percentage of rewards available for a trusted node rewards claimer -func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (float64, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return 0, err } @@ -40,8 +40,8 @@ func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress co } // Get the total amount of rewards available for a trusted node rewards claimer -func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (*big.Int, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return nil, err } @@ -49,8 +49,8 @@ func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress } // Estimate the gas of ClaimTrustedNodeRewards -func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (rocketpool.GasInfo, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return rocketpool.GasInfo{}, err } @@ -58,8 +58,8 @@ func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.Tr } // Claim trusted node rewards -func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) +func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (common.Hash, error) { + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return common.Hash{}, err } @@ -67,13 +67,13 @@ func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts) } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int) (*big.Int, error) { +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimTrustedNodeAddress *common.Address) (*big.Int, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) if err != nil { return nil, err } @@ -105,20 +105,24 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre } // Get the time that the user registered as a claimer -func GetTrustedNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts) +func GetTrustedNodeRegistrationTime(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { + return getClaimingContractUserRegisteredTime(rp, "rocketClaimTrustedNode", claimerAddress, opts, legacyRocketRewardsPoolAddress) } // Get the total rewards claimed for this claiming contract this interval -func GetTrustedNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - return getClaimingContractTotalClaimed(rp, "rocketClaimTrustedNode", opts) +func GetTrustedNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + return getClaimingContractTotalClaimed(rp, "rocketClaimTrustedNode", opts, legacyRocketRewardsPoolAddress) } // Get contracts var rocketClaimTrustedNodeLock sync.Mutex -func getRocketClaimTrustedNode(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketClaimTrustedNode(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketClaimTrustedNodeLock.Lock() defer rocketClaimTrustedNodeLock.Unlock() - return rp.VersionManager.V1_0_0.GetContract("rocketClaimTrustedNode") + if address == nil { + return rp.VersionManager.V1_0_0.GetContract("rocketClaimTrustedNode") + } else { + return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketClaimTrustedNode", *address) + } } diff --git a/legacy/v1.0.0/utils/address_generation.go b/legacy/v1.0.0/utils/address_generation.go index 8a4f624ef..86e3997b9 100644 --- a/legacy/v1.0.0/utils/address_generation.go +++ b/legacy/v1.0.0/utils/address_generation.go @@ -23,10 +23,10 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { // Get dependencies - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, err } @@ -36,7 +36,7 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo } if len(minipoolBytecode) == 0 { - minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil, legacyRocketMinipoolManagerAddress) if err != nil { return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) } @@ -63,8 +63,12 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() - return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + if address == nil { + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + } else { + return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketMinipoolManager", *address) + } } From ca202870e31746411b3044b1eac18051ba0a6f0e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 19 May 2022 01:45:55 -0400 Subject: [PATCH 477/878] Changed the distributor retriever to use the delegate --- node/distributor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/distributor.go b/node/distributor.go index 9b9ae80b2..68610a9bc 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -76,5 +76,5 @@ var rocketDistributorLock sync.Mutex func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address) (*rocketpool.Contract, error) { rocketDistributorLock.Lock() defer rocketDistributorLock.Unlock() - return rp.MakeContract("rocketNodeDistributor", distributorAddress) + return rp.MakeContract("rocketNodeDistributorDelegate", distributorAddress) } From 6456136e155717bed4c0a81382c0ff5fc828e85d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 19 May 2022 02:45:51 -0400 Subject: [PATCH 478/878] Updated the RewardsSubmission struct --- rewards/distributor-mainnet.go | 13 ------------- rewards/rewards.go | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index 7850d4a40..20f6d53bd 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -23,19 +23,6 @@ func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common. return *isClaimed, nil } -// Get the bitmap of intervals that the node has claimed so far -func ClaimedBitMap(rp *rocketpool.RocketPool, claimerAddress common.Address, bucket *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) - if err != nil { - return nil, err - } - bitmap := new(*big.Int) - if err := rocketDistributorMainnet.Call(opts, bitmap, "claimedBitMap", claimerAddress, bucket); err != nil { - return nil, fmt.Errorf("Could not get claim bitmap for bucket %s, node %s: %w", bucket.String(), claimerAddress.Hex(), err) - } - return *bitmap, nil -} - // Get the Merkle root for an interval func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOpts) ([]byte, error) { rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) diff --git a/rewards/rewards.go b/rewards/rewards.go index e69a4ce76..d8ed7b287 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -32,16 +32,16 @@ type RewardsEvent struct { // Struct for submitting the rewards for a checkpoint type RewardSubmission struct { - RewardIndex *big.Int `abi:"rewardIndex"` - ExecutionBlock *big.Int `abi:"executionBlock"` - ConsensusBlock *big.Int `abi:"consensusBlock"` - MerkleRoot common.Hash `abi:"merkleRoot"` - MerkleTreeCID string `abi:"merkleTreeCID"` - IntervalsPassed *big.Int `abi:"intervalsPassed"` - TreasuryRPL *big.Int `abi:"treasuryRPL"` - TrustedNodeRPL []*big.Int `abi:"trustedNodeRPL"` - NodeRPL []*big.Int `abi:"nodeRPL"` - NodeETH []*big.Int `abi:"nodeETH"` + RewardIndex *big.Int `json:"rewardIndex"` + ExecutionBlock *big.Int `json:"executionBlock"` + ConsensusBlock *big.Int `json:"consensusBlock"` + MerkleRoot [32]byte `json:"merkleRoot"` + MerkleTreeCID string `json:"merkleTreeCID"` + IntervalsPassed *big.Int `json:"intervalsPassed"` + TreasuryRPL *big.Int `json:"treasuryRPL"` + TrustedNodeRPL []*big.Int `json:"trustedNodeRPL"` + NodeRPL []*big.Int `json:"nodeRPL"` + NodeETH []*big.Int `json:"nodeETH"` } // Get the index of the active rewards period From ddd5994e5e2b306b5b388c2b34d394584fa7041b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 19 May 2022 03:15:44 -0400 Subject: [PATCH 479/878] Unpacked the RewardsSubmission struct via reflection shenanigans --- rewards/rewards.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index d8ed7b287..935242947 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -3,6 +3,7 @@ package rewards import ( "fmt" "math/big" + "reflect" "sync" "time" @@ -201,7 +202,9 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the decoded data - submission := values["submission"].(RewardSubmission) + submissionPrototype := RewardSubmission{} + submissionType := reflect.TypeOf(submissionPrototype) + submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) eventIntervalStartTime := values["intervalStartTime"].(*big.Int) eventIntervalEndTime := values["intervalEndTime"].(*big.Int) submissionTime := values["time"].(*big.Int) From 9f6b0e7101997ce6abc1f13a81fdd6c4508b2c82 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 8 Jun 2022 02:03:11 -0400 Subject: [PATCH 480/878] Added GetNodeFeeRaw --- minipool/minipool-contract.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 4ba4bb317..81b796535 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -3,12 +3,13 @@ package minipool import ( "context" "fmt" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "math/big" "sync" "time" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -228,6 +229,13 @@ func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { } return eth.WeiToEth(*nodeFee), nil } +func (mp *Minipool) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { + nodeFee := new(*big.Int) + if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + } + return *nodeFee, nil +} func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { From b3b1a6cee8eac5d42174ed1d25b1a675ff6b3ae3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Jun 2022 02:53:38 -0400 Subject: [PATCH 481/878] Added GetMinipoolPenaltyCount --- minipool/minipool.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index a266df4e9..1cd622ab0 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -525,6 +526,16 @@ func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress return *withdrawalCredentials, nil } +// Get the number of penalties applied to a minipool +func GetMinipoolPenaltyCount(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (uint64, error) { + key := crypto.Keccak256Hash([]byte("network.penalties.penalty"), minipoolAddress.Bytes()) + penalties, err := rp.RocketStorage.GetUint(opts, key) + if err != nil { + return 0, err + } + return penalties.Uint64(), nil +} + // Get contracts var rocketMinipoolManagerLock sync.Mutex From e8873c92846444894c0192136e6759163a694733 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 14 Jun 2022 01:08:09 -0400 Subject: [PATCH 482/878] Added GetSmoothingPoolRegisteredNodeCount --- node/node.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/node/node.go b/node/node.go index bb31718aa..1f1a52b82 100644 --- a/node/node.go +++ b/node/node.go @@ -24,8 +24,9 @@ import ( // Settings const ( - NodeAddressBatchSize = 50 - NodeDetailsBatchSize = 20 + NodeAddressBatchSize = 50 + NodeDetailsBatchSize = 20 + SmoothingPoolCountBatchSize uint64 = 2000 ) // Node details @@ -37,6 +38,30 @@ type NodeDetails struct { TimezoneLocation string `json:"timezoneLocation"` } +// Node details +type nodeDetails_Native struct { + exists bool + registrationTime *big.Int + timezoneLocation string + feeDistributorInitialised bool + feeDistributorAddress common.Address + rewardNetwork *big.Int + rplStake *big.Int + effectiveRPLStake *big.Int + minimumRPLStake *big.Int + maximumRPLStake *big.Int + minipoolLimit *big.Int + minipoolCount *big.Int + balanceETH *big.Int + balanceRETH *big.Int + balanceRPL *big.Int + balanceOldRPL *big.Int + withdrawalAddress common.Address + pendingWithdrawalAddress common.Address + smoothingPoolRegistrationState bool + smoothingPoolRegistrationChanged *big.Int +} + // Count of nodes belonging to a timezone type TimezoneCount struct { Timezone string `abi:"timezone"` @@ -67,6 +92,11 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint return *version, nil } +// Get the details for a node +/*func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) { + +}*/ + // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { @@ -837,6 +867,56 @@ func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, op return hash, nil } +// Get the number of nodes in the Smoothing Pool +func GetSmoothingPoolRegisteredNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return 0, err + } + + // Get the number of nodes + nodeCount, err := GetNodeCount(rp, opts) + if err != nil { + return 0, err + } + + iterations := uint64(math.Ceil(float64(nodeCount) / float64(SmoothingPoolCountBatchSize))) + iterationCounts := make([]*big.Int, iterations) + + // Load addresses + var wg errgroup.Group + for i := uint64(0); i < iterations; i++ { + i := i + offset := i * SmoothingPoolCountBatchSize + limit := SmoothingPoolCountBatchSize + if nodeCount-offset < SmoothingPoolCountBatchSize { + limit = nodeCount - offset + } + wg.Go(func() error { + count := new(*big.Int) + err := rocketNodeManager.Call(opts, count, "getSmoothingPoolRegisteredNodeCount", big.NewInt(int64(offset)), big.NewInt(int64(limit))) + if err != nil { + return fmt.Errorf("Could not get smoothing pool opt-in count for batch starting at %d: %w", offset, err) + } + + iterationCounts[i] = *count + return nil + }) + } + + if err := wg.Wait(); err != nil { + return 0, err + } + + total := uint64(0) + for _, count := range iterationCounts { + total += count.Uint64() + } + + return total, nil + +} + // Get contracts var rocketNodeManagerLock sync.Mutex From 46f5d79fd1b5e3afe74d623d29299388dcc04394 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 14 Jun 2022 01:15:19 -0400 Subject: [PATCH 483/878] Added GetRewardSnapshotEventWithUpgrades --- rewards/rewards.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index 935242947..4200cd7dd 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -228,6 +228,65 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } +// Get the event info for a rewards snapshot +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (RewardsEvent, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return RewardsEvent{}, err + } + + rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) + + // Construct a filter query for relevant logs + indexBig := big.NewInt(0).SetUint64(index) + indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) + addressFilter := rocketRewardsPoolAddresses + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return RewardsEvent{}, err + } + + // Get the log info + values := make(map[string]interface{}) + if len(logs) == 0 { + return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + } + if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + return RewardsEvent{}, err + } + + // Get the decoded data + submissionPrototype := RewardSubmission{} + submissionType := reflect.TypeOf(submissionPrototype) + submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) + eventIntervalStartTime := values["intervalStartTime"].(*big.Int) + eventIntervalEndTime := values["intervalEndTime"].(*big.Int) + submissionTime := values["time"].(*big.Int) + eventData := RewardsEvent{ + Index: indexBig, + ExecutionBlock: submission.ExecutionBlock, + ConsensusBlock: submission.ConsensusBlock, + IntervalsPassed: submission.IntervalsPassed, + TreasuryRPL: submission.TreasuryRPL, + TrustedNodeRPL: submission.TrustedNodeRPL, + NodeRPL: submission.NodeRPL, + NodeETH: submission.NodeETH, + MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleTreeCID: submission.MerkleTreeCID, + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(submissionTime.Int64(), 0), + } + + return eventData, nil + +} + // Get contracts var rocketRewardsPoolLock sync.Mutex From 2570b69954c23e9e6c447bb4c3fc8ca5d53d42e7 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Jul 2022 00:45:40 -0400 Subject: [PATCH 484/878] Added HeaderByHash to the EC interface --- rocketpool/ec-interface.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rocketpool/ec-interface.go b/rocketpool/ec-interface.go index 4f28628d7..5e44a2377 100644 --- a/rocketpool/ec-interface.go +++ b/rocketpool/ec-interface.go @@ -28,6 +28,9 @@ type ExecutionClient interface { /// ContractTransactor Functions /// ============================ + // HeaderByHash returns the block header with the given hash. + HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) + // HeaderByNumber returns a block header from the current canonical chain. If number is // nil, the latest known header is returned. HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) From b72982f4d4789645c4fe740644bbaf3d9b490fd3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Jul 2022 01:12:10 -0400 Subject: [PATCH 485/878] Added UserETH to RewardsSubmission --- legacy/v1.5.0-rc1/rewards/rewards.go | 297 +++++++++++++++++++++++++++ rewards/rewards.go | 1 + 2 files changed, 298 insertions(+) create mode 100644 legacy/v1.5.0-rc1/rewards/rewards.go diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go new file mode 100644 index 000000000..4200cd7dd --- /dev/null +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -0,0 +1,297 @@ +package rewards + +import ( + "fmt" + "math/big" + "reflect" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Info for a rewards snapshot event +type RewardsEvent struct { + Index *big.Int + ExecutionBlock *big.Int + ConsensusBlock *big.Int + MerkleRoot common.Hash + MerkleTreeCID string + IntervalsPassed *big.Int + TreasuryRPL *big.Int + TrustedNodeRPL []*big.Int + NodeRPL []*big.Int + NodeETH []*big.Int + IntervalStartTime time.Time + IntervalEndTime time.Time + SubmissionTime time.Time +} + +// Struct for submitting the rewards for a checkpoint +type RewardSubmission struct { + RewardIndex *big.Int `json:"rewardIndex"` + ExecutionBlock *big.Int `json:"executionBlock"` + ConsensusBlock *big.Int `json:"consensusBlock"` + MerkleRoot [32]byte `json:"merkleRoot"` + MerkleTreeCID string `json:"merkleTreeCID"` + IntervalsPassed *big.Int `json:"intervalsPassed"` + TreasuryRPL *big.Int `json:"treasuryRPL"` + TrustedNodeRPL []*big.Int `json:"trustedNodeRPL"` + NodeRPL []*big.Int `json:"nodeRPL"` + NodeETH []*big.Int `json:"nodeETH"` +} + +// Get the index of the active rewards period +func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + index := new(*big.Int) + if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { + return nil, fmt.Errorf("Could not get current reward index: %w", err) + } + return *index, nil +} + +// Get the timestamp that the current rewards interval started +func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return time.Time{}, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { + return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + } + return time.Unix((*unixTime).Int64(), 0), nil +} + +// Get the number of seconds in a claim interval +func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return 0, err + } + unixTime := new(*big.Int) + if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { + return 0, fmt.Errorf("Could not get claim interval time: %w", err) + } + return time.Duration((*unixTime).Int64()) * time.Second, nil +} + +// Get the percent of checkpoint rewards that goes to node operators +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the percent of checkpoint rewards that goes to ODAO members +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the percent of checkpoint rewards that goes to the PDAO +func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { + return nil, fmt.Errorf("Could not get protocol DAO rewards percent: %w", err) + } + return *perc, nil +} + +// Get the amount of RPL rewards that will be provided to node operators +func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rewards := new(*big.Int) + if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { + return nil, fmt.Errorf("Could not get pending RPL rewards: %w", err) + } + return *rewards, nil +} + +// Get the amount of ETH rewards that will be provided to node operators +func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return nil, err + } + rewards := new(*big.Int) + if err := rocketRewardsPool.Call(opts, rewards, "getPendingETHRewards"); err != nil { + return nil, fmt.Errorf("Could not get pending ETH rewards: %w", err) + } + return *rewards, nil +} + +// Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketRewardsPool.GetTransactionGasInfo(opts, "submitRewardSnapshot", submission) +} + +// Submit a Merkle Tree-based snapshot for a rewards interval +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (common.Hash, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return common.Hash{}, err + } + hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) + } + return hash, nil +} + +// Get the event info for a rewards snapshot +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int) (RewardsEvent, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return RewardsEvent{}, err + } + + // Construct a filter query for relevant logs + indexBig := big.NewInt(0).SetUint64(index) + indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) + addressFilter := []common.Address{*rocketRewardsPool.Address} + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return RewardsEvent{}, err + } + + // Get the log info + values := make(map[string]interface{}) + if len(logs) == 0 { + return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + } + if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + return RewardsEvent{}, err + } + + // Get the decoded data + submissionPrototype := RewardSubmission{} + submissionType := reflect.TypeOf(submissionPrototype) + submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) + eventIntervalStartTime := values["intervalStartTime"].(*big.Int) + eventIntervalEndTime := values["intervalEndTime"].(*big.Int) + submissionTime := values["time"].(*big.Int) + eventData := RewardsEvent{ + Index: indexBig, + ExecutionBlock: submission.ExecutionBlock, + ConsensusBlock: submission.ConsensusBlock, + IntervalsPassed: submission.IntervalsPassed, + TreasuryRPL: submission.TreasuryRPL, + TrustedNodeRPL: submission.TrustedNodeRPL, + NodeRPL: submission.NodeRPL, + NodeETH: submission.NodeETH, + MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleTreeCID: submission.MerkleTreeCID, + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(submissionTime.Int64(), 0), + } + + return eventData, nil + +} + +// Get the event info for a rewards snapshot +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (RewardsEvent, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp) + if err != nil { + return RewardsEvent{}, err + } + + rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) + + // Construct a filter query for relevant logs + indexBig := big.NewInt(0).SetUint64(index) + indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) + addressFilter := rocketRewardsPoolAddresses + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + if err != nil { + return RewardsEvent{}, err + } + + // Get the log info + values := make(map[string]interface{}) + if len(logs) == 0 { + return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + } + if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + return RewardsEvent{}, err + } + + // Get the decoded data + submissionPrototype := RewardSubmission{} + submissionType := reflect.TypeOf(submissionPrototype) + submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) + eventIntervalStartTime := values["intervalStartTime"].(*big.Int) + eventIntervalEndTime := values["intervalEndTime"].(*big.Int) + submissionTime := values["time"].(*big.Int) + eventData := RewardsEvent{ + Index: indexBig, + ExecutionBlock: submission.ExecutionBlock, + ConsensusBlock: submission.ConsensusBlock, + IntervalsPassed: submission.IntervalsPassed, + TreasuryRPL: submission.TreasuryRPL, + TrustedNodeRPL: submission.TrustedNodeRPL, + NodeRPL: submission.NodeRPL, + NodeETH: submission.NodeETH, + MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleTreeCID: submission.MerkleTreeCID, + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(submissionTime.Int64(), 0), + } + + return eventData, nil + +} + +// Get contracts +var rocketRewardsPoolLock sync.Mutex + +func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + rocketRewardsPoolLock.Lock() + defer rocketRewardsPoolLock.Unlock() + return rp.GetContract("rocketRewardsPool") +} diff --git a/rewards/rewards.go b/rewards/rewards.go index 4200cd7dd..9a78a677a 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -43,6 +43,7 @@ type RewardSubmission struct { TrustedNodeRPL []*big.Int `json:"trustedNodeRPL"` NodeRPL []*big.Int `json:"nodeRPL"` NodeETH []*big.Int `json:"nodeETH"` + UserETH *big.Int `json:"userETH"` } // Get the index of the active rewards period From 83eb40e596fb9e7d855b8521a1aa7660f017af5a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Jul 2022 01:54:56 -0400 Subject: [PATCH 486/878] Added a found flag to GetRewardSnapshotEventWithUpgrades --- legacy/v1.5.0-rc1/rewards/rewards.go | 12 ++++++------ rewards/rewards.go | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go index 4200cd7dd..eaf3e97d3 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -229,11 +229,11 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) @@ -248,16 +248,16 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) if err != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } // Get the log info values := make(map[string]interface{}) if len(logs) == 0 { - return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + return false, RewardsEvent{}, nil } if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } // Get the decoded data @@ -283,7 +283,7 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, SubmissionTime: time.Unix(submissionTime.Int64(), 0), } - return eventData, nil + return true, eventData, nil } diff --git a/rewards/rewards.go b/rewards/rewards.go index 9a78a677a..1897db0a0 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -230,11 +230,11 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) @@ -249,16 +249,16 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) if err != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } // Get the log info values := make(map[string]interface{}) if len(logs) == 0 { - return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) + return false, RewardsEvent{}, nil } if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { - return RewardsEvent{}, err + return false, RewardsEvent{}, err } // Get the decoded data @@ -284,7 +284,7 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, SubmissionTime: time.Unix(submissionTime.Int64(), 0), } - return eventData, nil + return true, eventData, nil } From 8f372c3ef57f85843704667bacf73e9f6a34c6f9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Jul 2022 02:13:36 -0400 Subject: [PATCH 487/878] Added UserETH to the rewards event --- rewards/rewards.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index 1897db0a0..d9f36f438 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -26,6 +26,7 @@ type RewardsEvent struct { TrustedNodeRPL []*big.Int NodeRPL []*big.Int NodeETH []*big.Int + UserETH *big.Int IntervalStartTime time.Time IntervalEndTime time.Time SubmissionTime time.Time @@ -218,6 +219,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz TrustedNodeRPL: submission.TrustedNodeRPL, NodeRPL: submission.NodeRPL, NodeETH: submission.NodeETH, + UserETH: submission.UserETH, MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), MerkleTreeCID: submission.MerkleTreeCID, IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), From 0295158036b2a9f17e410e425e06720505493f47 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Jul 2022 03:06:56 -0400 Subject: [PATCH 488/878] Added a v1.5.0-rc1 legacy manager --- legacy/v1.5.0-rc1/rewards/rewards.go | 61 ++++++++++++++++------------ rocketpool/v1.5.0-rc1-manager.go | 54 ++++++++++++++++++++++++ rocketpool/version-manager.go | 12 +++--- 3 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 rocketpool/v1.5.0-rc1-manager.go diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go index eaf3e97d3..cca2b97fe 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -46,8 +46,8 @@ type RewardSubmission struct { } // Get the index of the active rewards period -func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -59,8 +59,8 @@ func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, e } // Get the timestamp that the current rewards interval started -func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return time.Time{}, err } @@ -72,8 +72,8 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } // Get the number of seconds in a claim interval -func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Duration, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return 0, err } @@ -85,8 +85,8 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. } // Get the percent of checkpoint rewards that goes to node operators -func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -98,8 +98,8 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt } // Get the percent of checkpoint rewards that goes to ODAO members -func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -111,8 +111,8 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. } // Get the percent of checkpoint rewards that goes to the PDAO -func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -124,8 +124,8 @@ func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts } // Get the amount of RPL rewards that will be provided to node operators -func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -137,8 +137,8 @@ func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Get the amount of ETH rewards that will be provided to node operators -func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return nil, err } @@ -150,8 +150,8 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval -func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts, legacyRocketRewardsPoolAddress *common.Address) (rocketpool.GasInfo, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return rocketpool.GasInfo{}, err } @@ -159,8 +159,8 @@ func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission Rewar } // Submit a Merkle Tree-based snapshot for a rewards interval -func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (common.Hash, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) +func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts, legacyRocketRewardsPoolAddress *common.Address) (common.Hash, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return common.Hash{}, err } @@ -172,9 +172,9 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } // Get the event info for a rewards snapshot -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int) (RewardsEvent, error) { +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address) (RewardsEvent, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { return RewardsEvent{}, err } @@ -230,14 +230,17 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz // Get the event info for a rewards snapshot func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { + + if len(rocketRewardsPoolAddresses) == 0 { + return false, RewardsEvent{}, fmt.Errorf("rocketRewardsPoolAddresses must have at least one element.") + } + // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, &rocketRewardsPoolAddresses[0]) if err != nil { return false, RewardsEvent{}, err } - rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) - // Construct a filter query for relevant logs indexBig := big.NewInt(0).SetUint64(index) indexBytes := [32]byte{} @@ -290,8 +293,12 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, // Get contracts var rocketRewardsPoolLock sync.Mutex -func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() - return rp.GetContract("rocketRewardsPool") + if address == nil { + return rp.VersionManager.V1_5_0_RC1.GetContract("rocketRewardsPool") + } else { + return rp.VersionManager.V1_5_0_RC1.GetContractWithAddress("rocketRewardsPool", *address) + } } diff --git a/rocketpool/v1.5.0-rc1-manager.go b/rocketpool/v1.5.0-rc1-manager.go new file mode 100644 index 000000000..59dd9b29b --- /dev/null +++ b/rocketpool/v1.5.0-rc1-manager.go @@ -0,0 +1,54 @@ +package rocketpool + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/hashicorp/go-version" +) + +// A wrapper that holds the updated contract information for this version +type LegacyVersionWrapper_v1_5_0_rc1 struct { + rp *RocketPool + rpVersion *version.Version + contractNameMap map[string]string + abiMap map[string]string +} + +// Creates a new wrapper for this version +func newLegacyVersionWrapper_v1_5_0_rc1(rp *RocketPool) *LegacyVersionWrapper_v1_5_0_rc1 { + rpVersion, _ := version.NewSemver("1.5.0-rc1") + return &LegacyVersionWrapper_v1_5_0_rc1{ + rp: rp, + rpVersion: rpVersion, + contractNameMap: map[string]string{ + "rocketRewardsPool": "rocketRewardsPool.v2", + }, + abiMap: map[string]string{ + "rocketRewardsPool": "eNrtWFFvmzAQ/isTzzy12lTlbc0qLVI3RUneoggZuGSoYCP7nBZV/e87ExpDgISkkco03hJ8/u67s7+7g+WrE/FUo3JGS/MTQXIWL7IUnJETCI6SBfhlJoInwDkKyTYwMUZrFoDjOpwlxtCTZYPvYShBKVrGHQ4rHrytXEchQ/ilkflRHGFGq1zwlGXMj8HuIM8KpQ4I0HlzXx1GRlkiNNFcs1iBW2UdwguEzoh25CuVIDT9v/n6zZKV8MxkODGbrMN3K+MsEEkqOPDmpJyPdwqAyAcaI8HvY0rjZRgmYcCVVt0x/AxB3d5YjATkUwwzIdDufzdq2E8HFPHN4faFBBhPfliEwqxLEPn6ls53ypSiA70oEyiBKS2z2fTxHIDlqgyhFUL4W4TQhEKm3XD4NQAeFj8bAVauvfh7TRwekDbize/nXPtJpBTdMguvys8KD6hTEuKO3lH01tObI5O4iBJoS/9lsA88vB4oNiOt9gZF0jhL1Z+yHmBLdeGjJYntC2ThbS1F0lAu3aG2DbVtqG09qG1n1oucEGL5mG3h2JcJu3sLsmAqNLZNY8brnaVUpXPXMlxtI3i2lmvNAyPGNh4bwFlF8SfoVHLUnJ9rUJo+3rOY8Xzi7AWjKfCQhE/EdulSPSNGuuoZsXHMomRS1EDTx/MpobfseknMto7P4nayT3qBIUyPxsWrY71X1uMrmU9BBv2Lr9y2ahGqwxCLBtYepOocZdlxW6O8UqS1mdQrTQrtb/Qdhhbv+BBZSdXC+iz30COZ8oWIm5KUP/9IfoZJeZiU/5FJ+bzJ2DsyGlfEaDePheb4qXV5UOOgxv9YjbkR1j5KWT12/rI+CGwQ2CCwmsB21xGuq7DVX65rPsI=", + }, + } +} + +// Get the version for this manager +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetVersion() *version.Version { + return m.rpVersion +} + +// Get the versioned name of the contract if it was upgraded as part of this deployment +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetVersionedContractName(contractName string) (string, bool) { + legacyName, exists := m.contractNameMap[contractName] + return legacyName, exists +} + +// Get the ABI for the provided contract +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetEncodedABI(contractName string) string { + return m.abiMap[contractName] +} + +// Get the contract with the provided name for this version of Rocket Pool +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContract(contractName string) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m) +} + +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { + return getLegacyContractWithAddress(m.rp, contractName, address, m) +} diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index e71d0d4f5..c0eb6e9e8 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -20,15 +20,17 @@ type LegacyVersionWrapper interface { } type VersionManager struct { - V1_0_0 LegacyVersionWrapper + V1_0_0 LegacyVersionWrapper + V1_5_0_RC1 LegacyVersionWrapper rp *RocketPool } func NewVersionManager(rp *RocketPool) *VersionManager { return &VersionManager{ - V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), - rp: rp, + V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), + V1_5_0_RC1: newLegacyVersionWrapper_v1_5_0_rc1(rp), + rp: rp, } } @@ -37,7 +39,7 @@ func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapp legacyName, exists := m.GetVersionedContractName(contractName) if !exists { - // This wasn't upgraded in v1.0.0 + // This wasn't upgraded in previous versions return rp.GetContract(contractName) } @@ -58,7 +60,7 @@ func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapp } if address == emptyAddress { - // Not found, so v1.0.0 is still on the network - try loading the original contract name instead + // Not found, so the legacy contract is still on the network - try loading the original contract name instead return rp.GetContract(contractName) } From aff06fcb65ba630fe51d31a89b825e67fbe87b4e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 27 Jul 2022 20:53:30 -0400 Subject: [PATCH 489/878] Updated the v1.5.0-rc1 ABI for RocketRewardsPool --- rocketpool/v1.5.0-rc1-manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpool/v1.5.0-rc1-manager.go b/rocketpool/v1.5.0-rc1-manager.go index 59dd9b29b..30a7f3447 100644 --- a/rocketpool/v1.5.0-rc1-manager.go +++ b/rocketpool/v1.5.0-rc1-manager.go @@ -23,7 +23,7 @@ func newLegacyVersionWrapper_v1_5_0_rc1(rp *RocketPool) *LegacyVersionWrapper_v1 "rocketRewardsPool": "rocketRewardsPool.v2", }, abiMap: map[string]string{ - "rocketRewardsPool": "eNrtWFFvmzAQ/isTzzy12lTlbc0qLVI3RUneoggZuGSoYCP7nBZV/e87ExpDgISkkco03hJ8/u67s7+7g+WrE/FUo3JGS/MTQXIWL7IUnJETCI6SBfhlJoInwDkKyTYwMUZrFoDjOpwlxtCTZYPvYShBKVrGHQ4rHrytXEchQ/ilkflRHGFGq1zwlGXMj8HuIM8KpQ4I0HlzXx1GRlkiNNFcs1iBW2UdwguEzoh25CuVIDT9v/n6zZKV8MxkODGbrMN3K+MsEEkqOPDmpJyPdwqAyAcaI8HvY0rjZRgmYcCVVt0x/AxB3d5YjATkUwwzIdDufzdq2E8HFPHN4faFBBhPfliEwqxLEPn6ls53ypSiA70oEyiBKS2z2fTxHIDlqgyhFUL4W4TQhEKm3XD4NQAeFj8bAVauvfh7TRwekDbize/nXPtJpBTdMguvys8KD6hTEuKO3lH01tObI5O4iBJoS/9lsA88vB4oNiOt9gZF0jhL1Z+yHmBLdeGjJYntC2ThbS1F0lAu3aG2DbVtqG09qG1n1oucEGL5mG3h2JcJu3sLsmAqNLZNY8brnaVUpXPXMlxtI3i2lmvNAyPGNh4bwFlF8SfoVHLUnJ9rUJo+3rOY8Xzi7AWjKfCQhE/EdulSPSNGuuoZsXHMomRS1EDTx/MpobfseknMto7P4nayT3qBIUyPxsWrY71X1uMrmU9BBv2Lr9y2ahGqwxCLBtYepOocZdlxW6O8UqS1mdQrTQrtb/Qdhhbv+BBZSdXC+iz30COZ8oWIm5KUP/9IfoZJeZiU/5FJ+bzJ2DsyGlfEaDePheb4qXV5UOOgxv9YjbkR1j5KWT12/rI+CGwQ2CCwmsB21xGuq7DVX65rPsI=", + "rocketRewardsPool": "eJztWdtu2zgQ/ZWFnv2gC6lL3rbZAhugWxiJ3wLDGJHDVKhMGSSV1ij676UUNZJs+ZZ1ARXVk21yeDjnjGY4lB+/OZnclEY7N4/VV4NKQr7YbtC5cVghjQJm/rov2Gc0D6ZQ8IR3lZEAhs7MkbCuDFeqa/A35wq1ttPmBQeage/LmaMNGPyvNJBmeWa2dlYWcgNbSHNsV9idtVEls4B2UGdPEkypdme+z745YJdv10VpCQjINc76fDh+Re7c2BX1TI9eaX/7NGxpKPwCit9Vi1pXflpVm7FivSkkymG5Lsc7BWCdZ6XJCvkutwK/DaMSDKUu9fkY6dagDvwWY43qc473RWHa9T+NBtbbAGXyaXf5QiHe3v3TIjRm55Co559tfOegtQ3om5QwCkGXans//3AJwOOyC1Fqg/xjwXEIxZqehyOvAfB+8e8gwHLWPvivObEboLJK6/r5fCjTdaa1fcpaeN0da3Yw5cam6It7R9EPRu/BgDKLbI2H5H8b7HvJrwdqhpGWrwaNaBI2+lM3H/DZ1oWdYuV+5SkPOKaEhC53eYiYMkIJJiKlHjKG3Is540lkPykK4XHqh24EFHjIYzdM/m+Ng9da3LgvVLEeqMyzqVhOxXIqliMolhcWoNohY7phHq5EiUiCIGEh8xM3JIS5AefCVibBiE8x4BEVGIacB7EgFKkPwL3IgwTQDVLfTxoyTd1p3XlG1VAvSnOok6xoxC3HPr/4QGP4nOGX1lKUkpmXjeoeECzHplT1iVIiOOHUPeTwE5r7Xq054XcvOsORuZrvwveYR112zPf5h3eQg6z77xG57ntJjKF/zPU5Sm6LmGXwEgA9LgaRTQThYXSagS0mo2SQxl7KgXpHGNzmkK3vmhOiapvqpmxkNCAgLCXpJTTGxYC64IsI6bkM2qN6RCRcEsRRxHcK6ckGZsUqZnbotnl9sN/E7AvRMZ+jYuMSQoQQiBDFWUJ0G489KfSuFk0LclgNfbYc3Y0PtTpXk4Rxe8iix05Isnf9WHWawsPvic7oT1fH7ws9TRftnt126YikaVHkQ2rW49c9Nl2CPriwK+R0e5puT7/J7emy29LqyHWpl7Xt4tuilCNrUWgCjARs70iY0nZK2z84bWsjs/eKtE3cs/8B6mRiP/MCFgL47pR5U+ZNmbfceRzxl6YeCUgc8foo/QHwlCkA", }, } } From 0c5579dbec600fc06450bf510399b25ad91f27bb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 31 Aug 2022 00:19:37 -0400 Subject: [PATCH 490/878] GetNodeEffectiveRPLStake() now returns 0 if the value is below the node's minimum RPL stake --- node/staking.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/node/staking.go b/node/staking.go index ee1e15d1f..a8efbf0ae 100644 --- a/node/staking.go +++ b/node/staking.go @@ -56,11 +56,23 @@ func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addr if err != nil { return nil, err } - nodeEffectiveRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStake, "getNodeEffectiveRPLStake", nodeAddress); err != nil { + nodeEffectiveRplStakeWrapper := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStakeWrapper, "getNodeEffectiveRPLStake", nodeAddress); err != nil { return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) } - return *nodeEffectiveRplStake, nil + + minimumStake, err := GetNodeMinimumRPLStake(rp, nodeAddress, opts) + if err != nil { + return nil, fmt.Errorf("Could not get minimum node RPL stake to verify effective stake: %w", err) + } + + nodeEffectiveRplStake := *nodeEffectiveRplStakeWrapper + if nodeEffectiveRplStake.Cmp(minimumStake) == -1 { + // Effective stake should be zero if it's less than the minimum RPL stake + return big.NewInt(0), nil + } + + return nodeEffectiveRplStake, nil } // Get a node's minimum RPL stake to collateralize their minipools From efe5d791b6d382c46484f26a62a9852d9497e7fd Mon Sep 17 00:00:00 2001 From: RamiRond Date: Mon, 29 Aug 2022 21:10:46 +0200 Subject: [PATCH 491/878] low level interface --- minipool/queue.go | 11 ++++++ storage/address-queue-storage.go | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 storage/address-queue-storage.go diff --git a/minipool/queue.go b/minipool/queue.go index 0a266c7d0..9ccbb92de 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -10,6 +10,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/storage" ) // Minipool queue lengths @@ -179,6 +180,16 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. return *capacity, nil } +// Get a minipools position in queue +func (mp *Minipool) GetMinipoolPositionInQueue(opts *bind.CallOpts) (uint64, error) { + + index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, [32]byte("minipools.available.half"), mp.Address); + if err != nil { + return 0, err + } + return index, nil +} + // Get contracts var rocketMinipoolQueueLock sync.Mutex diff --git a/storage/address-queue-storage.go b/storage/address-queue-storage.go new file mode 100644 index 000000000..37d45f00f --- /dev/null +++ b/storage/address-queue-storage.go @@ -0,0 +1,61 @@ +package storage + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// low-level address queue storage interface. Currently only used for the minipool queue. + +// Return the length of all addresses matching the given key in the queue +func GetAddressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte) (uint64, error) { + addressQueueStorage, err := getAddressQueueStorage(rp) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := addressQueueStorage.Call(opts, length, "getIndexOf", key); err != nil { + return 0, fmt.Errorf("Could not get address queue length for key %s: %w", key, err) + } + return (*length).Uint64(), nil +} + +// Return address item at index for the given key +func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, index uint64) (common.Address, error) { + addressQueueStorage, err := getAddressQueueStorage(rp) + if err != nil { + return common.Address{}, err + } + address := new(common.Address) + if err := addressQueueStorage.Call(opts, address, "getItem", key, index); err != nil { + return common.Address{}, fmt.Errorf("Could not get address item at index %d for key %s: %w", index, key, err) + } + return *address, nil +} + +// Return index of the input address for the given key +func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, address common.Address) (uint64, error) { + addressQueueStorage, err := getAddressQueueStorage(rp) + if err != nil { + return 0, err + } + index := new(*big.Int) + if err := addressQueueStorage.Call(opts, index, "getIndexOf", key, address); err != nil { + return 0, fmt.Errorf("Could not get index for address %s for key %s: %w", address.String(), key, err) + } + return (*index).Uint64(), nil +} + +// Get contracts +var AddressQueueStorageLock sync.Mutex + +func getAddressQueueStorage(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { + AddressQueueStorageLock.Lock() + defer AddressQueueStorageLock.Unlock() + return rp.GetContract("addressQueueStorage") +} From 424fcdf7e5db5c7fc2a78f2307415973e7430842 Mon Sep 17 00:00:00 2001 From: RamiRond Date: Mon, 29 Aug 2022 23:01:09 +0200 Subject: [PATCH 492/878] queue position query --- minipool/queue.go | 48 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/minipool/queue.go b/minipool/queue.go index 9ccbb92de..03b60f630 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -6,11 +6,12 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/crypto" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/storage" + rptypes "github.com/rocket-pool/rocketpool-go/types" ) // Minipool queue lengths @@ -181,13 +182,52 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Get a minipools position in queue -func (mp *Minipool) GetMinipoolPositionInQueue(opts *bind.CallOpts) (uint64, error) { +func GetMinipoolPositionInQueue(opts *bind.CallOpts, mp *Minipool) (uint64, error) { + depositType, err := mp.GetDepositType(opts) + if err != nil { + return 0, fmt.Errorf("Could not get deposit type: %w", err) + } + if depositType == rptypes.None { + return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.Address) + } + + queryIndex := func(key string) (uint64, error) { + return storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) + } + + position := uint64(0) + + // half cleared first + if depositType != rptypes.Half { + position, err = GetQueueLength(mp.RocketPool, rptypes.Half, opts) + if err != nil { + return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + } + } else { + return queryIndex("minipools.available.half") + } + + // full deposits next + if depositType != rptypes.Full { + length, err := GetQueueLength(mp.RocketPool, rptypes.Full, opts) + if err != nil { + return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + } + position += length + } else { + index, err := queryIndex("minipools.available.full") + if err != nil { + return 0, err + } + return position + index, nil + } - index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, [32]byte("minipools.available.half"), mp.Address); + // must be empty type now + index, err := queryIndex("minipools.available.empty") if err != nil { return 0, err } - return index, nil + return position + index, nil } // Get contracts From 2ccf4a71774eca3edf3d9d311a128be4697782e2 Mon Sep 17 00:00:00 2001 From: RamiRond Date: Wed, 31 Aug 2022 22:06:57 +0200 Subject: [PATCH 493/878] bug fixes --- minipool/queue.go | 116 +++++++++++++++++++++++++++++-- storage/address-queue-storage.go | 14 ++-- 2 files changed, 118 insertions(+), 12 deletions(-) diff --git a/minipool/queue.go b/minipool/queue.go index 03b60f630..b50f5b61b 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/crypto" @@ -29,6 +30,12 @@ type QueueCapacity struct { NextMinipool *big.Int } +// Minipools queue status details +type QueueDetails struct { + Position uint64 + TimeLeft time.Duration +} + // Get minipool queue lengths func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengths, error) { @@ -181,8 +188,69 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. return *capacity, nil } -// Get a minipools position in queue -func GetMinipoolPositionInQueue(opts *bind.CallOpts, mp *Minipool) (uint64, error) { +// Get Queue position details of a minipool +func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (QueueDetails, error) { + // Data + var wg errgroup.Group + var position uint64 + var timeLeft time.Duration + + // Load data + wg.Go(func() error { + var err error + position, err = GetQueuePositionOfMinipool(mp, opts) + return err + }) + wg.Go(func() error { + var err error + timeLeft, err = GetQueueDurationLeftEstimation(rp, mp, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueDetails{}, err + } + + // Return + return QueueDetails{ + Position: position, + TimeLeft: timeLeft, + }, nil +} + +// Get an estimate for how long a minipool is left in the queue. Based on the minipool at the first position. +func GetQueueDurationLeftEstimation(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (time.Duration, error) { + length, err := GetQueueTotalLength(rp, opts) + if err != nil { + return 0, fmt.Errorf("Could not get total queue length: %w", err) + } + if length <= 1 { + return 0, nil + } + + // get our minipool + MPDepositTimestamp, err := mp.GetStatusTime(opts) + if err != nil { + return 0, fmt.Errorf("Could not get status time of minipool %s: %w", mp.Address.String(), err) + } + + // get first minipool in queue + firstMP, err := GetQueueMinipoolAtPosition(rp, 0, opts) + if err != nil { + return 0, fmt.Errorf("Could not get minipool at queue position %d: %w", 0, err) + } + firstMPDepositTimestamp, err := firstMP.GetStatusTime(opts) + if err != nil { + return 0, fmt.Errorf("Could not get status time of minipool %s: %w", firstMP.Address.String(), err) + } + + // estimate + return MPDepositTimestamp.Sub(firstMPDepositTimestamp), nil +} + +// Get a minipools position in queue (1-indexed). 0 means it is currently not queued. +func GetQueuePositionOfMinipool(mp *Minipool, opts *bind.CallOpts) (uint64, error) { depositType, err := mp.GetDepositType(opts) if err != nil { return 0, fmt.Errorf("Could not get deposit type: %w", err) @@ -192,7 +260,11 @@ func GetMinipoolPositionInQueue(opts *bind.CallOpts, mp *Minipool) (uint64, erro } queryIndex := func(key string) (uint64, error) { - return storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) + index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) + if err != nil { + return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.Address, err) + } + return uint64(index + 1), nil } position := uint64(0) @@ -216,7 +288,7 @@ func GetMinipoolPositionInQueue(opts *bind.CallOpts, mp *Minipool) (uint64, erro position += length } else { index, err := queryIndex("minipools.available.full") - if err != nil { + if err != nil || index == 0 { return 0, err } return position + index, nil @@ -224,12 +296,46 @@ func GetMinipoolPositionInQueue(opts *bind.CallOpts, mp *Minipool) (uint64, erro // must be empty type now index, err := queryIndex("minipools.available.empty") - if err != nil { + if err != nil || index == 0 { return 0, err } return position + index, nil } +// Get the minipool at the specified position in queue (0-indexed). +func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts) (*Minipool, error) { + totalLength, err := GetQueueTotalLength(rp, opts) + if err != nil { + return nil, fmt.Errorf("Could not get total queue length: %w", err) + } + if position >= totalLength { + return nil, fmt.Errorf("Could not get index %d beyond queue length %d", position, totalLength) + } + lengths, err := GetQueueLengths(rp, opts) + if err != nil { + return nil, fmt.Errorf("Could not get queue lengths: %w", err) + } + + getMinipool := func(key string) (*Minipool, error) { + pos := big.NewInt(int64(position)) + address, err := storage.GetAddressQueueItem(rp, opts, crypto.Keccak256Hash([]byte(key)), pos) + if err != nil { + return nil, fmt.Errorf("Could not get address in queue at position %d: %w", position, err) + } + return NewMinipool(rp, address) + } + + if position < lengths.HalfDeposit { + return getMinipool("minipools.available.half") + } + position -= lengths.HalfDeposit + if position < lengths.FullDeposit { + return getMinipool("minipools.available.full") + } + position -= lengths.FullDeposit + return getMinipool("minipools.available.empty") +} + // Get contracts var rocketMinipoolQueueLock sync.Mutex diff --git a/storage/address-queue-storage.go b/storage/address-queue-storage.go index 37d45f00f..e4fc1d302 100644 --- a/storage/address-queue-storage.go +++ b/storage/address-queue-storage.go @@ -20,35 +20,35 @@ func GetAddressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [ } length := new(*big.Int) if err := addressQueueStorage.Call(opts, length, "getIndexOf", key); err != nil { - return 0, fmt.Errorf("Could not get address queue length for key %s: %w", key, err) + return 0, fmt.Errorf("Could not get address queue length for key: %w", key, err) } return (*length).Uint64(), nil } // Return address item at index for the given key -func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, index uint64) (common.Address, error) { +func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, index *big.Int) (common.Address, error) { addressQueueStorage, err := getAddressQueueStorage(rp) if err != nil { return common.Address{}, err } address := new(common.Address) if err := addressQueueStorage.Call(opts, address, "getItem", key, index); err != nil { - return common.Address{}, fmt.Errorf("Could not get address item at index %d for key %s: %w", index, key, err) + return common.Address{}, fmt.Errorf("Could not get address item at index %d: %w", index, key, err) } return *address, nil } -// Return index of the input address for the given key -func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, address common.Address) (uint64, error) { +// Return index of the input address for the given key. -1 if not present. +func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, address common.Address) (int64, error) { addressQueueStorage, err := getAddressQueueStorage(rp) if err != nil { return 0, err } index := new(*big.Int) if err := addressQueueStorage.Call(opts, index, "getIndexOf", key, address); err != nil { - return 0, fmt.Errorf("Could not get index for address %s for key %s: %w", address.String(), key, err) + return 0, fmt.Errorf("Could not get index for address %s: %w", address.String(), err) } - return (*index).Uint64(), nil + return (*index).Int64(), nil } // Get contracts From 29b7df71e2235596662c188fe7e3d14899b2d2c5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 1 Sep 2022 06:03:29 -0400 Subject: [PATCH 494/878] Added an explicit endBlock param to the rewards event getters --- legacy/v1.5.0-rc1/rewards/rewards.go | 14 ++++++++------ rewards/rewards.go | 14 ++++++++------ utils/eth/logs.go | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go index cca2b97fe..bf06a8a68 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -172,7 +172,7 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } // Get the event info for a rewards snapshot -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address) (RewardsEvent, error) { +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address) (RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) if err != nil { @@ -187,7 +187,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { return RewardsEvent{}, err } @@ -197,7 +197,8 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz if len(logs) == 0 { return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) } - if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { return RewardsEvent{}, err } @@ -229,7 +230,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { if len(rocketRewardsPoolAddresses) == 0 { return false, RewardsEvent{}, fmt.Errorf("rocketRewardsPoolAddresses must have at least one element.") @@ -249,7 +250,7 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { return false, RewardsEvent{}, err } @@ -259,7 +260,8 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, if len(logs) == 0 { return false, RewardsEvent{}, nil } - if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { return false, RewardsEvent{}, err } diff --git a/rewards/rewards.go b/rewards/rewards.go index d9f36f438..1f4e437ee 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -174,7 +174,7 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } // Get the event info for a rewards snapshot -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int) (RewardsEvent, error) { +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int) (RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -189,7 +189,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { return RewardsEvent{}, err } @@ -199,7 +199,8 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz if len(logs) == 0 { return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) } - if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { return RewardsEvent{}, err } @@ -232,7 +233,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp) if err != nil { @@ -249,7 +250,7 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { return false, RewardsEvent{}, err } @@ -259,7 +260,8 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, if len(logs) == 0 { return false, RewardsEvent{}, nil } - if rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) != nil { + err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { return false, RewardsEvent{}, err } diff --git a/utils/eth/logs.go b/utils/eth/logs.go index b66fa0f15..a653ab7fe 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -85,7 +85,7 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil } // Set the start and end, clamping on the latest block - intervalSize.Sub(intervalSize, big.NewInt(1)) + intervalSize := big.NewInt(0).Sub(intervalSize, big.NewInt(1)) start := fromBlock end := big.NewInt(0).Add(start, intervalSize) if end.Cmp(toBlock) == 1 { From 21e5fd03aaa4915bafb382ce99914ac1964e6bf1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Sep 2022 22:43:12 -0400 Subject: [PATCH 495/878] Increased the max gas limit to 30m --- rocketpool/contract.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 1d84442a7..f59d5d39a 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -18,7 +18,7 @@ import ( // Transaction settings const ( GasLimitMultiplier float64 = 1.5 - MaxGasLimit = 12000000 + MaxGasLimit uint64 = 30000000 ) // Contract type wraps go-ethereum bound contract @@ -148,7 +148,7 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint // Pad and return gas limit safeGasLimit := uint64(float64(gasLimit) * GasLimitMultiplier) if gasLimit > MaxGasLimit { - gasLimit = MaxGasLimit + return 0, 0, fmt.Errorf("estimated gas of %d is greater than the max gas limit of %d", gasLimit, MaxGasLimit) } if safeGasLimit > MaxGasLimit { safeGasLimit = MaxGasLimit From e0969fa2312cb36a105242a9a24eb2f5c4950b9f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 14 Sep 2022 01:03:16 -0400 Subject: [PATCH 496/878] Removed ETA from queue info --- minipool/queue.go | 54 ++--------------------------------------------- 1 file changed, 2 insertions(+), 52 deletions(-) diff --git a/minipool/queue.go b/minipool/queue.go index b50f5b61b..d0efa3c38 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -4,7 +4,6 @@ import ( "fmt" "math/big" "sync" - "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/crypto" @@ -33,7 +32,6 @@ type QueueCapacity struct { // Minipools queue status details type QueueDetails struct { Position uint64 - TimeLeft time.Duration } // Get minipool queue lengths @@ -190,65 +188,17 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. // Get Queue position details of a minipool func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (QueueDetails, error) { - // Data - var wg errgroup.Group - var position uint64 - var timeLeft time.Duration - - // Load data - wg.Go(func() error { - var err error - position, err = GetQueuePositionOfMinipool(mp, opts) - return err - }) - wg.Go(func() error { - var err error - timeLeft, err = GetQueueDurationLeftEstimation(rp, mp, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { + position, err := GetQueuePositionOfMinipool(mp, opts) + if err != nil { return QueueDetails{}, err } // Return return QueueDetails{ Position: position, - TimeLeft: timeLeft, }, nil } -// Get an estimate for how long a minipool is left in the queue. Based on the minipool at the first position. -func GetQueueDurationLeftEstimation(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (time.Duration, error) { - length, err := GetQueueTotalLength(rp, opts) - if err != nil { - return 0, fmt.Errorf("Could not get total queue length: %w", err) - } - if length <= 1 { - return 0, nil - } - - // get our minipool - MPDepositTimestamp, err := mp.GetStatusTime(opts) - if err != nil { - return 0, fmt.Errorf("Could not get status time of minipool %s: %w", mp.Address.String(), err) - } - - // get first minipool in queue - firstMP, err := GetQueueMinipoolAtPosition(rp, 0, opts) - if err != nil { - return 0, fmt.Errorf("Could not get minipool at queue position %d: %w", 0, err) - } - firstMPDepositTimestamp, err := firstMP.GetStatusTime(opts) - if err != nil { - return 0, fmt.Errorf("Could not get status time of minipool %s: %w", firstMP.Address.String(), err) - } - - // estimate - return MPDepositTimestamp.Sub(firstMPDepositTimestamp), nil -} - // Get a minipools position in queue (1-indexed). 0 means it is currently not queued. func GetQueuePositionOfMinipool(mp *Minipool, opts *bind.CallOpts) (uint64, error) { depositType, err := mp.GetDepositType(opts) From 1625a30bf851de0e96cf86c7f7a9c719cb196d25 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 19 Sep 2022 02:43:16 -0400 Subject: [PATCH 497/878] Added a raw getter for the average node fee --- node/node.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/node/node.go b/node/node.go index 1f1a52b82..d9edb33f1 100644 --- a/node/node.go +++ b/node/node.go @@ -418,6 +418,19 @@ func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, op return eth.WeiToEth(*avgFee), nil } +// Get a node's average minipool fee +func GetNodeAverageFeeRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeManager, err := getRocketNodeManager(rp) + if err != nil { + return nil, err + } + avgFee := new(*big.Int) + if err := rocketNodeManager.Call(opts, avgFee, "getAverageNodeFee", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node %s average fee: %w", nodeAddress.Hex(), err) + } + return *avgFee, nil +} + // Get the time that the user registered as a claimer func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (time.Time, error) { rocketNodeManager, err := getRocketNodeManager(rp) From 26b3b1697047e93caabd0216d8a474b330fd7207 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 21 Sep 2022 01:53:18 -0400 Subject: [PATCH 498/878] Fixed a typo --- minipool/factory.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/factory.go b/minipool/factory.go index d29bf3a70..1e72d96f0 100644 --- a/minipool/factory.go +++ b/minipool/factory.go @@ -11,7 +11,7 @@ import ( // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { - rocketMinipoolFactory, err := getRocketMinipooFactory(rp) + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp) if err != nil { return []byte{}, err } @@ -25,7 +25,7 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte // Get contracts var rocketMinipoolFactoryLock sync.Mutex -func getRocketMinipooFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { rocketMinipoolFactoryLock.Lock() defer rocketMinipoolFactoryLock.Unlock() return rp.GetContract("rocketMinipoolFactory") From 5d89bd5c21177d4837eba44cb845f97fc9f23eee Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 5 Oct 2022 23:58:56 -0400 Subject: [PATCH 499/878] Updated dependencies --- go.mod | 13 ++-- go.sum | 185 +++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 120 insertions(+), 78 deletions(-) diff --git a/go.mod b/go.mod index 09a461e7b..94248de6f 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,15 @@ go 1.13 require ( github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.16 - github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 // indirect - github.com/hashicorp/go-version v1.4.0 + github.com/ethereum/go-ethereum v1.10.25 + github.com/ferranbt/fastssz v0.1.2 // indirect + github.com/hashicorp/go-version v1.6.0 github.com/minio/highwayhash v1.0.2 // indirect - github.com/princjef/gomarkdoc v0.3.0 + github.com/princjef/gomarkdoc v0.4.1 github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - gonum.org/v1/gonum v0.9.3 + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 + gonum.org/v1/gonum v0.12.0 ) diff --git a/go.sum b/go.sum index aa2e30283..157818cdc 100644 --- a/go.sum +++ b/go.sum @@ -20,20 +20,12 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -48,8 +40,10 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -81,15 +75,11 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -117,15 +107,20 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= @@ -136,8 +131,10 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczC github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -148,15 +145,16 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= -github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= +github.com/ethereum/go-ethereum v1.10.25 h1:5dFrKJDnYf8L6/5o42abCE6a9yJm9cs4EJVRyYMr55s= +github.com/ethereum/go-ethereum v1.10.25/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1 h1:nC0t8T3xV1VKkeuvshDianzS4j2AsLxaI1vSQEKjqiQ= -github.com/ferranbt/fastssz v0.0.0-20211031100431-9823ca9021f1/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4= +github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= +github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= +github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= @@ -166,6 +164,7 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -179,6 +178,7 @@ github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJ github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= @@ -195,6 +195,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -202,6 +203,8 @@ github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -210,6 +213,8 @@ github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -229,8 +234,9 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -244,16 +250,18 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -278,8 +286,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -295,8 +303,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -318,12 +326,10 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -340,9 +346,12 @@ github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -356,6 +365,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -375,8 +385,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -398,8 +406,8 @@ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyex github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -416,6 +424,7 @@ github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjU github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -427,12 +436,11 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= @@ -449,6 +457,7 @@ github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssy github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -459,10 +468,10 @@ github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUI github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/princjef/gomarkdoc v0.3.0 h1:1kOsinr3g4uqvnz3ohEi96G+mtygadzB6ATTJWP1bfE= -github.com/princjef/gomarkdoc v0.3.0/go.mod h1:k16wbqWczV/LpfLxcv3G4y0qFtM2f4wicmmZBNzyFLc= -github.com/princjef/mageutil v0.1.0 h1:WXB92nDhPh8oKR7woRWCriDFeF75mYZ6JwDUxo8DJ34= -github.com/princjef/mageutil v0.1.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= +github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3PquxglBM= +github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBPMVVDOOTLec= +github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= +github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -484,6 +493,8 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4 github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -499,6 +510,7 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= @@ -540,9 +552,11 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -554,6 +568,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= +github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= @@ -564,7 +580,10 @@ github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -574,7 +593,6 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -588,8 +606,10 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -600,8 +620,9 @@ golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm0 golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -611,6 +632,10 @@ golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -626,6 +651,8 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -648,14 +675,19 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -667,10 +699,10 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 h1:cu5kTvlzcw1Q5S9f5ip1/cpiB4nXvw1XYzFPGgzLUOY= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -718,20 +750,24 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -763,26 +799,31 @@ golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -819,8 +860,10 @@ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -840,12 +883,9 @@ gopkg.in/mattn/go-isatty.v0 v0.0.4/go.mod h1:wt691ab7g0X4ilKZNmMII3egK0bTxl37fEn gopkg.in/mattn/go-runewidth.v0 v0.0.4/go.mod h1:BmXejnxvhwdaATwiJbB1vZ2dtXkQKZGu9yLFCZb4msQ= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -857,9 +897,10 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 9b9844c3280d502d11e4ab8d8610a3ee4017245f Mon Sep 17 00:00:00 2001 From: Ramana Kumar Date: Fri, 14 Oct 2022 07:34:23 +0100 Subject: [PATCH 500/878] Return the whole transaction from Transact --- auction/auction.go | 16 +++++----- dao/protocol/dao.go | 16 +++++----- dao/trustednode/actions.go | 16 +++++----- dao/trustednode/dao.go | 16 +++++----- dao/trustednode/proposals.go | 16 +++++----- deposit/deposit.go | 8 ++--- legacy/v1.0.0/rewards/rewards.go | 4 +-- legacy/v1.5.0-rc1/rewards/rewards.go | 4 +-- minipool/minipool-contract.go | 44 ++++++++++++++-------------- minipool/status.go | 4 +-- network/balances.go | 4 +-- network/penalties.go | 4 +-- network/prices.go | 4 +-- node/deposit.go | 4 +-- node/distributor.go | 4 +-- node/node.go | 16 +++++----- node/staking.go | 8 ++--- rewards/distributor-mainnet.go | 8 ++--- rewards/rewards.go | 4 +-- rocketpool/contract.go | 10 +++---- storage/rocket-storage.go | 8 ++--- tokens/reth.go | 4 +-- tokens/rpl.go | 8 ++--- tokens/tokens.go | 12 ++++---- 24 files changed, 121 insertions(+), 121 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index c5c855eda..e901e73fb 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -523,11 +523,11 @@ func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, comm if err != nil { return 0, common.Hash{}, err } - hash, err := rocketAuctionManager.Transact(opts, "createLot") + tx, err := rocketAuctionManager.Transact(opts, "createLot") if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not create lot: %w", err) } - return lotCount, hash, nil + return lotCount, tx.Hash(), nil } // Estimate the gas of PlaceBid @@ -545,11 +545,11 @@ func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt if err != nil { return common.Hash{}, err } - hash, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) + tx, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) if err != nil { return common.Hash{}, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of ClaimBid @@ -567,11 +567,11 @@ func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt if err != nil { return common.Hash{}, err } - hash, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) + tx, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) if err != nil { return common.Hash{}, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of RecoverUnclaimedRPL @@ -589,11 +589,11 @@ func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. if err != nil { return common.Hash{}, err } - hash, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) + tx, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) if err != nil { return common.Hash{}, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 59bbf34da..b0cb1f3bd 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -27,11 +27,11 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, if err != nil { return common.Hash{}, err } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapUint @@ -49,11 +49,11 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, if err != nil { return common.Hash{}, err } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapAddress @@ -71,11 +71,11 @@ func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath strin if err != nil { return common.Hash{}, err } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) + tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapClaimer @@ -93,11 +93,11 @@ func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount flo if err != nil { return common.Hash{}, err } - hash, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) + tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index 4e8a97409..f64eff5f2 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -26,11 +26,11 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, erro if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") + tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") if err != nil { return common.Hash{}, fmt.Errorf("Could not join the trusted node DAO: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of Leave @@ -49,11 +49,11 @@ func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) + tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not leave the trusted node DAO: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of MakeChallenge @@ -71,11 +71,11 @@ func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) + tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of DecideChallenge @@ -93,11 +93,11 @@ func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, op if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) + tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 3f4fc9cb8..f0bc11d01 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -368,11 +368,11 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) + tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapUint @@ -390,11 +390,11 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) + tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapMember @@ -414,11 +414,11 @@ func BootstrapMember(rp *rocketpool.RocketPool, id, url string, nodeAddress comm return common.Hash{}, err } url = strings.Sanitize(url) - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) + tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of BootstrapUpgrade @@ -444,11 +444,11 @@ func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, cont if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) + tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 662806bbe..9f1b6ca87 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -227,11 +227,11 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o if err != nil { return 0, common.Hash{}, err } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) + tx, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) if err != nil { return 0, common.Hash{}, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) } - return proposalCount + 1, hash, nil + return proposalCount + 1, tx.Hash(), nil } // Estimate the gas of CancelProposal @@ -249,11 +249,11 @@ func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tra if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + tx, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) if err != nil { return common.Hash{}, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of VoteOnProposal @@ -271,11 +271,11 @@ func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + tx, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) if err != nil { return common.Hash{}, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of ExecuteProposal @@ -293,11 +293,11 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr if err != nil { return common.Hash{}, err } - hash, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + tx, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) if err != nil { return common.Hash{}, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/deposit/deposit.go b/deposit/deposit.go index 7cfa6ce29..8af9dd5f0 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -52,11 +52,11 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, e if err != nil { return common.Hash{}, err } - hash, err := rocketDepositPool.Transact(opts, "deposit") + tx, err := rocketDepositPool.Transact(opts, "deposit") if err != nil { return common.Hash{}, fmt.Errorf("Could not deposit: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of AssignDeposits @@ -74,11 +74,11 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common. if err != nil { return common.Hash{}, err } - hash, err := rocketDepositPool.Transact(opts, "assignDeposits") + tx, err := rocketDepositPool.Transact(opts, "assignDeposits") if err != nil { return common.Hash{}, fmt.Errorf("Could not assign deposits: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index 3371538d8..0ba385d29 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -84,11 +84,11 @@ func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOp // Claim rewards func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := claimsContract.Transact(opts, "claim") + tx, err := claimsContract.Transact(opts, "claim") if err != nil { return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) } - return hash, nil + return tx.Hash(), nil } // Get the timestamp that the current rewards interval started diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go index bf06a8a68..244968032 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -164,11 +164,11 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission if err != nil { return common.Hash{}, err } - hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) + tx, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the event info for a rewards snapshot diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 81b796535..0a356300a 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -326,11 +326,11 @@ func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasIn // Refund node ETH from the minipool func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "refund") + tx, err := mp.Contract.Transact(opts, "refund") if err != nil { return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of DistributeBalance @@ -343,11 +343,11 @@ func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocke // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "distributeBalance") + tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of DistributeBalanceAndFinalise @@ -361,11 +361,11 @@ func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactO // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") + tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of Stake @@ -375,11 +375,11 @@ func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignatu // Progress the prelaunch minipool to staking func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) + tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of Dissolve @@ -389,11 +389,11 @@ func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.Gas // Dissolve the initialized or prelaunch minipool func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "dissolve") + tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of Close @@ -403,11 +403,11 @@ func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInf // Withdraw node balances from the dissolved minipool and close it func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "close") + tx, err := mp.Contract.Transact(opts, "close") if err != nil { return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of Finalise @@ -417,11 +417,11 @@ func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.Gas // Finalise a minipool to get the RPL stake back func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "finalise") + tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of DelegateUpgrade @@ -431,11 +431,11 @@ func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketp // Upgrade this minipool to the latest network delegate contract func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "delegateUpgrade") + tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of DelegateRollback @@ -445,11 +445,11 @@ func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocket // Rollback to previous delegate contract func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "delegateRollback") + tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of SetUseLatestDelegate @@ -459,11 +459,11 @@ func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.Tra // If set to true, will automatically use the latest delegate contract func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) + tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Getter for useLatestDelegate setting @@ -527,11 +527,11 @@ func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.Ga // Vote to scrub a minipool func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := mp.Contract.Transact(opts, "voteScrub") + tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Get the data from this minipool's MinipoolPrestaked event diff --git a/minipool/status.go b/minipool/status.go index 912c97916..9a4c37d3f 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -25,11 +25,11 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo if err != nil { return common.Hash{}, err } - hash, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) + tx, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/network/balances.go b/network/balances.go index 8bb012cd2..b59adf8c8 100644 --- a/network/balances.go +++ b/network/balances.go @@ -92,11 +92,11 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt if err != nil { return common.Hash{}, err } - hash, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) } - return hash, nil + return tx.Hash(), nil } // Returns the latest block number that oracles should be reporting balances for diff --git a/network/penalties.go b/network/penalties.go index bc9cd77f0..b4eb02704 100644 --- a/network/penalties.go +++ b/network/penalties.go @@ -26,11 +26,11 @@ func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, bl if err != nil { return common.Hash{}, err } - hash, err := rocketNetworkPrices.Transact(opts, "submitPenalty", minipoolAddress, block) + tx, err := rocketNetworkPrices.Transact(opts, "submitPenalty", minipoolAddress, block) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit penalty: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/network/prices.go b/network/prices.go index 490ccf295..f2d325e38 100644 --- a/network/prices.go +++ b/network/prices.go @@ -52,11 +52,11 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRp if err != nil { return common.Hash{}, err } - hash, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) } - return hash, nil + return tx.Hash(), nil } // Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus diff --git a/node/deposit.go b/node/deposit.go index 6bd14abab..6e045037e 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -28,11 +28,11 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey if err != nil { return common.Hash{}, err } - hash, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + tx, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the type of a deposit based on the amount diff --git a/node/distributor.go b/node/distributor.go index 68610a9bc..790c8ad75 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -54,11 +54,11 @@ func (d *Distributor) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool // Distribute the contract's balance to the rETH contract and the user func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { - hash, err := d.Contract.Transact(opts, "distribute") + tx, err := d.Contract.Transact(opts, "distribute") if err != nil { return common.Hash{}, fmt.Errorf("Could not distribute fee distributor balance: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/node/node.go b/node/node.go index d9edb33f1..d91599239 100644 --- a/node/node.go +++ b/node/node.go @@ -320,11 +320,11 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind if err != nil { return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) } - hash, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) + tx, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) if err != nil { return common.Hash{}, fmt.Errorf("Could not register node: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of SetTimezoneLocation @@ -350,11 +350,11 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt if err != nil { return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) } - hash, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) + tx, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the network ID for a node's rewards @@ -398,11 +398,11 @@ func InitializeFeeDistributor(rp *rocketpool.RocketPool, opts *bind.TransactOpts if err != nil { return common.Hash{}, err } - hash, err := rocketNodeManager.Transact(opts, "initialiseFeeDistributor") + tx, err := rocketNodeManager.Transact(opts, "initialiseFeeDistributor") if err != nil { return common.Hash{}, fmt.Errorf("Could not initialize fee distributor: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get a node's average minipool fee @@ -873,11 +873,11 @@ func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, op if err != nil { return common.Hash{}, err } - hash, err := rocketNodeManager.Transact(opts, "setSmoothingPoolRegistrationState", optIn) + tx, err := rocketNodeManager.Transact(opts, "setSmoothingPoolRegistrationState", optIn) if err != nil { return common.Hash{}, fmt.Errorf("Could not set smoothing pool registration state: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the number of nodes in the Smoothing Pool diff --git a/node/staking.go b/node/staking.go index a8efbf0ae..49429d512 100644 --- a/node/staking.go +++ b/node/staking.go @@ -142,11 +142,11 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact if err != nil { return common.Hash{}, err } - hash, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) + tx, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of WithdrawRPL @@ -164,11 +164,11 @@ func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Trans if err != nil { return common.Hash{}, err } - hash, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) if err != nil { return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) } - return hash, nil + return tx.Hash(), nil } // Calculate total effective RPL stake diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index 20f6d53bd..ce06a53b9 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -51,11 +51,11 @@ func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int if err != nil { return common.Hash{}, err } - hash, err := rocketDistributorMainnet.Transact(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs) + tx, err := rocketDistributorMainnet.Transact(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs) if err != nil { return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate claim and restake rewards gas @@ -73,11 +73,11 @@ func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices [] if err != nil { return common.Hash{}, err } - hash, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount) + tx, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount) if err != nil { return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get contracts diff --git a/rewards/rewards.go b/rewards/rewards.go index 1f4e437ee..9b00f85ac 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -166,11 +166,11 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission if err != nil { return common.Hash{}, err } - hash, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) + tx, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the event info for a rewards snapshot diff --git a/rocketpool/contract.go b/rocketpool/contract.go index f59d5d39a..53fb73cef 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -66,17 +66,17 @@ func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, } // Transact on a contract method and wait for a receipt -func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (common.Hash, error) { +func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { // Estimate gas limit if opts.GasLimit == 0 { input, err := c.ABI.Pack(method, params...) if err != nil { - return common.Hash{}, fmt.Errorf("Could not encode input data: %w", err) + return nil, fmt.Errorf("Could not encode input data: %w", err) } _, safeGasLimit, err := c.estimateGasLimit(opts, input) if err != nil { - return common.Hash{}, err + return nil, err } opts.GasLimit = safeGasLimit } @@ -84,10 +84,10 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { - return common.Hash{}, err + return nil, err } - return tx.Hash(), nil + return tx, nil } diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go index fa3241d00..b2704b8bb 100644 --- a/storage/rocket-storage.go +++ b/storage/rocket-storage.go @@ -33,11 +33,11 @@ func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress comm // Set a node's withdrawal address func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) + tx, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) if err != nil { return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of ConfirmWithdrawalAddress @@ -47,9 +47,9 @@ func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress // Set a node's withdrawal address func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) + tx, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) if err != nil { return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) } - return hash, nil + return tx.Hash(), nil } diff --git a/tokens/reth.go b/tokens/reth.go index 72b9b561a..79f29541f 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -190,11 +190,11 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt if err != nil { return common.Hash{}, err } - hash, err := rocketTokenRETH.Transact(opts, "burn", amount) + tx, err := rocketTokenRETH.Transact(opts, "burn", amount) if err != nil { return common.Hash{}, fmt.Errorf("Could not burn rETH: %w", err) } - return hash, nil + return tx.Hash(), nil } // diff --git a/tokens/rpl.go b/tokens/rpl.go index 0f4fc703b..bb6e0f829 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -115,11 +115,11 @@ func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo if err != nil { return common.Hash{}, err } - hash, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") + tx, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") if err != nil { return common.Hash{}, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of SwapFixedSupplyRPLForRPL @@ -137,11 +137,11 @@ func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts * if err != nil { return common.Hash{}, err } - hash, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) + tx, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) if err != nil { return common.Hash{}, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) } - return hash, nil + return tx.Hash(), nil } // Get the RPL inflation interval rate diff --git a/tokens/tokens.go b/tokens/tokens.go index 9706fdc95..286f98de9 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -116,11 +116,11 @@ func estimateTransferGas(tokenContract *rocketpool.Contract, tokenName string, t // Transfer tokens to an address func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "transfer", to, amount) + tx, err := tokenContract.Transact(opts, "transfer", to, amount) if err != nil { return common.Hash{}, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of approve @@ -130,11 +130,11 @@ func estimateApproveGas(tokenContract *rocketpool.Contract, tokenName string, sp // Approve a token allowance for a spender func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "approve", spender, amount) + tx, err := tokenContract.Transact(opts, "approve", spender, amount) if err != nil { return common.Hash{}, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) } - return hash, nil + return tx.Hash(), nil } // Estimate the gas of transferFrom @@ -144,9 +144,9 @@ func estimateTransferFromGas(tokenContract *rocketpool.Contract, tokenName strin // Transfer tokens from a sender to an address func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - hash, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) + tx, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) if err != nil { return common.Hash{}, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) } - return hash, nil + return tx.Hash(), nil } From 19ef135f6dc7f8facfca0c23a20158c2acce76c8 Mon Sep 17 00:00:00 2001 From: Ramana Kumar Date: Fri, 14 Oct 2022 22:44:48 +0100 Subject: [PATCH 501/878] Return the whole transaction from Deposit --- node/deposit.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/node/deposit.go b/node/deposit.go index 6e045037e..94215f3a8 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" @@ -23,16 +24,16 @@ func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, valid } // Make a node deposit -func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp) if err != nil { - return common.Hash{}, err + return nil, err } tx, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not make node deposit: %w", err) + return nil, fmt.Errorf("Could not make node deposit: %w", err) } - return tx.Hash(), nil + return tx, nil } // Get the type of a deposit based on the amount From 616c2c6ecccb4015ec6fafba1c88e2b01ac5e7e3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 28 Oct 2022 02:35:11 -0400 Subject: [PATCH 502/878] Added version checking support for Atlas, added RocketDepositPool.GetUserBalance --- deposit/deposit.go | 13 +++++++++++++ node/staking.go | 13 +++++++++++++ utils/version-checker.go | 18 ++++++++++++------ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/deposit/deposit.go b/deposit/deposit.go index 8af9dd5f0..c80d3db3a 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -24,6 +24,19 @@ func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error return *balance, nil } +// Get the deposit pool balance +func GetUserBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDepositPool, err := getRocketDepositPool(rp) + if err != nil { + return nil, err + } + balance := new(*big.Int) + if err := rocketDepositPool.Call(opts, balance, "getUserBalance"); err != nil { + return nil, fmt.Errorf("Could not get deposit pool user balance: %w", err) + } + return *balance, nil +} + // Get the excess deposit pool balance func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketDepositPool, err := getRocketDepositPool(rp) diff --git a/node/staking.go b/node/staking.go index 49429d512..d056e9b7a 100644 --- a/node/staking.go +++ b/node/staking.go @@ -11,6 +11,19 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Get the version of the Node Staking contract +func GetNodeStakingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint8, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp) + if err != nil { + return 0, err + } + version := new(uint8) + if err := rocketNodeStaking.Call(opts, version, "version"); err != nil { + return 0, fmt.Errorf("Could not get node staking version: %w", err) + } + return *version, nil +} + // Get the total RPL staked in the network func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNodeStaking, err := getRocketNodeStaking(rp) diff --git a/utils/version-checker.go b/utils/version-checker.go index 6d7edc9c9..548945dec 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -10,19 +10,25 @@ import ( func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { - // Base version - rpVersion, _ := version.NewSemver("1.0.0") + // Check for v1.2 + nodeStakingVersion, err := node.GetNodeStakingVersion(rp, nil) + if err != nil { + return nil, fmt.Errorf("error checking node staking version: %w", err) + } + if nodeStakingVersion == 3 { + return version.NewSemver("1.2.0") + } // Check for v1.1 nodeMgrVersion, err := node.GetNodeManagerVersion(rp, nil) if err != nil { - return nil, fmt.Errorf("Error checking node manager version: %w", err) + return nil, fmt.Errorf("error checking node manager version: %w", err) } if nodeMgrVersion == 2 { - rpVersion, _ = version.NewSemver("1.1.0") + return version.NewSemver("1.1.0") } - // Return whatever version was found - return rpVersion, nil + // v1.0 + return version.NewSemver("1.0.0") } From ca887e2b92d6055efc011e3db698f2b5624dca32 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 28 Oct 2022 02:54:35 -0400 Subject: [PATCH 503/878] Renamed the legacy v1.5.0 package to v1.1.0 since that was the smart contract version --- .../rewards/rewards.go | 4 ++-- ....0-rc1-manager.go => v1.1.0-rc1-manager.go} | 18 +++++++++--------- rocketpool/version-manager.go | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) rename legacy/{v1.5.0-rc1 => v1.1.0-rc1}/rewards/rewards.go (98%) rename rocketpool/{v1.5.0-rc1-manager.go => v1.1.0-rc1-manager.go} (81%) diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.1.0-rc1/rewards/rewards.go similarity index 98% rename from legacy/v1.5.0-rc1/rewards/rewards.go rename to legacy/v1.1.0-rc1/rewards/rewards.go index 244968032..2b6f21917 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.1.0-rc1/rewards/rewards.go @@ -299,8 +299,8 @@ func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address) (* rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() if address == nil { - return rp.VersionManager.V1_5_0_RC1.GetContract("rocketRewardsPool") + return rp.VersionManager.V1_1_0_RC1.GetContract("rocketRewardsPool") } else { - return rp.VersionManager.V1_5_0_RC1.GetContractWithAddress("rocketRewardsPool", *address) + return rp.VersionManager.V1_1_0_RC1.GetContractWithAddress("rocketRewardsPool", *address) } } diff --git a/rocketpool/v1.5.0-rc1-manager.go b/rocketpool/v1.1.0-rc1-manager.go similarity index 81% rename from rocketpool/v1.5.0-rc1-manager.go rename to rocketpool/v1.1.0-rc1-manager.go index 30a7f3447..53de594bd 100644 --- a/rocketpool/v1.5.0-rc1-manager.go +++ b/rocketpool/v1.1.0-rc1-manager.go @@ -6,7 +6,7 @@ import ( ) // A wrapper that holds the updated contract information for this version -type LegacyVersionWrapper_v1_5_0_rc1 struct { +type LegacyVersionWrapper_v1_1_0_rc1 struct { rp *RocketPool rpVersion *version.Version contractNameMap map[string]string @@ -14,9 +14,9 @@ type LegacyVersionWrapper_v1_5_0_rc1 struct { } // Creates a new wrapper for this version -func newLegacyVersionWrapper_v1_5_0_rc1(rp *RocketPool) *LegacyVersionWrapper_v1_5_0_rc1 { - rpVersion, _ := version.NewSemver("1.5.0-rc1") - return &LegacyVersionWrapper_v1_5_0_rc1{ +func newLegacyVersionWrapper_v1_1_0_rc1(rp *RocketPool) *LegacyVersionWrapper_v1_1_0_rc1 { + rpVersion, _ := version.NewSemver("1.1.0-rc1") + return &LegacyVersionWrapper_v1_1_0_rc1{ rp: rp, rpVersion: rpVersion, contractNameMap: map[string]string{ @@ -29,26 +29,26 @@ func newLegacyVersionWrapper_v1_5_0_rc1(rp *RocketPool) *LegacyVersionWrapper_v1 } // Get the version for this manager -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetVersion() *version.Version { +func (m *LegacyVersionWrapper_v1_1_0_rc1) GetVersion() *version.Version { return m.rpVersion } // Get the versioned name of the contract if it was upgraded as part of this deployment -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetVersionedContractName(contractName string) (string, bool) { +func (m *LegacyVersionWrapper_v1_1_0_rc1) GetVersionedContractName(contractName string) (string, bool) { legacyName, exists := m.contractNameMap[contractName] return legacyName, exists } // Get the ABI for the provided contract -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetEncodedABI(contractName string) string { +func (m *LegacyVersionWrapper_v1_1_0_rc1) GetEncodedABI(contractName string) string { return m.abiMap[contractName] } // Get the contract with the provided name for this version of Rocket Pool -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContract(contractName string) (*Contract, error) { +func (m *LegacyVersionWrapper_v1_1_0_rc1) GetContract(contractName string) (*Contract, error) { return getLegacyContract(m.rp, contractName, m) } -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { +func (m *LegacyVersionWrapper_v1_1_0_rc1) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { return getLegacyContractWithAddress(m.rp, contractName, address, m) } diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index c0eb6e9e8..1bff9321f 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -21,7 +21,7 @@ type LegacyVersionWrapper interface { type VersionManager struct { V1_0_0 LegacyVersionWrapper - V1_5_0_RC1 LegacyVersionWrapper + V1_1_0_RC1 LegacyVersionWrapper rp *RocketPool } @@ -29,7 +29,7 @@ type VersionManager struct { func NewVersionManager(rp *RocketPool) *VersionManager { return &VersionManager{ V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), - V1_5_0_RC1: newLegacyVersionWrapper_v1_5_0_rc1(rp), + V1_1_0_RC1: newLegacyVersionWrapper_v1_1_0_rc1(rp), rp: rp, } } From adda32ba4671faf276a9905686874abdaaae3e83 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 28 Oct 2022 03:14:00 -0400 Subject: [PATCH 504/878] Added a v1.1.0 contract manager, updated rocketNetworkPrices for Atlas --- legacy/v1.1.0/network/prices.go | 99 +++++++++++++++++++++++++++++++++ network/prices.go | 8 +-- rocketpool/v1.1.0-manager.go | 54 ++++++++++++++++++ rocketpool/version-manager.go | 2 + 4 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 legacy/v1.1.0/network/prices.go create mode 100644 rocketpool/v1.1.0-manager.go diff --git a/legacy/v1.1.0/network/prices.go b/legacy/v1.1.0/network/prices.go new file mode 100644 index 000000000..f59a33fe1 --- /dev/null +++ b/legacy/v1.1.0/network/prices.go @@ -0,0 +1,99 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get the block number which network prices are current for +func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (uint64, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return 0, err + } + pricesBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network prices block: %w", err) + } + return (*pricesBlock).Uint64(), nil +} + +// Get the current network RPL price in ETH +func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return nil, err + } + rplPrice := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { + return nil, fmt.Errorf("Could not get network RPL price: %w", err) + } + return *rplPrice, nil +} + +// Estimate the gas of SubmitPrices +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, effectiveRplStake *big.Int, opts *bind.TransactOpts, legacyRocketNetworkPricesAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) +} + +// Submit network prices and total effective RPL stake for an epoch +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRplStake *big.Int, opts *bind.TransactOpts, legacyRocketNetworkPricesAddress *common.Address) (common.Hash, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) + } + return tx.Hash(), nil +} + +// Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus +func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (bool, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return false, err + } + isInConsensus := new(bool) + if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { + return false, fmt.Errorf("Could not get consensus status: %w", err) + } + return *isInConsensus, nil +} + +// Returns the latest block number that oracles should be reporting prices for +func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil +} + +// Get contracts +var rocketNetworkPricesLock sync.Mutex + +func getRocketNetworkPrices(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + if address == nil { + return rp.VersionManager.V1_1_0.GetContract("rocketNetworkPrices") + } else { + return rp.VersionManager.V1_1_0.GetContractWithAddress("rocketNetworkPrices", *address) + } +} diff --git a/network/prices.go b/network/prices.go index f2d325e38..e5ba36c14 100644 --- a/network/prices.go +++ b/network/prices.go @@ -38,21 +38,21 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } // Estimate the gas of SubmitPrices -func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, effectiveRplStake *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) } // Submit network prices and total effective RPL stake for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRplStake *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) if err != nil { return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) } diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go new file mode 100644 index 000000000..e25fc8fbd --- /dev/null +++ b/rocketpool/v1.1.0-manager.go @@ -0,0 +1,54 @@ +package rocketpool + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/hashicorp/go-version" +) + +// A wrapper that holds the updated contract information for this version +type LegacyVersionWrapper_v1_1_0 struct { + rp *RocketPool + rpVersion *version.Version + contractNameMap map[string]string + abiMap map[string]string +} + +// Creates a new wrapper for this version +func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 { + rpVersion, _ := version.NewSemver("1.1.0") + return &LegacyVersionWrapper_v1_1_0{ + rp: rp, + rpVersion: rpVersion, + contractNameMap: map[string]string{ + "rocketNetworkPrices": "rocketNetworkPrices.v1", + }, + abiMap: map[string]string{ + "rocketNetworkPrices": "eNrtVsFqwkAQ/ZWy55wKLcVbW3ooWBBtTyIy2UxkMdkNu7O2Iv57JxoTA9HYNkUP3pLszJu3b3beZrwSSmeenOiN80dCqyF5X2YoekIaTRYk3QyNnCONyFiY4WseFINEEQgNaR44tfsBj1Fk0Tlepi0OFB/Wk0A4AsI3TxCqRNGSV7XRGSwhTLDK4MqOrJcMKNbBSgAHLVPjmWYMicOgzjrCL4xEjzM2K7VNQMmmIBtbkzZwC/aAyho1JM/vt3f3FVKY8LYrqN36b6BslgysktgNGsYxSlILHGbJiGDeESyptAlpUgZstuBGPkwVEQOXsbhATT/o5LUBf2nARxbBAflLsaucBVqnjOZo4+mQFeS1HioidRIPByZ7ofCzioy9Zkm40AEeM6Qt/aeiqy10aso0q9IBpeGgvzsXF8HnpTxZg/7uZF0mseIUnrub7dWmwH7E83FssJSWFsHhcflPvt/+k2qEl0H1qDm35La5cUv6KfZbCeY299XWe64aNWvE15T0VMx091LtD9oz//uhdt4dN43QmKTJMTbfO/K0PiM4GmJmLOXbOIeXTb4BvAjxkA==", + }, + } +} + +// Get the version for this manager +func (m *LegacyVersionWrapper_v1_1_0) GetVersion() *version.Version { + return m.rpVersion +} + +// Get the versioned name of the contract if it was upgraded as part of this deployment +func (m *LegacyVersionWrapper_v1_1_0) GetVersionedContractName(contractName string) (string, bool) { + legacyName, exists := m.contractNameMap[contractName] + return legacyName, exists +} + +// Get the ABI for the provided contract +func (m *LegacyVersionWrapper_v1_1_0) GetEncodedABI(contractName string) string { + return m.abiMap[contractName] +} + +// Get the contract with the provided name for this version of Rocket Pool +func (m *LegacyVersionWrapper_v1_1_0) GetContract(contractName string) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m) +} + +func (m *LegacyVersionWrapper_v1_1_0) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { + return getLegacyContractWithAddress(m.rp, contractName, address, m) +} diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index 1bff9321f..417799c7a 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -22,6 +22,7 @@ type LegacyVersionWrapper interface { type VersionManager struct { V1_0_0 LegacyVersionWrapper V1_1_0_RC1 LegacyVersionWrapper + V1_1_0 LegacyVersionWrapper rp *RocketPool } @@ -30,6 +31,7 @@ func NewVersionManager(rp *RocketPool) *VersionManager { return &VersionManager{ V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), V1_1_0_RC1: newLegacyVersionWrapper_v1_1_0_rc1(rp), + V1_1_0: newLegacyVersionWrapper_v1_1_0(rp), rp: rp, } } From 0c1cc8bee4087778d835bd07efd326992dcd5a11 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 28 Oct 2022 03:58:01 -0400 Subject: [PATCH 505/878] Fixed a parameter type --- network/prices.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/prices.go b/network/prices.go index e5ba36c14..3cbe41ec1 100644 --- a/network/prices.go +++ b/network/prices.go @@ -47,7 +47,7 @@ func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice * } // Submit network prices and total effective RPL stake for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp) if err != nil { return common.Hash{}, err From b88f83e69dc85663be975c9ef3f231292d571349 Mon Sep 17 00:00:00 2001 From: Alex Contryman Date: Fri, 28 Oct 2022 10:55:35 -0700 Subject: [PATCH 506/878] Fix deposit usage --- tests/testutils/node/deposit.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testutils/node/deposit.go b/tests/testutils/node/deposit.go index aa33fa8e8..a6bd05aa7 100644 --- a/tests/testutils/node/deposit.go +++ b/tests/testutils/node/deposit.go @@ -64,11 +64,11 @@ func Deposit(t *testing.T, rp *rocketpool.RocketPool, nodeAccount *accounts.Acco minNodeFee := 0.0 //t.Logf("Deposit:\n\tMin Node Fee: %f\n\tValidator Pubkey: %s\n\tValidator Signature: %s\n\tDeposit Data Root: %s\n\tNode Address: %s\n\tSalt: %s\n\tExpected Minipool: %s\n", // minNodeFee, validatorPubkey.Hex(), validatorSignature.Hex(), depositDataRoot.Hex(), nodeAccount.Address.Hex(), GetDefaultSalt().String(), expectedMinipoolAddress.Hex()) - hash, err := node.Deposit(rp, minNodeFee, validatorPubkey, validatorSignature, depositDataRoot, salt, expectedMinipoolAddress, opts) + tx, err := node.Deposit(rp, minNodeFee, validatorPubkey, validatorSignature, depositDataRoot, salt, expectedMinipoolAddress, opts) if err != nil { return common.Address{}, nil, fmt.Errorf("Error executing deposit: %w", err) } - txReceipt, err := utils.WaitForTransaction(rp.Client, hash) + txReceipt, err := utils.WaitForTransaction(rp.Client, tx.Hash()) if err != nil { return common.Address{}, nil, fmt.Errorf("Error waiting for deposit transaction: %w", err) } From ccd4bdfdaa9cdc1c2c004ac263e71fe77a35da6e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 31 Oct 2022 05:29:43 -0400 Subject: [PATCH 507/878] Added new Atlas functions to the minipool binding --- minipool/minipool-contract.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 0a356300a..b1e43605d 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -534,6 +534,29 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Gets the time at which the MP owner started the bond reduction process +func (mp *Minipool) GetReduceBondTime(opts *bind.CallOpts) (*big.Int, error) { + reduceBondTime := new(*big.Int) + if err := mp.Contract.Call(opts, reduceBondTime, "getReduceBondTime"); err != nil { + return nil, fmt.Errorf("Could not get reduce bond start time for minipool %s: %w", mp.Address.Hex(), err) + } + return *reduceBondTime, nil +} + +// Estimate the gas required to vote to cancel a minipool's bond reduction +func (mp *Minipool) EstimateVoteCancelReductionGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "voteCancelReduction") +} + +// Vote to cancel a minipool's bond reduction +func (mp *Minipool) VoteCancelReduction(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "voteCancelReduction") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Get the data from this minipool's MinipoolPrestaked event func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { From 157089d1319bd43dff6abcdb5834108b4dcea82e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 1 Nov 2022 00:50:04 -0400 Subject: [PATCH 508/878] Added solo staker migration bindings --- minipool/minipool-contract.go | 16 +++++++++++++++- minipool/minipool.go | 26 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index b1e43605d..61aeea7b7 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -520,7 +520,7 @@ func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (* return *userAmount, nil } -// Estimate the gas requiired to vote to scrub a minipool +// Estimate the gas required to vote to scrub a minipool func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } @@ -557,6 +557,20 @@ func (mp *Minipool) VoteCancelReduction(opts *bind.TransactOpts) (common.Hash, e return tx.Hash(), nil } +// Estimate the gas required to promote a vacant minipool +func (mp *Minipool) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "promote") +} + +// Promote a vacant minipool +func (mp *Minipool) Promote(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "promote") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not promote minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Get the data from this minipool's MinipoolPrestaked event func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { diff --git a/minipool/minipool.go b/minipool/minipool.go index 1cd622ab0..1831dd13c 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -536,6 +536,32 @@ func GetMinipoolPenaltyCount(rp *rocketpool.RocketPool, minipoolAddress common.A return penalties.Uint64(), nil } +// Get the vacant minipool count +func GetVacantMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return 0, err + } + vacantMinipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, vacantMinipoolCount, "getVacantMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get vacant minipool count: %w", err) + } + return (*vacantMinipoolCount).Uint64(), nil +} + +// Get a vacant minipool address by index +func GetVacantMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp) + if err != nil { + return common.Address{}, err + } + vacantMinipoolAddress := new(common.Address) + if err := rocketMinipoolManager.Call(opts, vacantMinipoolAddress, "getVacantMinipoolAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("Could not get vacant minipool %d address: %w", index, err) + } + return *vacantMinipoolAddress, nil +} + // Get contracts var rocketMinipoolManagerLock sync.Mutex From bb226ff4cccb54d71461620b37f0b4a7ccab5768 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 7 Nov 2022 02:45:59 -0500 Subject: [PATCH 509/878] Added options to every contract call so old addresses can be queried from RocketStorage during historical calls --- auction/auction.go | 60 +++++++-------- dao/proposal-payload.go | 5 +- dao/proposals.go | 42 +++++------ dao/protocol/dao.go | 20 ++--- dao/trustednode/actions.go | 20 ++--- dao/trustednode/dao.go | 46 ++++++------ dao/trustednode/proposals.go | 48 ++++++------ deposit/deposit.go | 16 ++-- legacy/v1.0.0/minipool/minipool.go | 38 +++++----- legacy/v1.0.0/rewards/node.go | 22 +++--- legacy/v1.0.0/rewards/rewards.go | 16 ++-- legacy/v1.0.0/rewards/trusted-node.go | 22 +++--- legacy/v1.0.0/utils/address_generation.go | 11 +-- legacy/v1.5.0-rc1/rewards/rewards.go | 32 ++++---- minipool/factory.go | 6 +- minipool/minipool-contract.go | 8 +- minipool/minipool.go | 36 ++++----- minipool/queue.go | 16 ++-- minipool/status.go | 8 +- network/balances.go | 20 ++--- network/fees.go | 10 +-- network/penalties.go | 8 +- network/prices.go | 16 ++-- node/deposit.go | 10 +-- node/distributor.go | 14 ++-- node/node.go | 92 +++++++++++------------ node/staking.go | 30 ++++---- rewards/distributor-mainnet.go | 16 ++-- rewards/rewards.go | 32 ++++---- rocketpool/rocketpool.go | 86 +++++++++++---------- rocketpool/v1.0.0-manager.go | 5 +- rocketpool/v1.5.0-rc1-manager.go | 5 +- rocketpool/version-manager.go | 8 +- settings/protocol/auction.go | 18 ++--- settings/protocol/deposit.go | 14 ++-- settings/protocol/inflation.go | 8 +- settings/protocol/minipool.go | 22 +++--- settings/protocol/network.go | 24 +++--- settings/protocol/node.go | 12 +-- settings/protocol/rewards.go | 12 +-- settings/trustednode/members.go | 18 ++--- settings/trustednode/minipool.go | 8 +- settings/trustednode/proposals.go | 14 ++-- settings/trustednode/rewards.go | 6 +- storage/address-queue-storage.go | 10 +-- tokens/reth.go | 38 +++++----- tokens/rpl-fixed.go | 22 +++--- tokens/rpl.go | 32 ++++---- utils/address_generation.go | 11 +-- utils/deposit_retrieval.go | 6 +- utils/eth/logs.go | 7 +- 51 files changed, 561 insertions(+), 545 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index e901e73fb..2cdbcd73e 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -272,7 +272,7 @@ func GetLotDetailsWithBids(rp *rocketpool.RocketPool, lotIndex uint64, bidder co // Get the total RPL balance of the auction contract func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -285,7 +285,7 @@ func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In // Get the allotted RPL balance of the auction contract func GetAllottedRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -298,7 +298,7 @@ func GetAllottedRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big // Get the remaining RPL balance of the auction contract func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -311,7 +311,7 @@ func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi // Get the number of lots for auction func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return 0, err } @@ -324,7 +324,7 @@ func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) // Lot details func GetLotExists(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return false, err } @@ -335,7 +335,7 @@ func GetLotExists(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpt return *lotExists, nil } func GetLotStartBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return 0, err } @@ -346,7 +346,7 @@ func GetLotStartBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Cal return (*lotStartBlock).Uint64(), nil } func GetLotEndBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (uint64, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return 0, err } @@ -357,7 +357,7 @@ func GetLotEndBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallO return (*lotEndBlock).Uint64(), nil } func GetLotStartPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -368,7 +368,7 @@ func GetLotStartPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Cal return *lotStartPrice, nil } func GetLotReservePrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -379,7 +379,7 @@ func GetLotReservePrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C return *lotReservePrice, nil } func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -390,7 +390,7 @@ func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind return *lotTotalRplAmount, nil } func GetLotTotalBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -401,7 +401,7 @@ func GetLotTotalBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind return *lotTotalBidAmount, nil } func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return false, err } @@ -412,7 +412,7 @@ func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C return *lotRplRecovered, nil } func GetLotPriceAtCurrentBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -423,7 +423,7 @@ func GetLotPriceAtCurrentBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts return *lotPriceAtCurrentBlock, nil } func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -434,7 +434,7 @@ func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bi return *lotPriceByTotalBids, nil } func GetLotCurrentPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -445,7 +445,7 @@ func GetLotCurrentPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C return *lotCurrentPrice, nil } func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -456,7 +456,7 @@ func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bi return *lotClaimedRplAmount, nil } func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -467,7 +467,7 @@ func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts * return *lotRemainingRplAmount, nil } func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpts) (bool, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return false, err } @@ -480,7 +480,7 @@ func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Call // Get the price of a lot at a specific block func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -493,7 +493,7 @@ func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, // Get the ETH amount bid on a lot by an address func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, opts) if err != nil { return nil, err } @@ -506,7 +506,7 @@ func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder c // Estimate the gas of CreateLot func EstimateCreateLotGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -515,7 +515,7 @@ func EstimateCreateLotGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (r // Create a new lot func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -532,7 +532,7 @@ func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, comm // Estimate the gas of PlaceBid func EstimatePlaceBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -541,7 +541,7 @@ func EstimatePlaceBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. // Place a bid on a lot func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -554,7 +554,7 @@ func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt // Estimate the gas of ClaimBid func EstimateClaimBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -563,7 +563,7 @@ func EstimateClaimBidGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. // Claim RPL from a lot that was bid on func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -576,7 +576,7 @@ func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt // Estimate the gas of RecoverUnclaimedRPL func EstimateRecoverUnclaimedRPLGas(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -585,7 +585,7 @@ func EstimateRecoverUnclaimedRPLGas(rp *rocketpool.RocketPool, lotIndex uint64, // Recover unclaimed RPL from a lot func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketAuctionManager, err := getRocketAuctionManager(rp) + rocketAuctionManager, err := getRocketAuctionManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -599,8 +599,8 @@ func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. // Get contracts var rocketAuctionManagerLock sync.Mutex -func getRocketAuctionManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketAuctionManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketAuctionManagerLock.Lock() defer rocketAuctionManagerLock.Unlock() - return rp.GetContract("rocketAuctionManager") + return rp.GetContract("rocketAuctionManager", opts) } diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go index b7aa1c739..3504dc825 100644 --- a/dao/proposal-payload.go +++ b/dao/proposal-payload.go @@ -7,6 +7,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -16,14 +17,14 @@ import ( // Get the string representation of a proposal payload var getProposalPayloadStringLock sync.Mutex -func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload []byte) (string, error) { +func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload []byte, opts *bind.CallOpts) (string, error) { // Lock while getting proposal payload string getProposalPayloadStringLock.Lock() defer getProposalPayloadStringLock.Unlock() // Get proposal DAO contract ABI - daoContractAbi, err := rp.GetABI(daoName) + daoContractAbi, err := rp.GetABI(daoName, opts) if err != nil { return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) } diff --git a/dao/proposals.go b/dao/proposals.go index 74bf1ad5f..b0fc7fcd8 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -362,7 +362,7 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } // Get proposal payload string - payloadStr, err := GetProposalPayloadString(rp, dao, payload) + payloadStr, err := GetProposalPayloadString(rp, dao, payload, opts) if err != nil { payloadStr = "(unknown)" } @@ -429,7 +429,7 @@ func GetProposalDetailsWithMember(rp *rocketpool.RocketPool, proposalId uint64, // Get the proposal count func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -442,7 +442,7 @@ func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e // Proposal details func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return "", err } @@ -453,7 +453,7 @@ func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Cal return strings.Sanitize(*daoName), nil } func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return common.Address{}, err } @@ -464,7 +464,7 @@ func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, op return *proposerAddress, nil } func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return "", err } @@ -475,7 +475,7 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return strings.Sanitize(*message), nil } func GetProposalCreatedTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -486,7 +486,7 @@ func GetProposalCreatedTime(rp *rocketpool.RocketPool, proposalId uint64, opts * return (*createdTime).Uint64(), nil } func GetProposalStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -497,7 +497,7 @@ func GetProposalStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bi return (*startTime).Uint64(), nil } func GetProposalEndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -508,7 +508,7 @@ func GetProposalEndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return (*endTime).Uint64(), nil } func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -519,7 +519,7 @@ func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *b return (*expiryTime).Uint64(), nil } func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -530,7 +530,7 @@ func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts return eth.WeiToEth(*votesRequired), nil } func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -541,7 +541,7 @@ func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bin return eth.WeiToEth(*votesFor), nil } func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (float64, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -552,7 +552,7 @@ func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts return eth.WeiToEth(*votesAgainst), nil } func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return false, err } @@ -563,7 +563,7 @@ func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts * return *cancelled, nil } func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return false, err } @@ -574,7 +574,7 @@ func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *b return *executed, nil } func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return []byte{}, err } @@ -593,14 +593,14 @@ func GetProposalPayloadStr(rp *rocketpool.RocketPool, proposalId uint64, opts *b if err != nil { return "", err } - payloadStr, err := GetProposalPayloadString(rp, dao, payload) + payloadStr, err := GetProposalPayloadString(rp, dao, payload, opts) if err != nil { payloadStr = "(unknown)" } return payloadStr, nil } func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (rptypes.ProposalState, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return 0, err } @@ -613,7 +613,7 @@ func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C // Get whether a member has voted on a proposal func GetProposalMemberVoted(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return false, err } @@ -626,7 +626,7 @@ func GetProposalMemberVoted(rp *rocketpool.RocketPool, proposalId uint64, member // Get whether a member has voted in support of a proposal func GetProposalMemberSupported(rp *rocketpool.RocketPool, proposalId uint64, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAOProposal, err := getRocketDAOProposal(rp) + rocketDAOProposal, err := getRocketDAOProposal(rp, opts) if err != nil { return false, err } @@ -640,8 +640,8 @@ func GetProposalMemberSupported(rp *rocketpool.RocketPool, proposalId uint64, me // Get contracts var rocketDAOProposalLock sync.Mutex -func getRocketDAOProposal(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAOProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAOProposalLock.Lock() defer rocketDAOProposalLock.Unlock() - return rp.GetContract("rocketDAOProposal") + return rp.GetContract("rocketDAOProposal", opts) } diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index b0cb1f3bd..00f3aeeeb 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -14,7 +14,7 @@ import ( // Estimate the gas of BootstrapBool func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -23,7 +23,7 @@ func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPa // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return common.Hash{}, err } @@ -36,7 +36,7 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, // Estimate the gas of BootstrapUint func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -45,7 +45,7 @@ func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPa // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return common.Hash{}, err } @@ -58,7 +58,7 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, // Estimate the gas of BootstrapAddress func EstimateBootstrapAddressGas(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -67,7 +67,7 @@ func EstimateBootstrapAddressGas(rp *rocketpool.RocketPool, contractName, settin // Bootstrap an address setting func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return common.Hash{}, err } @@ -80,7 +80,7 @@ func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath strin // Estimate the gas of BootstrapClaimer func EstimateBootstrapClaimerGas(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -89,7 +89,7 @@ func EstimateBootstrapClaimerGas(rp *rocketpool.RocketPool, contractName string, // Bootstrap a rewards claimer func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp) + rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) if err != nil { return common.Hash{}, err } @@ -103,8 +103,8 @@ func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount flo // Get contracts var rocketDAOProtocolLock sync.Mutex -func getRocketDAOProtocol(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAOProtocol(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAOProtocolLock.Lock() defer rocketDAOProtocolLock.Unlock() - return rp.GetContract("rocketDAOProtocol") + return rp.GetContract("rocketDAOProtocol", opts) } diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index f64eff5f2..fb8dfb014 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -12,7 +12,7 @@ import ( // Estimate the gas of Join func EstimateJoinGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -22,7 +22,7 @@ func EstimateJoinGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocket // Join the trusted node DAO // Requires an executed invite proposal func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return common.Hash{}, err } @@ -35,7 +35,7 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, erro // Estimate the gas of Leave func EstimateLeaveGas(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -45,7 +45,7 @@ func EstimateLeaveGas(rp *rocketpool.RocketPool, rplBondRefundAddress common.Add // Leave the trusted node DAO // Requires an executed leave proposal func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return common.Hash{}, err } @@ -58,7 +58,7 @@ func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts // Estimate the gas of MakeChallenge func EstimateMakeChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -67,7 +67,7 @@ func EstimateMakeChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Ad // Make a challenge against a node func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return common.Hash{}, err } @@ -80,7 +80,7 @@ func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts // Estimate the gas of DecideChallenge func EstimateDecideChallengeGas(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -89,7 +89,7 @@ func EstimateDecideChallengeGas(rp *rocketpool.RocketPool, memberAddress common. // Decide a challenge against a node func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDAONodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, nil) if err != nil { return common.Hash{}, err } @@ -103,8 +103,8 @@ func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, op // Get contracts var rocketDAONodeTrustedActionsLock sync.Mutex -func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAONodeTrustedActionsLock.Lock() defer rocketDAONodeTrustedActionsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedActions") + return rp.GetContract("rocketDAONodeTrustedActions", opts) } diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index f0bc11d01..4816f25b0 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -189,7 +189,7 @@ func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, o // Get the minimum member count func GetMinimumMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -202,7 +202,7 @@ func GetMinimumMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint // Get the member count func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -215,7 +215,7 @@ func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err // Get a member address by index func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return common.Address{}, err } @@ -228,7 +228,7 @@ func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) ( // Member details func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return false, err } @@ -239,7 +239,7 @@ func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, op return *exists, nil } func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return "", err } @@ -250,7 +250,7 @@ func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts * return strings.Sanitize(*id), nil } func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return "", err } @@ -261,7 +261,7 @@ func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts return strings.Sanitize(*url), nil } func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -272,7 +272,7 @@ func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address return (*joinedTime).Uint64(), nil } func GetMemberLastProposalTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -283,7 +283,7 @@ func GetMemberLastProposalTime(rp *rocketpool.RocketPool, memberAddress common.A return (*lastProposalTime).Uint64(), nil } func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return nil, err } @@ -294,7 +294,7 @@ func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Addr return *rplBondAmount, nil } func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -316,7 +316,7 @@ func GetMemberReplaceProposalExecutedTime(rp *rocketpool.RocketPool, memberAddre return GetMemberProposalExecutedTime(rp, "replace", memberAddress, opts) } func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return 0, err } @@ -329,7 +329,7 @@ func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType strin // Get a member's replacement address if being replaced func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return common.Address{}, err } @@ -342,7 +342,7 @@ func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common // Get whether a member has an active challenge against them func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, opts) if err != nil { return false, err } @@ -355,7 +355,7 @@ func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Addre // Estimate the gas of BootstrapBool func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -364,7 +364,7 @@ func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPa // Bootstrap a bool setting func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return common.Hash{}, err } @@ -377,7 +377,7 @@ func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, // Estimate the gas of BootstrapUint func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -386,7 +386,7 @@ func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPa // Bootstrap a uint256 setting func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return common.Hash{}, err } @@ -399,7 +399,7 @@ func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, // Estimate the gas of BootstrapMember func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -409,7 +409,7 @@ func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, url string, nodeA // Bootstrap a DAO member func BootstrapMember(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return common.Hash{}, err } @@ -427,7 +427,7 @@ func EstimateBootstrapUpgradeGas(rp *rocketpool.RocketPool, upgradeType, contrac if err != nil { return rocketpool.GasInfo{}, err } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -440,7 +440,7 @@ func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, cont if err != nil { return common.Hash{}, err } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp) + rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) if err != nil { return common.Hash{}, err } @@ -454,8 +454,8 @@ func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, cont // Get contracts var rocketDAONodeTrustedLock sync.Mutex -func getRocketDAONodeTrusted(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAONodeTrusted(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAONodeTrustedLock.Lock() defer rocketDAONodeTrustedLock.Unlock() - return rp.GetContract("rocketDAONodeTrusted") + return rp.GetContract("rocketDAONodeTrusted", opts) } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 9f1b6ca87..45dd54fc5 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -15,7 +15,7 @@ import ( // Estimate the gas of ProposeInviteMember func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -29,7 +29,7 @@ func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, n // Submit a proposal to invite a new member to the trusted node DAO func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -43,7 +43,7 @@ func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAdd // Estimate the gas of ProposeMemberLeave func EstimateProposeMemberLeaveGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -56,7 +56,7 @@ func EstimateProposeMemberLeaveGas(rp *rocketpool.RocketPool, message string, me // Submit a proposal for a member to leave the trusted node DAO func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -69,7 +69,7 @@ func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress // Estimate the gas of ProposeReplaceMember func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -83,7 +83,7 @@ func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, // Submit a proposal to replace a member in the trusted node DAO func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddress, newMemberAddress common.Address, newMemberId, newMemberUrl string, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -97,7 +97,7 @@ func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddre // Estimate the gas of ProposeKickMember func EstimateProposeKickMemberGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -110,7 +110,7 @@ func EstimateProposeKickMemberGas(rp *rocketpool.RocketPool, message string, mem // Submit a proposal to kick a member from the trusted node DAO func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress common.Address, rplFineAmount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -123,7 +123,7 @@ func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress // Estimate the gas of ProposeSetBool func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -136,7 +136,7 @@ func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, // Submit a proposal to update a bool trusted node DAO setting func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -149,7 +149,7 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat // Estimate the gas of ProposeSetUint func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -162,7 +162,7 @@ func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, // Submit a proposal to update a uint trusted node DAO setting func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -179,7 +179,7 @@ func EstimateProposeUpgradeContractGas(rp *rocketpool.RocketPool, message, upgra if err != nil { return rocketpool.GasInfo{}, err } - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -196,7 +196,7 @@ func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, con if err != nil { return 0, common.Hash{}, err } - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -209,7 +209,7 @@ func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, con // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -219,7 +219,7 @@ func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []by // Submit a trusted node DAO proposal // Returns the ID of the new proposal func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } @@ -236,7 +236,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o // Estimate the gas of CancelProposal func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -245,7 +245,7 @@ func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opt // Cancel a submitted proposal func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return common.Hash{}, err } @@ -258,7 +258,7 @@ func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tra // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -267,7 +267,7 @@ func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, sup // Vote on a submitted proposal func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return common.Hash{}, err } @@ -280,7 +280,7 @@ func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, // Estimate the gas of ExecuteProposal func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -289,7 +289,7 @@ func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, op // Execute a submitted proposal func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp) + rocketDAONodeTrustedProposals, err := getRocketDAONodeTrustedProposals(rp, nil) if err != nil { return common.Hash{}, err } @@ -303,8 +303,8 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr // Get contracts var rocketDAONodeTrustedProposalsLock sync.Mutex -func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAONodeTrustedProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAONodeTrustedProposalsLock.Lock() defer rocketDAONodeTrustedProposalsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedProposals") + return rp.GetContract("rocketDAONodeTrustedProposals", opts) } diff --git a/deposit/deposit.go b/deposit/deposit.go index 8af9dd5f0..28ff158a8 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -13,7 +13,7 @@ import ( // Get the deposit pool balance func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, opts) if err != nil { return nil, err } @@ -26,7 +26,7 @@ func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error // Get the excess deposit pool balance func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, opts) if err != nil { return nil, err } @@ -39,7 +39,7 @@ func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, // Estimate the gas of Deposit func EstimateDepositGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -48,7 +48,7 @@ func EstimateDepositGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (roc // Make a deposit func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return common.Hash{}, err } @@ -61,7 +61,7 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, e // Estimate the gas of AssignDeposits func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -70,7 +70,7 @@ func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpt // Assign deposits func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDepositPool, err := getRocketDepositPool(rp) + rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return common.Hash{}, err } @@ -84,8 +84,8 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common. // Get contracts var rocketDepositPoolLock sync.Mutex -func getRocketDepositPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDepositPool(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDepositPoolLock.Lock() defer rocketDepositPoolLock.Unlock() - return rp.GetContract("rocketDepositPool") + return rp.GetContract("rocketDepositPool", opts) } diff --git a/legacy/v1.0.0/minipool/minipool.go b/legacy/v1.0.0/minipool/minipool.go index fc03a671c..68bdbf269 100644 --- a/legacy/v1.0.0/minipool/minipool.go +++ b/legacy/v1.0.0/minipool/minipool.go @@ -138,7 +138,7 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Get the addresses of all minipools in prelaunch status func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return []common.Address{}, err } @@ -295,7 +295,7 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Get the minipool count func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil, opts) if err != nil { return 0, err } @@ -308,7 +308,7 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRock // Get the number of finalised minipools in the network func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil, opts) if err != nil { return 0, err } @@ -321,7 +321,7 @@ func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, l // Get the number of active minipools in the network func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, nil, opts) if err != nil { return 0, err } @@ -334,7 +334,7 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, lega // Get the minipool count by status func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (MinipoolCountsPerStatus, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return MinipoolCountsPerStatus{}, err } @@ -384,7 +384,7 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts, l // Get a minipool address by index func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Address{}, err } @@ -397,7 +397,7 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts, // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return 0, err } @@ -410,7 +410,7 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, // Get the number of minipools owned by a node that are not finalised func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return 0, err } @@ -423,7 +423,7 @@ func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Ad // Get the number of minipools owned by a node that are finalised func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return 0, err } @@ -436,7 +436,7 @@ func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common // Get a node's minipool address by index func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Address{}, err } @@ -449,7 +449,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in // Get a node's validating minipool count func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return 0, err } @@ -462,7 +462,7 @@ func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress commo // Get a node's validating minipool address by index func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Address{}, err } @@ -475,7 +475,7 @@ func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.A // Get a minipool address by validator pubkey func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Address{}, err } @@ -488,7 +488,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk // Check whether a minipool exists func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return false, err } @@ -501,7 +501,7 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get a minipool's validator pubkey func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (rptypes.ValidatorPubkey, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return rptypes.ValidatorPubkey{}, err } @@ -514,7 +514,7 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) ([]byte, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return []byte{}, err } @@ -527,7 +527,7 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyR // Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts, legacyRocketMinipoolManagerAddress *common.Address) (common.Hash, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Hash{}, err } @@ -541,11 +541,11 @@ func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() if address == nil { - return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager", opts) } else { return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketMinipoolManager", *address) } diff --git a/legacy/v1.0.0/rewards/node.go b/legacy/v1.0.0/rewards/node.go index 627739f25..2b1fc7494 100644 --- a/legacy/v1.0.0/rewards/node.go +++ b/legacy/v1.0.0/rewards/node.go @@ -14,7 +14,7 @@ import ( // Get whether node reward claims are enabled func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, opts) if err != nil { return false, err } @@ -23,7 +23,7 @@ func GetNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Get whether a node rewards claimer can claim func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (bool, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, opts) if err != nil { return false, err } @@ -32,7 +32,7 @@ func GetNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Addre // Get the percentage of rewards available for a node rewards claimer func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (float64, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, opts) if err != nil { return 0, err } @@ -41,7 +41,7 @@ func GetNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Ad // Get the total amount of rewards available for a node rewards claimer func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimNodeAddress *common.Address) (*big.Int, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, opts) if err != nil { return nil, err } @@ -50,7 +50,7 @@ func GetNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common. // Estimate the gas of ClaimNodeRewards func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimNodeAddress *common.Address) (rocketpool.GasInfo, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -59,7 +59,7 @@ func EstimateClaimNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactO // Claim node rewards func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimNodeAddress *common.Address) (common.Hash, error) { - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, nil) if err != nil { return common.Hash{}, err } @@ -67,13 +67,13 @@ func ClaimNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacy } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimNodeAddress *common.Address) (*big.Int, error) { +func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimNodeAddress *common.Address, opts *bind.CallOpts) (*big.Int, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } - rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress) + rocketClaimNode, err := getRocketClaimNode(rp, legacyRocketClaimNodeAddress, opts) if err != nil { return nil, err } @@ -117,11 +117,11 @@ func GetNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyR // Get contracts var rocketClaimNodeLock sync.Mutex -func getRocketClaimNode(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketClaimNode(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketClaimNodeLock.Lock() defer rocketClaimNodeLock.Unlock() if address == nil { - return rp.VersionManager.V1_0_0.GetContract("rocketClaimNode") + return rp.VersionManager.V1_0_0.GetContract("rocketClaimNode", opts) } else { return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketClaimNode", *address) } diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index 0ba385d29..a02856346 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -53,7 +53,7 @@ func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName strin // Get the time that the user registered as a claimer func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsContract string, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return time.Time{}, err } @@ -66,7 +66,7 @@ func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsCont // Get the total amount claimed in the current interval by the given claiming contract func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract string, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -93,7 +93,7 @@ func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.Tr // Get the timestamp that the current rewards interval started func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return time.Time{}, err } @@ -106,7 +106,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, l // Get the number of seconds in a claim interval func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return 0, err } @@ -119,7 +119,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Get the percent of checkpoint rewards that goes to node operators func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return 0, err } @@ -132,7 +132,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt // Get the percent of checkpoint rewards that goes to ODAO members func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (float64, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return 0, err } @@ -146,11 +146,11 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. // Get contracts var rocketRewardsPoolLock sync.Mutex -func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() if address == nil { - return rp.VersionManager.V1_0_0.GetContract("rocketRewardsPool") + return rp.VersionManager.V1_0_0.GetContract("rocketRewardsPool", opts) } else { return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketRewardsPool", *address) } diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/legacy/v1.0.0/rewards/trusted-node.go index e9d9a10f9..28c7af4c7 100644 --- a/legacy/v1.0.0/rewards/trusted-node.go +++ b/legacy/v1.0.0/rewards/trusted-node.go @@ -14,7 +14,7 @@ import ( // Get whether trusted node reward claims are enabled func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, opts) if err != nil { return false, err } @@ -23,7 +23,7 @@ func GetTrustedNodeClaimsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts, // Get whether a trusted node rewards claimer can claim func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (bool, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, opts) if err != nil { return false, err } @@ -32,7 +32,7 @@ func GetTrustedNodeClaimPossible(rp *rocketpool.RocketPool, claimerAddress commo // Get the percentage of rewards available for a trusted node rewards claimer func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (float64, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, opts) if err != nil { return 0, err } @@ -41,7 +41,7 @@ func GetTrustedNodeClaimRewardsPerc(rp *rocketpool.RocketPool, claimerAddress co // Get the total amount of rewards available for a trusted node rewards claimer func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress common.Address, opts *bind.CallOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (*big.Int, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, opts) if err != nil { return nil, err } @@ -50,7 +50,7 @@ func GetTrustedNodeClaimRewardsAmount(rp *rocketpool.RocketPool, claimerAddress // Estimate the gas of ClaimTrustedNodeRewards func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (rocketpool.GasInfo, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -59,7 +59,7 @@ func EstimateClaimTrustedNodeRewardsGas(rp *rocketpool.RocketPool, opts *bind.Tr // Claim trusted node rewards func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, legacyRocketClaimTrustedNodeAddress *common.Address) (common.Hash, error) { - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, nil) if err != nil { return common.Hash{}, err } @@ -67,13 +67,13 @@ func ClaimTrustedNodeRewards(rp *rocketpool.RocketPool, opts *bind.TransactOpts, } // Filters through token claim events and sums the total amount claimed by claimerAddress -func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimTrustedNodeAddress *common.Address) (*big.Int, error) { +func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddress common.Address, intervalSize *big.Int, startBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, legacyRocketClaimTrustedNodeAddress *common.Address, opts *bind.CallOpts) (*big.Int, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } - rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress) + rocketClaimTrustedNode, err := getRocketClaimTrustedNode(rp, legacyRocketClaimTrustedNodeAddress, opts) if err != nil { return nil, err } @@ -117,11 +117,11 @@ func GetTrustedNodeTotalClaimed(rp *rocketpool.RocketPool, opts *bind.CallOpts, // Get contracts var rocketClaimTrustedNodeLock sync.Mutex -func getRocketClaimTrustedNode(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketClaimTrustedNode(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketClaimTrustedNodeLock.Lock() defer rocketClaimTrustedNodeLock.Unlock() if address == nil { - return rp.VersionManager.V1_0_0.GetContract("rocketClaimTrustedNode") + return rp.VersionManager.V1_0_0.GetContract("rocketClaimTrustedNode", opts) } else { return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketClaimTrustedNode", *address) } diff --git a/legacy/v1.0.0/utils/address_generation.go b/legacy/v1.0.0/utils/address_generation.go index 86e3997b9..f738113c9 100644 --- a/legacy/v1.0.0/utils/address_generation.go +++ b/legacy/v1.0.0/utils/address_generation.go @@ -5,6 +5,7 @@ import ( "math/big" "sync" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/legacy/v1.0.0/minipool" @@ -23,14 +24,14 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, legacyRocketMinipoolManagerAddress *common.Address) (common.Address, error) { +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, legacyRocketMinipoolManagerAddress *common.Address, opts *bind.CallOpts) (common.Address, error) { // Get dependencies - rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, legacyRocketMinipoolManagerAddress, opts) if err != nil { return common.Address{}, err } - minipoolAbi, err := rp.GetABI("rocketMinipool") + minipoolAbi, err := rp.GetABI("rocketMinipool", nil) if err != nil { return common.Address{}, err } @@ -63,11 +64,11 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() if address == nil { - return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager") + return rp.VersionManager.V1_0_0.GetContract("rocketMinipoolManager", opts) } else { return rp.VersionManager.V1_0_0.GetContractWithAddress("rocketMinipoolManager", *address) } diff --git a/legacy/v1.5.0-rc1/rewards/rewards.go b/legacy/v1.5.0-rc1/rewards/rewards.go index 244968032..a3457aadc 100644 --- a/legacy/v1.5.0-rc1/rewards/rewards.go +++ b/legacy/v1.5.0-rc1/rewards/rewards.go @@ -47,7 +47,7 @@ type RewardSubmission struct { // Get the index of the active rewards period func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -60,7 +60,7 @@ func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocket // Get the timestamp that the current rewards interval started func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return time.Time{}, err } @@ -73,7 +73,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, l // Get the number of seconds in a claim interval func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return 0, err } @@ -86,7 +86,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Get the percent of checkpoint rewards that goes to node operators func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -99,7 +99,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt // Get the percent of checkpoint rewards that goes to ODAO members func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. // Get the percent of checkpoint rewards that goes to the PDAO func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts // Get the amount of RPL rewards that will be provided to node operators func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -138,7 +138,7 @@ func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Get the amount of ETH rewards that will be provided to node operators func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketRewardsPoolAddress *common.Address) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return nil, err } @@ -151,7 +151,7 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts, legacyRocketRewardsPoolAddress *common.Address) (rocketpool.GasInfo, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -160,7 +160,7 @@ func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission Rewar // Submit a Merkle Tree-based snapshot for a rewards interval func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts, legacyRocketRewardsPoolAddress *common.Address) (common.Hash, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, nil) if err != nil { return common.Hash{}, err } @@ -172,9 +172,9 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } // Get the event info for a rewards snapshot -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address) (RewardsEvent, error) { +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, legacyRocketRewardsPoolAddress *common.Address, opts *bind.CallOpts) (RewardsEvent, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress) + rocketRewardsPool, err := getRocketRewardsPool(rp, legacyRocketRewardsPoolAddress, opts) if err != nil { return RewardsEvent{}, err } @@ -230,14 +230,14 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { if len(rocketRewardsPoolAddresses) == 0 { return false, RewardsEvent{}, fmt.Errorf("rocketRewardsPoolAddresses must have at least one element.") } // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, &rocketRewardsPoolAddresses[0]) + rocketRewardsPool, err := getRocketRewardsPool(rp, &rocketRewardsPoolAddresses[0], opts) if err != nil { return false, RewardsEvent{}, err } @@ -295,11 +295,11 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, // Get contracts var rocketRewardsPoolLock sync.Mutex -func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address) (*rocketpool.Contract, error) { +func getRocketRewardsPool(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() if address == nil { - return rp.VersionManager.V1_5_0_RC1.GetContract("rocketRewardsPool") + return rp.VersionManager.V1_5_0_RC1.GetContract("rocketRewardsPool", opts) } else { return rp.VersionManager.V1_5_0_RC1.GetContractWithAddress("rocketRewardsPool", *address) } diff --git a/minipool/factory.go b/minipool/factory.go index 1e72d96f0..d7d1da3a8 100644 --- a/minipool/factory.go +++ b/minipool/factory.go @@ -11,7 +11,7 @@ import ( // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { - rocketMinipoolFactory, err := getRocketMinipoolFactory(rp) + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) if err != nil { return []byte{}, err } @@ -25,8 +25,8 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte // Get contracts var rocketMinipoolFactoryLock sync.Mutex -func getRocketMinipoolFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolFactoryLock.Lock() defer rocketMinipoolFactoryLock.Unlock() - return rp.GetContract("rocketMinipoolFactory") + return rp.GetContract("rocketMinipoolFactory", opts) } diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 0a356300a..0de9cac73 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -69,10 +69,10 @@ type Minipool struct { } // Create new minipool contract -func NewMinipool(rp *rocketpool.RocketPool, address common.Address) (*Minipool, error) { +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*Minipool, error) { // Get contract - contract, err := getMinipoolContract(rp, address) + contract, err := getMinipoolContract(rp, address, opts) if err != nil { return nil, err } @@ -606,8 +606,8 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) // Get a minipool contract var rocketMinipoolLock sync.Mutex -func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address) (*rocketpool.Contract, error) { +func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolLock.Lock() defer rocketMinipoolLock.Unlock() - return rp.MakeContract("rocketMinipool", minipoolAddress) + return rp.MakeContract("rocketMinipool", minipoolAddress, opts) } diff --git a/minipool/minipool.go b/minipool/minipool.go index 1cd622ab0..54289eb33 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -139,7 +139,7 @@ func GetMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]com // Get the addresses of all minipools in prelaunch status func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return []common.Address{}, err } @@ -296,7 +296,7 @@ func GetMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Addres // Get the minipool count func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -309,7 +309,7 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e // Get the number of finalised minipools in the network func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -322,7 +322,7 @@ func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get the number of active minipools in the network func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -335,7 +335,7 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin // Get the minipool count by status func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (MinipoolCountsPerStatus, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return MinipoolCountsPerStatus{}, err } @@ -385,7 +385,7 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get a minipool address by index func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return common.Address{}, err } @@ -398,7 +398,7 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) // Get a node's minipool count func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -411,7 +411,7 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, // Get the number of minipools owned by a node that are not finalised func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -424,7 +424,7 @@ func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Ad // Get the number of minipools owned by a node that are finalised func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -437,7 +437,7 @@ func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common // Get a node's minipool address by index func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return common.Address{}, err } @@ -450,7 +450,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in // Get a node's validating minipool count func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return 0, err } @@ -463,7 +463,7 @@ func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress commo // Get a node's validating minipool address by index func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return common.Address{}, err } @@ -476,7 +476,7 @@ func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.A // Get a minipool address by validator pubkey func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubkey, opts *bind.CallOpts) (common.Address, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return common.Address{}, err } @@ -489,7 +489,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk // Check whether a minipool exists func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return false, err } @@ -502,7 +502,7 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get a minipool's validator pubkey func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (rptypes.ValidatorPubkey, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return rptypes.ValidatorPubkey{}, err } @@ -515,7 +515,7 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address // Get the 0x01-based Beacon Chain withdrawal credentials for a given minipool func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (common.Hash, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp) + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { return common.Hash{}, err } @@ -539,8 +539,8 @@ func GetMinipoolPenaltyCount(rp *rocketpool.RocketPool, minipoolAddress common.A // Get contracts var rocketMinipoolManagerLock sync.Mutex -func getRocketMinipoolManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() defer rocketMinipoolManagerLock.Unlock() - return rp.GetContract("rocketMinipoolManager") + return rp.GetContract("rocketMinipoolManager", opts) } diff --git a/minipool/queue.go b/minipool/queue.go index d0efa3c38..e2f7e045c 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -123,7 +123,7 @@ func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapa // Get the total length of the minipool queue func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return 0, err } @@ -136,7 +136,7 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 // Get the length of a single minipool queue func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDeposit, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return 0, err } @@ -149,7 +149,7 @@ func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDepos // Get the total capacity of the minipool queue func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return nil, err } @@ -162,7 +162,7 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big // Get the total effective capacity of the minipool queue (used in node demand calculation) func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get the capacity of the next minipool in the queue func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp) + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return nil, err } @@ -272,7 +272,7 @@ func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts if err != nil { return nil, fmt.Errorf("Could not get address in queue at position %d: %w", position, err) } - return NewMinipool(rp, address) + return NewMinipool(rp, address, opts) } if position < lengths.HalfDeposit { @@ -289,8 +289,8 @@ func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts // Get contracts var rocketMinipoolQueueLock sync.Mutex -func getRocketMinipoolQueue(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolQueue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolQueueLock.Lock() defer rocketMinipoolQueueLock.Unlock() - return rp.GetContract("rocketMinipoolQueue") + return rp.GetContract("rocketMinipoolQueue", opts) } diff --git a/minipool/status.go b/minipool/status.go index 9a4c37d3f..b18e8a1d6 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -12,7 +12,7 @@ import ( // Estimate the gas of SubmitMinipoolWithdrawable func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -21,7 +21,7 @@ func EstimateSubmitMinipoolWithdrawableGas(rp *rocketpool.RocketPool, minipoolAd // Submit a minipool withdrawable event func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketMinipoolStatus, err := getRocketMinipoolStatus(rp) + rocketMinipoolStatus, err := getRocketMinipoolStatus(rp, nil) if err != nil { return common.Hash{}, err } @@ -35,8 +35,8 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo // Get contracts var rocketMinipoolStatusLock sync.Mutex -func getRocketMinipoolStatus(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolStatusLock.Lock() defer rocketMinipoolStatusLock.Unlock() - return rp.GetContract("rocketMinipoolStatus") + return rp.GetContract("rocketMinipoolStatus", opts) } diff --git a/network/balances.go b/network/balances.go index b59adf8c8..c0d81d54d 100644 --- a/network/balances.go +++ b/network/balances.go @@ -14,7 +14,7 @@ import ( // Get the block number which network balances are current for func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return 0, err } @@ -27,7 +27,7 @@ func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e // Get the current network total ETH balance func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -40,7 +40,7 @@ func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In // Get the current network staking ETH balance func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -53,7 +53,7 @@ func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. // Get the current network total rETH supply func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In // Get the current network ETH utilization rate func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return 0, err } @@ -79,7 +79,7 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa // Estimate the gas of SubmitBalances func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -88,7 +88,7 @@ func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth // Submit network balances for an epoch func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) if err != nil { return common.Hash{}, err } @@ -101,7 +101,7 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt // Returns the latest block number that oracles should be reporting balances for func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -115,8 +115,8 @@ func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.Call // Get contracts var rocketNetworkBalancesLock sync.Mutex -func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkBalances(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkBalancesLock.Lock() defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances") + return rp.GetContract("rocketNetworkBalances", opts) } diff --git a/network/fees.go b/network/fees.go index 60c47b5d7..8070ea0c0 100644 --- a/network/fees.go +++ b/network/fees.go @@ -13,7 +13,7 @@ import ( // Get the current network node demand in ETH func GetNodeDemand(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) + rocketNetworkFees, err := getRocketNetworkFees(rp, opts) if err != nil { return nil, err } @@ -26,7 +26,7 @@ func GetNodeDemand(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, er // Get the current network node commission rate func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) + rocketNetworkFees, err := getRocketNetworkFees(rp, opts) if err != nil { return 0, err } @@ -39,7 +39,7 @@ func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) // Get the network node fee for a node demand value func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bind.CallOpts) (float64, error) { - rocketNetworkFees, err := getRocketNetworkFees(rp) + rocketNetworkFees, err := getRocketNetworkFees(rp, opts) if err != nil { return 0, err } @@ -53,8 +53,8 @@ func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bi // Get contracts var rocketNetworkFeesLock sync.Mutex -func getRocketNetworkFees(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkFees(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkFeesLock.Lock() defer rocketNetworkFeesLock.Unlock() - return rp.GetContract("rocketNetworkFees") + return rp.GetContract("rocketNetworkFees", opts) } diff --git a/network/penalties.go b/network/penalties.go index b4eb02704..d9442b202 100644 --- a/network/penalties.go +++ b/network/penalties.go @@ -13,7 +13,7 @@ import ( // Estimate the gas of SubmitPenalty func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, block *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkPenalties, err := getRocketNetworkPenalties(rp) + rocketNetworkPenalties, err := getRocketNetworkPenalties(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -22,7 +22,7 @@ func EstimateSubmitPenaltyGas(rp *rocketpool.RocketPool, minipoolAddress common. // Submit penalty for given minipool func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, block *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkPrices, err := getRocketNetworkPenalties(rp) + rocketNetworkPrices, err := getRocketNetworkPenalties(rp, nil) if err != nil { return common.Hash{}, err } @@ -36,8 +36,8 @@ func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, bl // Get contracts var rocketNetworkPenaltiesLock sync.Mutex -func getRocketNetworkPenalties(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkPenalties(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkPenaltiesLock.Lock() defer rocketNetworkPenaltiesLock.Unlock() - return rp.GetContract("rocketNetworkPenalties") + return rp.GetContract("rocketNetworkPenalties", opts) } diff --git a/network/prices.go b/network/prices.go index f2d325e38..231a06949 100644 --- a/network/prices.go +++ b/network/prices.go @@ -13,7 +13,7 @@ import ( // Get the block number which network prices are current for func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return 0, err } @@ -26,7 +26,7 @@ func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err // Get the current network RPL price in ETH func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return nil, err } @@ -39,7 +39,7 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro // Estimate the gas of SubmitPrices func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, effectiveRplStake *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -48,7 +48,7 @@ func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice * // Submit network prices and total effective RPL stake for an epoch func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRplStake *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) if err != nil { return common.Hash{}, err } @@ -61,7 +61,7 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRp // Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return false, err } @@ -74,7 +74,7 @@ func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { // Returns the latest block number that oracles should be reporting prices for func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return nil, err } @@ -88,8 +88,8 @@ func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOp // Get contracts var rocketNetworkPricesLock sync.Mutex -func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkPrices(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkPricesLock.Lock() defer rocketNetworkPricesLock.Unlock() - return rp.GetContract("rocketNetworkPrices") + return rp.GetContract("rocketNetworkPrices", opts) } diff --git a/node/deposit.go b/node/deposit.go index 94215f3a8..bdd814324 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -16,7 +16,7 @@ import ( // Estimate the gas of Deposit func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -25,7 +25,7 @@ func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, valid // Make a node deposit func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } @@ -38,7 +38,7 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey // Get the type of a deposit based on the amount func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { - rocketNodeDeposit, err := getRocketNodeDeposit(rp) + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) if err != nil { return rptypes.Empty, err } @@ -53,8 +53,8 @@ func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallO // Get contracts var rocketNodeDepositLock sync.Mutex -func getRocketNodeDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNodeDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNodeDepositLock.Lock() defer rocketNodeDepositLock.Unlock() - return rp.GetContract("rocketNodeDeposit") + return rp.GetContract("rocketNodeDeposit", opts) } diff --git a/node/distributor.go b/node/distributor.go index 790c8ad75..8f048b7db 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -18,10 +18,10 @@ type Distributor struct { } // Create new distributor contract -func NewDistributor(rp *rocketpool.RocketPool, address common.Address) (*Distributor, error) { +func NewDistributor(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*Distributor, error) { // Get contract - contract, err := getDistributorContract(rp, address) + contract, err := getDistributorContract(rp, address, opts) if err != nil { return nil, err } @@ -36,7 +36,7 @@ func NewDistributor(rp *rocketpool.RocketPool, address common.Address) (*Distrib // Gets the deterministic address for a node's reward distributor contract func GetDistributorAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { - rocketNodeDistributorFactory, err := getRocketNodeDistributorFactory(rp) + rocketNodeDistributorFactory, err := getRocketNodeDistributorFactory(rp, opts) if err != nil { return common.Address{}, err } @@ -64,17 +64,17 @@ func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { // Get contracts var rocketNodeDistributorFactoryLock sync.Mutex -func getRocketNodeDistributorFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNodeDistributorFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNodeDistributorFactoryLock.Lock() defer rocketNodeDistributorFactoryLock.Unlock() - return rp.GetContract("rocketNodeDistributorFactory") + return rp.GetContract("rocketNodeDistributorFactory", opts) } // Get a distributor contract var rocketDistributorLock sync.Mutex -func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address) (*rocketpool.Contract, error) { +func getDistributorContract(rp *rocketpool.RocketPool, distributorAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDistributorLock.Lock() defer rocketDistributorLock.Unlock() - return rp.MakeContract("rocketNodeDistributorDelegate", distributorAddress) + return rp.MakeContract("rocketNodeDistributorDelegate", distributorAddress, opts) } diff --git a/node/node.go b/node/node.go index d91599239..b6c3636bd 100644 --- a/node/node.go +++ b/node/node.go @@ -81,7 +81,7 @@ type TrustedNodeParticipation struct { // Get the version of the Node Manager contract func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint8, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return 0, err } @@ -234,7 +234,7 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Get the number of nodes in the network func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return 0, err } @@ -247,7 +247,7 @@ func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error // Get a breakdown of the number of nodes per timezone func GetNodeCountPerTimezone(rp *rocketpool.RocketPool, offset, limit *big.Int, opts *bind.CallOpts) ([]TimezoneCount, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return []TimezoneCount{}, err } @@ -260,7 +260,7 @@ func GetNodeCountPerTimezone(rp *rocketpool.RocketPool, offset, limit *big.Int, // Get a node address by index func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return common.Address{}, err } @@ -273,7 +273,7 @@ func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (co // Check whether a node exists func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return false, err } @@ -286,7 +286,7 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * // Get a node's timezone location func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (string, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return "", err } @@ -299,7 +299,7 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre // Estimate the gas of RegisterNode func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -312,7 +312,7 @@ func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, // Register a node func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -329,7 +329,7 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind // Estimate the gas of SetTimezoneLocation func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -342,7 +342,7 @@ func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation // Set a node's timezone location func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -359,7 +359,7 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt // Get the network ID for a node's rewards func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return 0, err } @@ -372,7 +372,7 @@ func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opt // Check if a node's fee distributor has been initialized yet func GetFeeDistributorInitialized(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return false, err } @@ -385,7 +385,7 @@ func GetFeeDistributorInitialized(rp *rocketpool.RocketPool, nodeAddress common. // Estimate the gas for creating the fee distributor contract for a node func EstimateInitializeFeeDistributorGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -394,7 +394,7 @@ func EstimateInitializeFeeDistributorGas(rp *rocketpool.RocketPool, opts *bind.T // Create the fee distributor contract for a node func InitializeFeeDistributor(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -407,7 +407,7 @@ func InitializeFeeDistributor(rp *rocketpool.RocketPool, opts *bind.TransactOpts // Get a node's average minipool fee func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (float64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return 0, err } @@ -420,7 +420,7 @@ func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, op // Get a node's average minipool fee func GetNodeAverageFeeRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return nil, err } @@ -433,7 +433,7 @@ func GetNodeAverageFeeRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, // Get the time that the user registered as a claimer func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return time.Time{}, err } @@ -445,9 +445,9 @@ func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, } // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock -func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { +func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return nil, err } @@ -473,9 +473,9 @@ func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock -func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int) (*[]uint64, error) { +func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -502,9 +502,9 @@ func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Addres } // Returns the most recent block number that the number of trusted nodes changed since fromBlock -func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) (uint64, error) { +func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (uint64, error) { // Get contracts - rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp) + rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, opts) if err != nil { return 0, err } @@ -551,7 +551,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, interval currentBlockNumber := currentBlock.Number.Uint64() // Get the block of the most recent member join (limiting to 50 intervals) minBlock := (currentBlockNumber/updatePricesFrequency - 50) * updatePricesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) if err != nil { return nil, err } @@ -586,7 +586,7 @@ func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, interval participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if intervalsPassed > 0 { - blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize) + blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize, opts) if err != nil { return nil, err } @@ -638,7 +638,7 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, interv currentBlockNumber := currentBlock.Number.Uint64() // Get the block of the most recent member join (limiting to 50 intervals) minBlock := (currentBlockNumber/updateBalancesFrequency - 50) * updateBalancesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize) + latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) if err != nil { return nil, err } @@ -673,7 +673,7 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, interv participationTable[member.Address] = make([]bool, intervalsPassed) actual := 0 if intervalsPassed > 0 { - blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize) + blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize, opts) if err != nil { return nil, err } @@ -711,9 +711,9 @@ func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, interv } // Returns an array of members who submitted a balance since fromBlock -func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { +func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp) + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return nil, err } @@ -756,7 +756,7 @@ func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, interv } // Get submission within the current interval fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency - submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize) + submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize, opts) if err != nil { return nil, err } @@ -772,9 +772,9 @@ func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, interv } // Returns an array of members who submitted prices since fromBlock -func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int) ([]common.Address, error) { +func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp) + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return nil, err } @@ -817,7 +817,7 @@ func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, interval } // Get submission within the current interval fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency - submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize) + submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize, opts) if err != nil { return nil, err } @@ -834,7 +834,7 @@ func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, interval // Get the smoothing pool opt-in status of a node func GetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return false, err } @@ -847,7 +847,7 @@ func GetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, nodeAddress co // Get the time of the previous smoothing pool opt-in / opt-out func GetSmoothingPoolRegistrationChanged(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (time.Time, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return time.Time{}, err } @@ -860,7 +860,7 @@ func GetSmoothingPoolRegistrationChanged(rp *rocketpool.RocketPool, nodeAddress // Estimate the gas for opting into / out of the smoothing pool func EstimateSetSmoothingPoolRegistrationStateGas(rp *rocketpool.RocketPool, optIn bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -869,7 +869,7 @@ func EstimateSetSmoothingPoolRegistrationStateGas(rp *rocketpool.RocketPool, opt // Opt into / out of the smoothing pool func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, nil) if err != nil { return common.Hash{}, err } @@ -882,7 +882,7 @@ func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, op // Get the number of nodes in the Smoothing Pool func GetSmoothingPoolRegisteredNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNodeManager, err := getRocketNodeManager(rp) + rocketNodeManager, err := getRocketNodeManager(rp, opts) if err != nil { return 0, err } @@ -933,32 +933,32 @@ func GetSmoothingPoolRegisteredNodeCount(rp *rocketpool.RocketPool, opts *bind.C // Get contracts var rocketNodeManagerLock sync.Mutex -func getRocketNodeManager(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNodeManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNodeManagerLock.Lock() defer rocketNodeManagerLock.Unlock() - return rp.GetContract("rocketNodeManager") + return rp.GetContract("rocketNodeManager", opts) } var rocketNetworkPricesLock sync.Mutex -func getRocketNetworkPrices(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkPrices(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkPricesLock.Lock() defer rocketNetworkPricesLock.Unlock() - return rp.GetContract("rocketNetworkPrices") + return rp.GetContract("rocketNetworkPrices", opts) } var rocketNetworkBalancesLock sync.Mutex -func getRocketNetworkBalances(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNetworkBalances(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkBalancesLock.Lock() defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances") + return rp.GetContract("rocketNetworkBalances", opts) } var rocketDAONodeTrustedActionsLock sync.Mutex -func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDAONodeTrustedActions(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAONodeTrustedActionsLock.Lock() defer rocketDAONodeTrustedActionsLock.Unlock() - return rp.GetContract("rocketDAONodeTrustedActions") + return rp.GetContract("rocketDAONodeTrustedActions", opts) } diff --git a/node/staking.go b/node/staking.go index 49429d512..3662e29f8 100644 --- a/node/staking.go +++ b/node/staking.go @@ -13,7 +13,7 @@ import ( // Get the total RPL staked in the network func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -26,7 +26,7 @@ func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, // Get the effective RPL staked in the network func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -39,7 +39,7 @@ func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get a node's RPL stake func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -52,7 +52,7 @@ func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Get a node's effective RPL stake func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -77,7 +77,7 @@ func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addr // Get a node's minimum RPL stake to collateralize their minipools func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -90,7 +90,7 @@ func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres // Get a node's maximum RPL stake to collateralize their minipools func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -103,7 +103,7 @@ func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres // Get the time a node last staked RPL func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return 0, err } @@ -116,7 +116,7 @@ func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, // Get a node's minipool limit based on RPL stake func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return 0, err } @@ -129,7 +129,7 @@ func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, // Estimate the gas of Stake func EstimateStakeGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -138,7 +138,7 @@ func EstimateStakeGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind. // Stake RPL func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return common.Hash{}, err } @@ -151,7 +151,7 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact // Estimate the gas of WithdrawRPL func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -160,7 +160,7 @@ func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts // Withdraw staked RPL func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return common.Hash{}, err } @@ -173,7 +173,7 @@ func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Trans // Calculate total effective RPL stake func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, rplPrice *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp) + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err } @@ -187,8 +187,8 @@ func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, r // Get contracts var rocketNodeStakingLock sync.Mutex -func getRocketNodeStaking(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketNodeStaking(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNodeStakingLock.Lock() defer rocketNodeStakingLock.Unlock() - return rp.GetContract("rocketNodeStaking") + return rp.GetContract("rocketNodeStaking", opts) } diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index ce06a53b9..aa585af54 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -12,7 +12,7 @@ import ( // Check if the given node has already claimed rewards for the given interval func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, opts) if err != nil { return false, err } @@ -25,7 +25,7 @@ func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common. // Get the Merkle root for an interval func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOpts) ([]byte, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, opts) if err != nil { return nil, err } @@ -38,7 +38,7 @@ func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOp // Estimate claim rewards gas func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -47,7 +47,7 @@ func EstimateClaimGas(rp *rocketpool.RocketPool, address common.Address, indices // Claim rewards func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, opts *bind.TransactOpts) (common.Hash, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil) if err != nil { return common.Hash{}, err } @@ -60,7 +60,7 @@ func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int // Estimate claim and restake rewards gas func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, stakeAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -69,7 +69,7 @@ func EstimateClaimAndStakeGas(rp *rocketpool.RocketPool, address common.Address, // Claim and restake rewards func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int, amountRPL []*big.Int, amountETH []*big.Int, merkleProofs [][]common.Hash, stakeAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDistributorMainnet, err := getRocketDistributorMainnet(rp) + rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil) if err != nil { return common.Hash{}, err } @@ -83,8 +83,8 @@ func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices [] // Get contracts var rocketDistributorMainnetLock sync.Mutex -func getRocketDistributorMainnet(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketDistributorMainnet(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDistributorMainnetLock.Lock() defer rocketDistributorMainnetLock.Unlock() - return rp.GetContract("rocketMerkleDistributorMainnet") + return rp.GetContract("rocketMerkleDistributorMainnet", opts) } diff --git a/rewards/rewards.go b/rewards/rewards.go index 9b00f85ac..1fcaeb79f 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -49,7 +49,7 @@ type RewardSubmission struct { // Get the index of the active rewards period func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -62,7 +62,7 @@ func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, e // Get the timestamp that the current rewards interval started func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return time.Time{}, err } @@ -75,7 +75,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get the number of seconds in a claim interval func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return 0, err } @@ -88,7 +88,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. // Get the percent of checkpoint rewards that goes to node operators func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt // Get the percent of checkpoint rewards that goes to ODAO members func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. // Get the percent of checkpoint rewards that goes to the PDAO func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -127,7 +127,7 @@ func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts // Get the amount of RPL rewards that will be provided to node operators func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -140,7 +140,7 @@ func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. // Get the amount of ETH rewards that will be provided to node operators func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return nil, err } @@ -153,7 +153,7 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -162,7 +162,7 @@ func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission Rewar // Submit a Merkle Tree-based snapshot for a rewards interval func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (common.Hash, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, nil) if err != nil { return common.Hash{}, err } @@ -174,9 +174,9 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } // Get the event info for a rewards snapshot -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int) (RewardsEvent, error) { +func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (RewardsEvent, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return RewardsEvent{}, err } @@ -233,9 +233,9 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address) (bool, RewardsEvent, error) { +func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp) + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { return false, RewardsEvent{}, err } @@ -295,8 +295,8 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, // Get contracts var rocketRewardsPoolLock sync.Mutex -func getRocketRewardsPool(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketRewardsPool(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketRewardsPoolLock.Lock() defer rocketRewardsPoolLock.Unlock() - return rp.GetContract("rocketRewardsPool") + return rp.GetContract("rocketRewardsPool", opts) } diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index b27f0bcc3..640b905bb 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -83,35 +83,39 @@ func NewRocketPool(client ExecutionClient, rocketStorageAddress common.Address) } // Load Rocket Pool contract addresses -func (rp *RocketPool) GetAddress(contractName string) (*common.Address, error) { +func (rp *RocketPool) GetAddress(contractName string, opts *bind.CallOpts) (*common.Address, error) { // Check for cached address - if cached, ok := rp.getCachedAddress(contractName); ok { - if time.Now().Unix()-cached.time <= CacheTTL { - return cached.address, nil - } else { - rp.deleteCachedAddress(contractName) + if opts == nil { + if cached, ok := rp.getCachedAddress(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.address, nil + } else { + rp.deleteCachedAddress(contractName) + } } } // Get address - address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) + address, err := rp.RocketStorage.GetAddress(opts, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) if err != nil { return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) } // Cache address - rp.setCachedAddress(contractName, cachedAddress{ - address: &address, - time: time.Now().Unix(), - }) + if opts == nil { + rp.setCachedAddress(contractName, cachedAddress{ + address: &address, + time: time.Now().Unix(), + }) + } // Return return &address, nil } -func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, error) { +func (rp *RocketPool) GetAddresses(opts *bind.CallOpts, contractNames ...string) ([]*common.Address, error) { // Data var wg errgroup.Group @@ -121,7 +125,7 @@ func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, for ci, contractName := range contractNames { ci, contractName := ci, contractName wg.Go(func() error { - address, err := rp.GetAddress(contractName) + address, err := rp.GetAddress(contractName, opts) if err == nil { addresses[ci] = address } @@ -140,19 +144,21 @@ func (rp *RocketPool) GetAddresses(contractNames ...string) ([]*common.Address, } // Load Rocket Pool contract ABIs -func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { +func (rp *RocketPool) GetABI(contractName string, opts *bind.CallOpts) (*abi.ABI, error) { // Check for cached ABI - if cached, ok := rp.getCachedABI(contractName); ok { - if time.Now().Unix()-cached.time <= CacheTTL { - return cached.abi, nil - } else { - rp.deleteCachedABI(contractName) + if opts == nil { + if cached, ok := rp.getCachedABI(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.abi, nil + } else { + rp.deleteCachedABI(contractName) + } } } // Get ABI - abiEncoded, err := rp.RocketStorage.GetString(nil, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) + abiEncoded, err := rp.RocketStorage.GetString(opts, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) } @@ -164,16 +170,18 @@ func (rp *RocketPool) GetABI(contractName string) (*abi.ABI, error) { } // Cache ABI - rp.setCachedABI(contractName, cachedABI{ - abi: abi, - time: time.Now().Unix(), - }) + if opts == nil { + rp.setCachedABI(contractName, cachedABI{ + abi: abi, + time: time.Now().Unix(), + }) + } // Return return abi, nil } -func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { +func (rp *RocketPool) GetABIs(opts *bind.CallOpts, contractNames ...string) ([]*abi.ABI, error) { // Data var wg errgroup.Group @@ -183,7 +191,7 @@ func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { for ci, contractName := range contractNames { ci, contractName := ci, contractName wg.Go(func() error { - abi, err := rp.GetABI(contractName) + abi, err := rp.GetABI(contractName, opts) if err == nil { abis[ci] = abi } @@ -202,14 +210,16 @@ func (rp *RocketPool) GetABIs(contractNames ...string) ([]*abi.ABI, error) { } // Load Rocket Pool contracts -func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { +func (rp *RocketPool) GetContract(contractName string, opts *bind.CallOpts) (*Contract, error) { // Check for cached contract - if cached, ok := rp.getCachedContract(contractName); ok { - if time.Now().Unix()-cached.time <= CacheTTL { - return cached.contract, nil - } else { - rp.deleteCachedContract(contractName) + if opts == nil { + if cached, ok := rp.getCachedContract(contractName); ok { + if time.Now().Unix()-cached.time <= CacheTTL { + return cached.contract, nil + } else { + rp.deleteCachedContract(contractName) + } } } @@ -221,12 +231,12 @@ func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { // Load data wg.Go(func() error { var err error - address, err = rp.GetAddress(contractName) + address, err = rp.GetAddress(contractName, opts) return err }) wg.Go(func() error { var err error - abi, err = rp.GetABI(contractName) + abi, err = rp.GetABI(contractName, opts) return err }) @@ -253,7 +263,7 @@ func (rp *RocketPool) GetContract(contractName string) (*Contract, error) { return contract, nil } -func (rp *RocketPool) GetContracts(contractNames ...string) ([]*Contract, error) { +func (rp *RocketPool) GetContracts(opts *bind.CallOpts, contractNames ...string) ([]*Contract, error) { // Data var wg errgroup.Group @@ -263,7 +273,7 @@ func (rp *RocketPool) GetContracts(contractNames ...string) ([]*Contract, error) for ci, contractName := range contractNames { ci, contractName := ci, contractName wg.Go(func() error { - contract, err := rp.GetContract(contractName) + contract, err := rp.GetContract(contractName, opts) if err == nil { contracts[ci] = contract } @@ -282,10 +292,10 @@ func (rp *RocketPool) GetContracts(contractNames ...string) ([]*Contract, error) } // Create a Rocket Pool contract instance -func (rp *RocketPool) MakeContract(contractName string, address common.Address) (*Contract, error) { +func (rp *RocketPool) MakeContract(contractName string, address common.Address, opts *bind.CallOpts) (*Contract, error) { // Load ABI - abi, err := rp.GetABI(contractName) + abi, err := rp.GetABI(contractName, opts) if err != nil { return nil, err } diff --git a/rocketpool/v1.0.0-manager.go b/rocketpool/v1.0.0-manager.go index d155378f4..a8f7084f4 100644 --- a/rocketpool/v1.0.0-manager.go +++ b/rocketpool/v1.0.0-manager.go @@ -1,6 +1,7 @@ package rocketpool import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/hashicorp/go-version" ) @@ -50,8 +51,8 @@ func (m *LegacyVersionWrapper_v1_0_0) GetEncodedABI(contractName string) string } // Get the contract with the provided name for this version of Rocket Pool -func (m *LegacyVersionWrapper_v1_0_0) GetContract(contractName string) (*Contract, error) { - return getLegacyContract(m.rp, contractName, m) +func (m *LegacyVersionWrapper_v1_0_0) GetContract(contractName string, opts *bind.CallOpts) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m, opts) } func (m *LegacyVersionWrapper_v1_0_0) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { diff --git a/rocketpool/v1.5.0-rc1-manager.go b/rocketpool/v1.5.0-rc1-manager.go index 30a7f3447..72699d151 100644 --- a/rocketpool/v1.5.0-rc1-manager.go +++ b/rocketpool/v1.5.0-rc1-manager.go @@ -1,6 +1,7 @@ package rocketpool import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/hashicorp/go-version" ) @@ -45,8 +46,8 @@ func (m *LegacyVersionWrapper_v1_5_0_rc1) GetEncodedABI(contractName string) str } // Get the contract with the provided name for this version of Rocket Pool -func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContract(contractName string) (*Contract, error) { - return getLegacyContract(m.rp, contractName, m) +func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContract(contractName string, opts *bind.CallOpts) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m, opts) } func (m *LegacyVersionWrapper_v1_5_0_rc1) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index c0eb6e9e8..6e8b23935 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -15,7 +15,7 @@ type LegacyVersionWrapper interface { GetVersion() *version.Version GetVersionedContractName(contractName string) (string, bool) GetEncodedABI(contractName string) string - GetContract(contractName string) (*Contract, error) + GetContract(contractName string, opts *bind.CallOpts) (*Contract, error) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) } @@ -35,12 +35,12 @@ func NewVersionManager(rp *RocketPool) *VersionManager { } // Get the contract with the provided name and version wrapper -func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapper) (*Contract, error) { +func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapper, opts *bind.CallOpts) (*Contract, error) { legacyName, exists := m.GetVersionedContractName(contractName) if !exists { // This wasn't upgraded in previous versions - return rp.GetContract(contractName) + return rp.GetContract(contractName, opts) } // Check for cached contract @@ -61,7 +61,7 @@ func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapp if address == emptyAddress { // Not found, so the legacy contract is still on the network - try loading the original contract name instead - return rp.GetContract(contractName) + return rp.GetContract(contractName, opts) } // If we're here, we have a legacy contract diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index f1205282b..362298c7f 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -18,7 +18,7 @@ const AuctionSettingsContractName = "rocketDAOProtocolSettingsAuction" // Lot creation currently enabled func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return false, err } @@ -34,7 +34,7 @@ func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind // Lot bidding currently enabled func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return false, err } @@ -50,7 +50,7 @@ func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind. // The minimum lot size in ETH value func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts // The maximum lot size in ETH value func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return nil, err } @@ -82,7 +82,7 @@ func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts // The lot duration in blocks func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return 0, err } @@ -98,7 +98,7 @@ func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.Tr // The starting price relative to current ETH price, as a fraction func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return 0, err } @@ -114,7 +114,7 @@ func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, op // The reserve price relative to current ETH price, as a fraction func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - auctionSettingsContract, err := getAuctionSettingsContract(rp) + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return 0, err } @@ -131,8 +131,8 @@ func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opt // Get contracts var auctionSettingsContractLock sync.Mutex -func getAuctionSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getAuctionSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { auctionSettingsContractLock.Lock() defer auctionSettingsContractLock.Unlock() - return rp.GetContract(AuctionSettingsContractName) + return rp.GetContract(AuctionSettingsContractName, opts) } diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 378ffc116..c31d7a3db 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -17,7 +17,7 @@ const DepositSettingsContractName = "rocketDAOProtocolSettingsDeposit" // Deposits currently enabled func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) + depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return false, err } @@ -33,7 +33,7 @@ func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.T // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) + depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return false, err } @@ -49,7 +49,7 @@ func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) + depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return nil, err } @@ -65,7 +65,7 @@ func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bi // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) + depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return nil, err } @@ -81,7 +81,7 @@ func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - depositSettingsContract, err := getDepositSettingsContract(rp) + depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return 0, err } @@ -98,8 +98,8 @@ func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, // Get contracts var depositSettingsContractLock sync.Mutex -func getDepositSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getDepositSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { depositSettingsContractLock.Lock() defer depositSettingsContractLock.Unlock() - return rp.GetContract(DepositSettingsContractName) + return rp.GetContract(DepositSettingsContractName, opts) } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index ffccc3c28..282c194b2 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -18,7 +18,7 @@ const InflationSettingsContractName = "rocketDAOProtocolSettingsInflation" // RPL inflation rate per interval func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - inflationSettingsContract, err := getInflationSettingsContract(rp) + inflationSettingsContract, err := getInflationSettingsContract(rp, opts) if err != nil { return 0, err } @@ -34,7 +34,7 @@ func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, op // RPL inflation start time func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - inflationSettingsContract, err := getInflationSettingsContract(rp) + inflationSettingsContract, err := getInflationSettingsContract(rp, opts) if err != nil { return 0, err } @@ -51,8 +51,8 @@ func BootstrapInflationStartTime(rp *rocketpool.RocketPool, value uint64, opts * // Get contracts var inflationSettingsContractLock sync.Mutex -func getInflationSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getInflationSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { inflationSettingsContractLock.Lock() defer inflationSettingsContractLock.Unlock() - return rp.GetContract(InflationSettingsContractName) + return rp.GetContract(InflationSettingsContractName, opts) } diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index f435614a6..491e7d012 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -18,7 +18,7 @@ const MinipoolSettingsContractName = "rocketDAOProtocolSettingsMinipool" // Get the minipool launch balance func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -31,7 +31,7 @@ func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (* // Required node deposit amounts func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -42,7 +42,7 @@ func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Call return *value, nil } func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -53,7 +53,7 @@ func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Call return *value, nil } func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Required user deposit amounts func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -77,7 +77,7 @@ func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Call return *value, nil } func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -88,7 +88,7 @@ func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Call return *value, nil } func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Cal // Minipool withdrawable event submissions currently enabled func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return false, err } @@ -117,7 +117,7 @@ func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value // Timeout period in seconds for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return 0, err } @@ -135,8 +135,8 @@ func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Durati // Get contracts var minipoolSettingsContractLock sync.Mutex -func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getMinipoolSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { minipoolSettingsContractLock.Lock() defer minipoolSettingsContractLock.Unlock() - return rp.GetContract(MinipoolSettingsContractName) + return rp.GetContract(MinipoolSettingsContractName, opts) } diff --git a/settings/protocol/network.go b/settings/protocol/network.go index f906da6fc..e1514018b 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -18,7 +18,7 @@ const NetworkSettingsContractName = "rocketDAOProtocolSettingsNetwork" // The threshold of trusted nodes that must reach consensus on oracle data to commit it func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -34,7 +34,7 @@ func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, o // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return false, err } @@ -50,7 +50,7 @@ func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -66,7 +66,7 @@ func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, o // Network price submissions currently enabled func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return false, err } @@ -82,7 +82,7 @@ func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *b // The frequency in blocks at which network prices should be submitted by trusted nodes func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -98,7 +98,7 @@ func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opt // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -114,7 +114,7 @@ func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bin // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -130,7 +130,7 @@ func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -146,7 +146,7 @@ func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bin // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return nil, err } @@ -162,7 +162,7 @@ func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - networkSettingsContract, err := getNetworkSettingsContract(rp) + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } @@ -179,8 +179,8 @@ func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, // Get contracts var networkSettingsContractLock sync.Mutex -func getNetworkSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getNetworkSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { networkSettingsContractLock.Lock() defer networkSettingsContractLock.Unlock() - return rp.GetContract(NetworkSettingsContractName) + return rp.GetContract(NetworkSettingsContractName, opts) } diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 65349692d..ebba596e4 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -18,7 +18,7 @@ const NodeSettingsContractName = "rocketDAOProtocolSettingsNode" // Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) if err != nil { return false, err } @@ -34,7 +34,7 @@ func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opt // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) if err != nil { return false, err } @@ -50,7 +50,7 @@ func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bi // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) if err != nil { return 0, err } @@ -66,7 +66,7 @@ func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, // The maximum RPL stake per minipool as a fraction of assigned user ETH func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - nodeSettingsContract, err := getNodeSettingsContract(rp) + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) if err != nil { return 0, err } @@ -83,8 +83,8 @@ func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, // Get contracts var nodeSettingsContractLock sync.Mutex -func getNodeSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getNodeSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { nodeSettingsContractLock.Lock() defer nodeSettingsContractLock.Unlock() - return rp.GetContract(NodeSettingsContractName) + return rp.GetContract(NodeSettingsContractName, opts) } diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 9b0d5322d..da5c6ecb9 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -18,7 +18,7 @@ const RewardsSettingsContractName = "rocketDAOProtocolSettingsRewards" // The claim amount for a claimer as a fraction func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (float64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -31,7 +31,7 @@ func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts // The time that a claimer's share was last updated func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -44,7 +44,7 @@ func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName st // The total claim amount for all claimers as a fraction func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -57,7 +57,7 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) // Rewards claim interval time func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -74,8 +74,8 @@ func BootstrapRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value uint64, // Get contracts var rewardsSettingsContractLock sync.Mutex -func getRewardsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRewardsSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rewardsSettingsContractLock.Lock() defer rewardsSettingsContractLock.Unlock() - return rp.GetContract(RewardsSettingsContractName) + return rp.GetContract(RewardsSettingsContractName, opts) } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 00f884c4e..9a465a3cb 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -27,7 +27,7 @@ const ( // Member proposal quorum threshold func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return 0, err } @@ -49,7 +49,7 @@ func EstimateProposeQuorumGas(rp *rocketpool.RocketPool, value float64, opts *bi // RPL bond required for a member func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return nil, err } @@ -71,7 +71,7 @@ func EstimateProposeRPLBondGas(rp *rocketpool.RocketPool, value *big.Int, opts * // The maximum number of unbonded minipools a member can run func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return 0, err } @@ -93,7 +93,7 @@ func EstimateProposeMinipoolUnbondedMaxGas(rp *rocketpool.RocketPool, value uint // The minimum commission rate before unbonded minipools are allowed func GetMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return 0, err } @@ -115,7 +115,7 @@ func EstimateProposeMinipoolUnbondedMinFeeGas(rp *rocketpool.RocketPool, value u // The period a member must wait for before submitting another challenge, in blocks func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return 0, err } @@ -137,7 +137,7 @@ func EstimateProposeChallengeCooldownGas(rp *rocketpool.RocketPool, value uint64 // The period during which a member can respond to a challenge, in blocks func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return 0, err } @@ -159,7 +159,7 @@ func EstimateProposeChallengeWindowGas(rp *rocketpool.RocketPool, value uint64, // The fee for a non-member to challenge a member, in wei func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - membersSettingsContract, err := getMembersSettingsContract(rp) + membersSettingsContract, err := getMembersSettingsContract(rp, opts) if err != nil { return nil, err } @@ -182,8 +182,8 @@ func EstimateProposeChallengeCostGas(rp *rocketpool.RocketPool, value *big.Int, // Get contracts var membersSettingsContractLock sync.Mutex -func getMembersSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getMembersSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { membersSettingsContractLock.Lock() defer membersSettingsContractLock.Unlock() - return rp.GetContract(MembersSettingsContractName) + return rp.GetContract(MembersSettingsContractName, opts) } diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 789e00ddf..4bb98264d 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -21,7 +21,7 @@ const ( // The cooldown period a member must wait after making a proposal before making another in seconds func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return 0, err } @@ -43,7 +43,7 @@ func EstimateProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts // Whether or not the RPL slashing penalty is applied to scrubbed minipools func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp) + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return false, err } @@ -66,8 +66,8 @@ func EstimateProposeScrubPenaltyEnabledGas(rp *rocketpool.RocketPool, value bool // Get contracts var minipoolSettingsContractLock sync.Mutex -func getMinipoolSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getMinipoolSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { minipoolSettingsContractLock.Lock() defer minipoolSettingsContractLock.Unlock() - return rp.GetContract(MinipoolSettingsContractName) + return rp.GetContract(MinipoolSettingsContractName, opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index a8550c869..6c4e296b1 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -24,7 +24,7 @@ const ( // The cooldown period a member must wait after making a proposal before making another in seconds func GetProposalCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -46,7 +46,7 @@ func EstimateProposeProposalCooldownTimeGas(rp *rocketpool.RocketPool, value uin // The period a proposal can be voted on for in seconds func GetProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -68,7 +68,7 @@ func EstimateProposeProposalVoteTimeGas(rp *rocketpool.RocketPool, value uint64, // The delay after creation before a proposal can be voted on in seconds func GetProposalVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -90,7 +90,7 @@ func EstimateProposeProposalVoteDelayTimeGas(rp *rocketpool.RocketPool, value ui // The period during which a passed proposal can be executed in time func GetProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -112,7 +112,7 @@ func EstimateProposeProposalExecuteTimeGas(rp *rocketpool.RocketPool, value uint // The period during which an action can be performed on an executed proposal in seconds func GetProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp) + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } @@ -135,8 +135,8 @@ func EstimateProposeProposalActionTimeGas(rp *rocketpool.RocketPool, value uint6 // Get contracts var proposalsSettingsContractLock sync.Mutex -func getProposalsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getProposalsSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { proposalsSettingsContractLock.Lock() defer proposalsSettingsContractLock.Unlock() - return rp.GetContract(ProposalsSettingsContractName) + return rp.GetContract(ProposalsSettingsContractName, opts) } diff --git a/settings/trustednode/rewards.go b/settings/trustednode/rewards.go index 18c492550..68750e440 100644 --- a/settings/trustednode/rewards.go +++ b/settings/trustednode/rewards.go @@ -18,7 +18,7 @@ const ( // Get whether or not the provided rewards network is enabled func GetNetworkEnabled(rp *rocketpool.RocketPool, network *big.Int, opts *bind.CallOpts) (bool, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp) + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return false, err } @@ -32,8 +32,8 @@ func GetNetworkEnabled(rp *rocketpool.RocketPool, network *big.Int, opts *bind.C // Get contracts var rewardsSettingsContractLock sync.Mutex -func getRewardsSettingsContract(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRewardsSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rewardsSettingsContractLock.Lock() defer rewardsSettingsContractLock.Unlock() - return rp.GetContract(RewardsSettingsContractName) + return rp.GetContract(RewardsSettingsContractName, opts) } diff --git a/storage/address-queue-storage.go b/storage/address-queue-storage.go index e4fc1d302..f17f02f2c 100644 --- a/storage/address-queue-storage.go +++ b/storage/address-queue-storage.go @@ -14,7 +14,7 @@ import ( // Return the length of all addresses matching the given key in the queue func GetAddressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte) (uint64, error) { - addressQueueStorage, err := getAddressQueueStorage(rp) + addressQueueStorage, err := getAddressQueueStorage(rp, opts) if err != nil { return 0, err } @@ -27,7 +27,7 @@ func GetAddressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [ // Return address item at index for the given key func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, index *big.Int) (common.Address, error) { - addressQueueStorage, err := getAddressQueueStorage(rp) + addressQueueStorage, err := getAddressQueueStorage(rp, opts) if err != nil { return common.Address{}, err } @@ -40,7 +40,7 @@ func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32 // Return index of the input address for the given key. -1 if not present. func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32]byte, address common.Address) (int64, error) { - addressQueueStorage, err := getAddressQueueStorage(rp) + addressQueueStorage, err := getAddressQueueStorage(rp, opts) if err != nil { return 0, err } @@ -54,8 +54,8 @@ func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key // Get contracts var AddressQueueStorageLock sync.Mutex -func getAddressQueueStorage(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getAddressQueueStorage(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { AddressQueueStorageLock.Lock() defer AddressQueueStorageLock.Unlock() - return rp.GetContract("addressQueueStorage") + return rp.GetContract("addressQueueStorage", opts) } diff --git a/tokens/reth.go b/tokens/reth.go index 79f29541f..337e40d69 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -18,7 +18,7 @@ import ( // Get rETH total supply func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -27,7 +27,7 @@ func GetRETHTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In // Get rETH balance func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -36,7 +36,7 @@ func GetRETHBalance(rp *rocketpool.RocketPool, address common.Address, opts *bin // Get rETH allowance func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -45,7 +45,7 @@ func GetRETHAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, // Estimate the gas of TransferRETH func EstimateTransferRETHGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -54,7 +54,7 @@ func EstimateTransferRETHGas(rp *rocketpool.RocketPool, to common.Address, amoun // Transfer rETH func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return common.Hash{}, err } @@ -63,7 +63,7 @@ func TransferRETH(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, // Estimate the gas of ApproveRETH func EstimateApproveRETHGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -72,7 +72,7 @@ func EstimateApproveRETHGas(rp *rocketpool.RocketPool, spender common.Address, a // Approve a rETH spender func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return common.Hash{}, err } @@ -81,7 +81,7 @@ func ApproveRETH(rp *rocketpool.RocketPool, spender common.Address, amount *big. // Estimate the gas of TransferFromRETH func EstimateTransferFromRETHGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -90,7 +90,7 @@ func EstimateTransferFromRETHGas(rp *rocketpool.RocketPool, from, to common.Addr // Transfer rETH from a sender func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return common.Hash{}, err } @@ -103,7 +103,7 @@ func TransferFromRETH(rp *rocketpool.RocketPool, from, to common.Address, amount // Get the rETH contract ETH balance func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func GetRETHContractETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get the ETH value of an amount of rETH func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bin // Get the rETH value of an amount of ETH func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -138,7 +138,7 @@ func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind // Get the current ETH : rETH exchange rate func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return 0, err } @@ -151,7 +151,7 @@ func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float6 // Get the total amount of ETH collateral available for rETH trades func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return nil, err } @@ -164,7 +164,7 @@ func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi // Get the rETH collateralization rate func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, opts) if err != nil { return 0, err } @@ -177,7 +177,7 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa // Estimate the gas of BurnRETH func EstimateBurnRETHGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -186,7 +186,7 @@ func EstimateBurnRETHGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind. // Burn rETH for ETH func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRETH, err := getRocketTokenRETH(rp) + rocketTokenRETH, err := getRocketTokenRETH(rp, nil) if err != nil { return common.Hash{}, err } @@ -204,8 +204,8 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt // Get contracts var rocketTokenRETHLock sync.Mutex -func getRocketTokenRETH(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketTokenRETH(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketTokenRETHLock.Lock() defer rocketTokenRETHLock.Unlock() - return rp.GetContract("rocketTokenRETH") + return rp.GetContract("rocketTokenRETH", opts) } diff --git a/tokens/rpl-fixed.go b/tokens/rpl-fixed.go index 00562d24c..bebbad1e3 100644 --- a/tokens/rpl-fixed.go +++ b/tokens/rpl-fixed.go @@ -16,7 +16,7 @@ import ( // Get fixed-supply RPL total supply func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, opts) if err != nil { return nil, err } @@ -25,7 +25,7 @@ func GetFixedSupplyRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts // Get fixed-supply RPL balance func GetFixedSupplyRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, opts) if err != nil { return nil, err } @@ -34,7 +34,7 @@ func GetFixedSupplyRPLBalance(rp *rocketpool.RocketPool, address common.Address, // Get fixed-supply RPL allowance func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, opts) if err != nil { return nil, err } @@ -43,7 +43,7 @@ func GetFixedSupplyRPLAllowance(rp *rocketpool.RocketPool, owner, spender common // Estimate the gas of TransferFixedSupplyRPL func EstimateTransferFixedSupplyRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -52,7 +52,7 @@ func EstimateTransferFixedSupplyRPLGas(rp *rocketpool.RocketPool, to common.Addr // Transfer fixed-supply RPL func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return common.Hash{}, err } @@ -61,7 +61,7 @@ func TransferFixedSupplyRPL(rp *rocketpool.RocketPool, to common.Address, amount // Estimate the gas of ApproveFixedSupplyRPL func EstimateApproveFixedSupplyRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -70,7 +70,7 @@ func EstimateApproveFixedSupplyRPLGas(rp *rocketpool.RocketPool, spender common. // Approve an fixed-supply RPL spender func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return common.Hash{}, err } @@ -79,7 +79,7 @@ func ApproveFixedSupplyRPL(rp *rocketpool.RocketPool, spender common.Address, am // Estimate the gas of TransferFromFixedSupplyRPL func EstimateTransferFromFixedSupplyRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -88,7 +88,7 @@ func EstimateTransferFromFixedSupplyRPLGas(rp *rocketpool.RocketPool, from, to c // Transfer fixed-supply RPL from a sender func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp) + rocketTokenFixedSupplyRPL, err := getRocketTokenRPLFixedSupply(rp, nil) if err != nil { return common.Hash{}, err } @@ -102,8 +102,8 @@ func TransferFromFixedSupplyRPL(rp *rocketpool.RocketPool, from, to common.Addre // Get contracts var rocketTokenFixedSupplyRPLLock sync.Mutex -func getRocketTokenRPLFixedSupply(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketTokenRPLFixedSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketTokenFixedSupplyRPLLock.Lock() defer rocketTokenFixedSupplyRPLLock.Unlock() - return rp.GetContract("rocketTokenRPLFixedSupply") + return rp.GetContract("rocketTokenRPLFixedSupply", opts) } diff --git a/tokens/rpl.go b/tokens/rpl.go index bb6e0f829..e7825567f 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -17,7 +17,7 @@ import ( // Get RPL total supply func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, opts) if err != nil { return nil, err } @@ -26,7 +26,7 @@ func GetRPLTotalSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int // Get RPL balance func GetRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, opts) if err != nil { return nil, err } @@ -35,7 +35,7 @@ func GetRPLBalance(rp *rocketpool.RocketPool, address common.Address, opts *bind // Get RPL allowance func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, opts) if err != nil { return nil, err } @@ -44,7 +44,7 @@ func GetRPLAllowance(rp *rocketpool.RocketPool, owner, spender common.Address, o // Estimate the gas of TransferRPL func EstimateTransferRPLGas(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -53,7 +53,7 @@ func EstimateTransferRPLGas(rp *rocketpool.RocketPool, to common.Address, amount // Transfer RPL func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return common.Hash{}, err } @@ -62,7 +62,7 @@ func TransferRPL(rp *rocketpool.RocketPool, to common.Address, amount *big.Int, // Estimate the gas of ApproveRPL func EstimateApproveRPLGas(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -71,7 +71,7 @@ func EstimateApproveRPLGas(rp *rocketpool.RocketPool, spender common.Address, am // Approve an RPL spender func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return common.Hash{}, err } @@ -80,7 +80,7 @@ func ApproveRPL(rp *rocketpool.RocketPool, spender common.Address, amount *big.I // Estimate the gas of TransferFromRPL func EstimateTransferFromRPLGas(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -89,7 +89,7 @@ func EstimateTransferFromRPLGas(rp *rocketpool.RocketPool, from, to common.Addre // Transfer RPL from a sender func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return common.Hash{}, err } @@ -102,7 +102,7 @@ func TransferFromRPL(rp *rocketpool.RocketPool, from, to common.Address, amount // Estimate the gas of MintInflationRPL func EstimateMintInflationRPLGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -111,7 +111,7 @@ func EstimateMintInflationRPLGas(rp *rocketpool.RocketPool, opts *bind.TransactO // Mint new RPL tokens from inflation func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return common.Hash{}, err } @@ -124,7 +124,7 @@ func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo // Estimate the gas of SwapFixedSupplyRPLForRPL func EstimateSwapFixedSupplyRPLForRPLGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -133,7 +133,7 @@ func EstimateSwapFixedSupplyRPLForRPLGas(rp *rocketpool.RocketPool, amount *big. // Swap fixed-supply RPL for new RPL tokens func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, nil) if err != nil { return common.Hash{}, err } @@ -146,7 +146,7 @@ func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts * // Get the RPL inflation interval rate func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketTokenRPL, err := getRocketTokenRPL(rp) + rocketTokenRPL, err := getRocketTokenRPL(rp, opts) if err != nil { return nil, err } @@ -164,8 +164,8 @@ func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) // Get contracts var rocketTokenRPLLock sync.Mutex -func getRocketTokenRPL(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketTokenRPL(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketTokenRPLLock.Lock() defer rocketTokenRPLLock.Unlock() - return rp.GetContract("rocketTokenRPL") + return rp.GetContract("rocketTokenRPL", opts) } diff --git a/utils/address_generation.go b/utils/address_generation.go index 94ec9edad..2d534a8bb 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -5,6 +5,7 @@ import ( "math/big" "sync" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/minipool" @@ -23,14 +24,14 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte) (common.Address, error) { +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { // Get dependencies - rocketMinipoolFactory, err := getRocketMinipoolFactory(rp) + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) if err != nil { return common.Address{}, err } - minipoolAbi, err := rp.GetABI("rocketMinipool") + minipoolAbi, err := rp.GetABI("rocketMinipool", opts) if err != nil { return common.Address{}, err } @@ -63,8 +64,8 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo // Get contracts var rocketMinipoolFactoryLock sync.Mutex -func getRocketMinipoolFactory(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getRocketMinipoolFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolFactoryLock.Lock() defer rocketMinipoolFactoryLock.Unlock() - return rp.GetContract("rocketMinipoolFactory") + return rp.GetContract("rocketMinipoolFactory", opts) } diff --git a/utils/deposit_retrieval.go b/utils/deposit_retrieval.go index b667cce86..d23f7d472 100644 --- a/utils/deposit_retrieval.go +++ b/utils/deposit_retrieval.go @@ -40,7 +40,7 @@ type DepositData struct { func GetDeposits(rp *rocketpool.RocketPool, pubkeys map[rptypes.ValidatorPubkey]bool, startBlock *big.Int, intervalSize *big.Int, opts *bind.CallOpts) (map[rptypes.ValidatorPubkey][]DepositData, error) { // Get the deposit contract wrapper - casperDeposit, err := getCasperDeposit(rp) + casperDeposit, err := getCasperDeposit(rp, opts) if err != nil { return nil, err } @@ -116,8 +116,8 @@ func sortDepositData(data []DepositData) { // Get contracts var casperDepositLock sync.Mutex -func getCasperDeposit(rp *rocketpool.RocketPool) (*rocketpool.Contract, error) { +func getCasperDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { casperDepositLock.Lock() defer casperDepositLock.Unlock() - return rp.GetContract("casperDeposit") + return rp.GetContract("casperDeposit", opts) } diff --git a/utils/eth/logs.go b/utils/eth/logs.go index a653ab7fe..783c8a397 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -5,6 +5,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -18,8 +19,8 @@ type FilterQuery struct { Topics [][]common.Hash } -func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q FilterQuery, intervalSize *big.Int) ([]types.Log, error) { - rocketDaoNodeTrustedUpgrade, err := rp.GetContract("rocketDAONodeTrustedUpgrade") +func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q FilterQuery, intervalSize *big.Int, opts *bind.CallOpts) ([]types.Log, error) { + rocketDaoNodeTrustedUpgrade, err := rp.GetContract("rocketDAONodeTrustedUpgrade", opts) if err != nil { return nil, err } @@ -37,7 +38,7 @@ func FilterContractLogs(rp *rocketpool.RocketPool, contractName string, q Filter addresses = append(addresses, common.HexToAddress(log.Topics[2].Hex())) } // Append current address - currentAddress, err := rp.GetAddress(contractName) + currentAddress, err := rp.GetAddress(contractName, opts) if err != nil { return nil, err } From b3cc8cf3939ff317e4e4b6c77c3d68d601407383 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 16 Nov 2022 01:11:12 -0500 Subject: [PATCH 510/878] Added RocketNodeStaking to the v1.1.0 manager, added the Atlas functions for RocketNodeStaking --- legacy/v1.1.0/node/staking.go | 211 ++++++++++++++++++++++++++++++++++ node/staking.go | 27 +++-- rocketpool/v1.1.0-manager.go | 5 +- 3 files changed, 235 insertions(+), 8 deletions(-) create mode 100644 legacy/v1.1.0/node/staking.go diff --git a/legacy/v1.1.0/node/staking.go b/legacy/v1.1.0/node/staking.go new file mode 100644 index 000000000..592aa7e3f --- /dev/null +++ b/legacy/v1.1.0/node/staking.go @@ -0,0 +1,211 @@ +package node + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get the version of the Node Staking contract +func GetNodeStakingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (uint8, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return 0, err + } + version := new(uint8) + if err := rocketNodeStaking.Call(opts, version, "version"); err != nil { + return 0, fmt.Errorf("Could not get node staking version: %w", err) + } + return *version, nil +} + +// Get the total RPL staked in the network +func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + totalRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) + } + return *totalRplStake, nil +} + +// Get the effective RPL staked in the network +func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { + return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil +} + +// Get a node's RPL stake +func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + nodeRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) + } + return *nodeRplStake, nil +} + +// Get a node's effective RPL stake +func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + nodeEffectiveRplStakeWrapper := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStakeWrapper, "getNodeEffectiveRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) + } + + minimumStake, err := GetNodeMinimumRPLStake(rp, nodeAddress, opts, legacyRocketNodeStakingAddress) + if err != nil { + return nil, fmt.Errorf("Could not get minimum node RPL stake to verify effective stake: %w", err) + } + + nodeEffectiveRplStake := *nodeEffectiveRplStakeWrapper + if nodeEffectiveRplStake.Cmp(minimumStake) == -1 { + // Effective stake should be zero if it's less than the minimum RPL stake + return big.NewInt(0), nil + } + + return nodeEffectiveRplStake, nil +} + +// Get a node's minimum RPL stake to collateralize their minipools +func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + nodeMinimumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) + } + return *nodeMinimumRplStake, nil +} + +// Get a node's maximum RPL stake to collateralize their minipools +func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + nodeMaximumRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) + } + return *nodeMaximumRplStake, nil +} + +// Get the time a node last staked RPL +func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (uint64, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return 0, err + } + nodeRplStakedTime := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) + } + return (*nodeRplStakedTime).Uint64(), nil +} + +// Get a node's minipool limit based on RPL stake +func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (uint64, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return 0, err + } + minipoolLimit := new(*big.Int) + if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { + return 0, fmt.Errorf("Could not get node minipool limit: %w", err) + } + return (*minipoolLimit).Uint64(), nil +} + +// Estimate the gas of Stake +func EstimateStakeGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts, legacyRocketNodeStakingAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "stakeRPL", rplAmount) +} + +// Stake RPL +func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts, legacyRocketNodeStakingAddress *common.Address) (common.Hash, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas of WithdrawRPL +func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts, legacyRocketNodeStakingAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", rplAmount) +} + +// Withdraw staked RPL +func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts, legacyRocketNodeStakingAddress *common.Address) (common.Hash, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) + } + return tx.Hash(), nil +} + +// Calculate total effective RPL stake +func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, rplPrice *big.Int, opts *bind.CallOpts, legacyRocketNodeStakingAddress *common.Address) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, legacyRocketNodeStakingAddress, opts) + if err != nil { + return nil, err + } + totalEffectiveRplStake := new(*big.Int) + if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { + return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) + } + return *totalEffectiveRplStake, nil +} + +// Get contracts +var rocketNodeStakingLock sync.Mutex + +func getRocketNodeStaking(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNodeStakingLock.Lock() + defer rocketNodeStakingLock.Unlock() + if address == nil { + return rp.VersionManager.V1_1_0.GetContract("rocketNodeStaking", opts) + } else { + return rp.VersionManager.V1_1_0.GetContractWithAddress("rocketNodeStaking", *address) + } +} diff --git a/node/staking.go b/node/staking.go index 860f4f661..2a288177f 100644 --- a/node/staking.go +++ b/node/staking.go @@ -127,17 +127,30 @@ func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, return (*nodeRplStakedTime).Uint64(), nil } -// Get a node's minipool limit based on RPL stake -func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { +// Get the amount of ETH the node has borrowed from the deposit pool to create its minipools +func GetNodeEthMatched(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { - return 0, err + return nil, err + } + nodeEthMatched := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEthMatched, "getNodeETHMatched", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node ETH matched: %w", err) + } + return *nodeEthMatched, nil +} + +// Get the amount of ETH the node can borrow from the deposit pool to create its minipools +func GetNodeEthMatchedLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) + if err != nil { + return nil, err } - minipoolLimit := new(*big.Int) - if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node minipool limit: %w", err) + nodeEthMatchedLimit := new(*big.Int) + if err := rocketNodeStaking.Call(opts, nodeEthMatchedLimit, "getNodeETHMatchedLimit", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node ETH matched limit: %w", err) } - return (*minipoolLimit).Uint64(), nil + return *nodeEthMatchedLimit, nil } // Estimate the gas of Stake diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go index c54aa453f..c4c50da6a 100644 --- a/rocketpool/v1.1.0-manager.go +++ b/rocketpool/v1.1.0-manager.go @@ -22,9 +22,12 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 rpVersion: rpVersion, contractNameMap: map[string]string{ "rocketNetworkPrices": "rocketNetworkPrices.v1", + "rocketNodeStaking": "rocketNodeStaking.v2", }, abiMap: map[string]string{ - "rocketNetworkPrices": "eNrtVsFqwkAQ/ZWy55wKLcVbW3ooWBBtTyIy2UxkMdkNu7O2Iv57JxoTA9HYNkUP3pLszJu3b3beZrwSSmeenOiN80dCqyF5X2YoekIaTRYk3QyNnCONyFiY4WseFINEEQgNaR44tfsBj1Fk0Tlepi0OFB/Wk0A4AsI3TxCqRNGSV7XRGSwhTLDK4MqOrJcMKNbBSgAHLVPjmWYMicOgzjrCL4xEjzM2K7VNQMmmIBtbkzZwC/aAyho1JM/vt3f3FVKY8LYrqN36b6BslgysktgNGsYxSlILHGbJiGDeESyptAlpUgZstuBGPkwVEQOXsbhATT/o5LUBf2nARxbBAflLsaucBVqnjOZo4+mQFeS1HioidRIPByZ7ofCzioy9Zkm40AEeM6Qt/aeiqy10aso0q9IBpeGgvzsXF8HnpTxZg/7uZF0mseIUnrub7dWmwH7E83FssJSWFsHhcflPvt/+k2qEl0H1qDm35La5cUv6KfZbCeY299XWe64aNWvE15T0VMx091LtD9oz//uhdt4dN43QmKTJMTbfO/K0PiM4GmJmLOXbOIeXTb4BvAjxkA==", + "rocketNetworkPrices": "eJztVslu2zAQ/ZVCZx+0kKKYW1v0UMAFDKc9BUEwJIeBEJkSSMqNEeTfSyuKFSVektYpjKIHAzI5y3sz5ONc3EWlaVrvorOL9adHa6D6vmowOotkbbwF6T/Ma3mD/tzXFq7x69pIg8RoEhlYrA2v7FODj0pZdC5s+4c40C/cX04i58Hjt9aDKKvSr8KuqU0DKxAVDh4hs/O2lSFgWHTltQHf2uc795O7CIL7alG3gYCGyuFkzEfhLaroLHh0OyN6sMHZ09C2XmxBPXkSaJNjFKkN/1OaD5FEFQoyhHrc/51QtqlmtpR4nGioNUpfLnHeVOcebo4U1peLbZEuNwYdBXfeikXpfQi8scUlGv+sx/FtDimNmS6IykETolLgMqMUmE4wkyTniUhIHtNEIqdxIkjKVUEIE8BplsjsDUfjf0f/pKM/GgWv6SfqVOsiyVBLHn4sZzzN8lwSkJDmjAkWukshyUBrSYniwSOjShbIhWBZT6Hv3gBiidaVtQn56tbvkrE1+GJgNmZV7FClZYk/B0vdmlDjLlEnQBA49qIyJkqJVkTReBfga/QPhfvUn6cDuEc92d6Po2GPNZJYSLUH+3w2fTy6JwScpUQRiPke4F82t2Q2fbwlJ8SASlGknONbGPRX7wQPEtJcJIoVYzaHYV1BUOtOPXbLTmmkRXC4v6GvHjSecBpzELRQBVfZe3BQ+Hc4xDQNrSDxmznsfewO+B563Q64v+Y5GyrpuoHiQVGPfQAgTYjM5L9bvDAPyNb3OvIuNdSMKgYi3yVrpfkchASNa8eZX1AVdV1tk69u/ajalQW8NI7JHiWehlTOz7GprV8X4gQVGMLUlORhLru//AWSfqX7", + + "rocketNodeStaking": "eJzdV8FOAjEQ/RXT855MNIabB01M0BglejCEDN1Zaey2m3YKEuO/OwXcdbMsIkJEbix9ffPem+5k+/QmlCkCedF5ij8JnQHdmxYoOkJaQw4kHd1Z+YJ0T9bBM15FUAYSRSIM5BE4cF8B52nq0HtepjkPLP547yfCExBeB4Kh0oqmvGqsKWAKQ43VDq7syQXJhOI9eRPAoGluA8vMQHtM6qpTfMVUdHjHbKVmAko1C7HGprhEW/KFqKxRYwr8fHxyWjEBKzJUcX0CNuFCGj2ADrgdNlL5MqZ+Cbi77d5r8CPmLGE4Rnaz7bgzZ/P9i3utgAhedp8P2f+ZzqOiUepgYpYFVMZRbRmj88pGtA3UNnFiqbNKR13DWcsAGSucVMgsGEmxUIuOZ6SeJdCfDf5eUC2a5bFsJqpRrXE4BnFYrZynlasbhh60qbQ3P5Z/5ax5hi6yDBk43svcG9VslnlsnRCr92qVqw23ukLfOiVXDxQJWgbNvvc/11+f58N2d62MykN+mN7g9XC9cd8Ka3V38abvjbNGtUHrp05lysf+cJ9qRta+fuwo8zWG5U+8XfLlaJf2NhI3WXwW/sfs+Q42uxSdr9GDiNuCx/4HCbNAvw==", }, } } From 95c17dcc25b45c053430b4545e73ab8b5e10bea1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 16 Nov 2022 03:41:54 -0500 Subject: [PATCH 511/878] Added rocketNodeDeposit to the version manager, updated with Atlas changes --- legacy/v1.1.0/node/deposit.go | 64 +++++++++++++++++++++++++++++++++++ node/deposit.go | 22 ++++++------ rocketpool/v1.1.0-manager.go | 3 ++ 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 legacy/v1.1.0/node/deposit.go diff --git a/legacy/v1.1.0/node/deposit.go b/legacy/v1.1.0/node/deposit.go new file mode 100644 index 000000000..8b6b7a694 --- /dev/null +++ b/legacy/v1.1.0/node/deposit.go @@ -0,0 +1,64 @@ +package node + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Estimate the gas of Deposit +func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts, legacyRocketNodeDepositAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, legacyRocketNodeDepositAddress, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) +} + +// Make a node deposit +func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts, legacyRocketNodeDepositAddress *common.Address) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, legacyRocketNodeDepositAddress, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + if err != nil { + return nil, fmt.Errorf("Could not make node deposit: %w", err) + } + return tx, nil +} + +// Get the type of a deposit based on the amount +func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallOpts, legacyRocketNodeDepositAddress *common.Address) (rptypes.MinipoolDeposit, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, legacyRocketNodeDepositAddress, opts) + if err != nil { + return rptypes.Empty, err + } + + depositType := new(uint8) + if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { + return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) + } + return rptypes.MinipoolDeposit(*depositType), nil +} + +// Get contracts +var rocketNodeDepositLock sync.Mutex + +func getRocketNodeDeposit(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNodeDepositLock.Lock() + defer rocketNodeDepositLock.Unlock() + if address == nil { + return rp.VersionManager.V1_1_0.GetContract("rocketNodeDeposit", opts) + } else { + return rp.VersionManager.V1_1_0.GetContractWithAddress("rocketNodeDeposit", *address) + } +} diff --git a/node/deposit.go b/node/deposit.go index bdd814324..f6b2c6ed5 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -15,39 +15,39 @@ import ( ) // Estimate the gas of Deposit -func EstimateDepositGas(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateDepositGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) } // Make a node deposit -func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { +func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + tx, err := rocketNodeDeposit.Transact(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { return nil, fmt.Errorf("Could not make node deposit: %w", err) } return tx, nil } -// Get the type of a deposit based on the amount -func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { +// Get the amount of ETH in the node's deposit credit bank +func GetNodeDepositCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) if err != nil { - return rptypes.Empty, err + return nil, err } - depositType := new(uint8) - if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { - return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) + creditBalance := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, creditBalance, "getNodeDepositCredit", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node deposit credit: %w", err) } - return rptypes.MinipoolDeposit(*depositType), nil + return *creditBalance, nil } // Get contracts diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go index c4c50da6a..5f24fcee4 100644 --- a/rocketpool/v1.1.0-manager.go +++ b/rocketpool/v1.1.0-manager.go @@ -23,11 +23,14 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 contractNameMap: map[string]string{ "rocketNetworkPrices": "rocketNetworkPrices.v1", "rocketNodeStaking": "rocketNodeStaking.v2", + "rocketNodeDeposit": "rocketNodeDeposit.v2", }, abiMap: map[string]string{ "rocketNetworkPrices": "eJztVslu2zAQ/ZVCZx+0kKKYW1v0UMAFDKc9BUEwJIeBEJkSSMqNEeTfSyuKFSVektYpjKIHAzI5y3sz5ONc3EWlaVrvorOL9adHa6D6vmowOotkbbwF6T/Ma3mD/tzXFq7x69pIg8RoEhlYrA2v7FODj0pZdC5s+4c40C/cX04i58Hjt9aDKKvSr8KuqU0DKxAVDh4hs/O2lSFgWHTltQHf2uc795O7CIL7alG3gYCGyuFkzEfhLaroLHh0OyN6sMHZ09C2XmxBPXkSaJNjFKkN/1OaD5FEFQoyhHrc/51QtqlmtpR4nGioNUpfLnHeVOcebo4U1peLbZEuNwYdBXfeikXpfQi8scUlGv+sx/FtDimNmS6IykETolLgMqMUmE4wkyTniUhIHtNEIqdxIkjKVUEIE8BplsjsDUfjf0f/pKM/GgWv6SfqVOsiyVBLHn4sZzzN8lwSkJDmjAkWukshyUBrSYniwSOjShbIhWBZT6Hv3gBiidaVtQn56tbvkrE1+GJgNmZV7FClZYk/B0vdmlDjLlEnQBA49qIyJkqJVkTReBfga/QPhfvUn6cDuEc92d6Po2GPNZJYSLUH+3w2fTy6JwScpUQRiPke4F82t2Q2fbwlJ8SASlGknONbGPRX7wQPEtJcJIoVYzaHYV1BUOtOPXbLTmmkRXC4v6GvHjSecBpzELRQBVfZe3BQ+Hc4xDQNrSDxmznsfewO+B563Q64v+Y5GyrpuoHiQVGPfQAgTYjM5L9bvDAPyNb3OvIuNdSMKgYi3yVrpfkchASNa8eZX1AVdV1tk69u/ajalQW8NI7JHiWehlTOz7GprV8X4gQVGMLUlORhLru//AWSfqX7", "rocketNodeStaking": "eJzdV8FOAjEQ/RXT855MNIabB01M0BglejCEDN1Zaey2m3YKEuO/OwXcdbMsIkJEbix9ffPem+5k+/QmlCkCedF5ij8JnQHdmxYoOkJaQw4kHd1Z+YJ0T9bBM15FUAYSRSIM5BE4cF8B52nq0HtepjkPLP547yfCExBeB4Kh0oqmvGqsKWAKQ43VDq7syQXJhOI9eRPAoGluA8vMQHtM6qpTfMVUdHjHbKVmAko1C7HGprhEW/KFqKxRYwr8fHxyWjEBKzJUcX0CNuFCGj2ADrgdNlL5MqZ+Cbi77d5r8CPmLGE4Rnaz7bgzZ/P9i3utgAhedp8P2f+ZzqOiUepgYpYFVMZRbRmj88pGtA3UNnFiqbNKR13DWcsAGSucVMgsGEmxUIuOZ6SeJdCfDf5eUC2a5bFsJqpRrXE4BnFYrZynlasbhh60qbQ3P5Z/5ax5hi6yDBk43svcG9VslnlsnRCr92qVqw23ukLfOiVXDxQJWgbNvvc/11+f58N2d62MykN+mN7g9XC9cd8Ka3V38abvjbNGtUHrp05lysf+cJ9qRta+fuwo8zWG5U+8XfLlaJf2NhI3WXwW/sfs+Q42uxSdr9GDiNuCx/4HCbNAvw==", + + "rocketNodeDeposit": "eJytk11rwjAUhv/KyHWvHBvi3UAGu3AM3Z1IOU1PJdgkJTnpLOJ/X2pr084qm+yuad7znPd8ZH1gQhWOLJut609CoyD/rApkM8a1IgOcHpaa75BWpA1s8a0WZcCRRUyBrIWx6Qte0tSgtf6aGg60P46biFkCwoUjSEQuqPK3SqsCKkhyDBE+syXjuAeyY3Rg4EWV1M7bzCC3GA1dp7jHlM18xOlmUAR0blqzmdFyxFvUA3U5BiTnz5On50AC70hRYJ0F97BISBwhbTrBHAttBS2Royg9uNNiid5Ek7PtSYgq0VihlVdrR9fmXGebBitDG9MrYysFfgVl5hSnOtHAx2imQdmxFEpIJ991iq841oHoApJUhL15xiXkIgW/Kh8u2WEVGI3wL4SV2CogZ/C3kMdJD5M2I5oDwVJr+sHw0hHKZUcs5Fd36vZmx7gvkBOmC9/UQuv85ktsg1rTgw0ZHfjFI7175lffTXC1RWoX/kS5ub6onHw4lzzvyvmXbd58Aw32wtE=", }, } } From 9dfd04f8b09221f7b165e1ec88443da51ed7dd24 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 16 Nov 2022 16:19:06 -0500 Subject: [PATCH 512/878] Added RocketMinipoolQueue to the version manager --- legacy/v1.1.0/minipool/queue.go | 302 ++++++++++++++++++++++++++++++++ minipool/queue.go | 29 +-- rocketpool/v1.1.0-manager.go | 3 + 3 files changed, 309 insertions(+), 25 deletions(-) create mode 100644 legacy/v1.1.0/minipool/queue.go diff --git a/legacy/v1.1.0/minipool/queue.go b/legacy/v1.1.0/minipool/queue.go new file mode 100644 index 000000000..42a1bc978 --- /dev/null +++ b/legacy/v1.1.0/minipool/queue.go @@ -0,0 +1,302 @@ +package minipool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// Minipool queue lengths +type QueueLengths struct { + Total uint64 + FullDeposit uint64 + HalfDeposit uint64 + EmptyDeposit uint64 +} + +// Minipool queue capacity +type QueueCapacity struct { + Total *big.Int + Effective *big.Int + NextMinipool *big.Int +} + +// Minipools queue status details +type QueueDetails struct { + Position uint64 +} + +// Get minipool queue lengths +func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (QueueLengths, error) { + + // Data + var wg errgroup.Group + var total uint64 + var fullDeposit uint64 + var halfDeposit uint64 + var emptyDeposit uint64 + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalLength(rp, opts, legacyRocketMinipoolQueueAddress) + return err + }) + wg.Go(func() error { + var err error + fullDeposit, err = GetQueueLength(rp, rptypes.Full, opts, legacyRocketMinipoolQueueAddress) + return err + }) + wg.Go(func() error { + var err error + halfDeposit, err = GetQueueLength(rp, rptypes.Half, opts, legacyRocketMinipoolQueueAddress) + return err + }) + wg.Go(func() error { + var err error + emptyDeposit, err = GetQueueLength(rp, rptypes.Empty, opts, legacyRocketMinipoolQueueAddress) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueLengths{}, err + } + + // Return + return QueueLengths{ + Total: total, + FullDeposit: fullDeposit, + HalfDeposit: halfDeposit, + EmptyDeposit: emptyDeposit, + }, nil + +} + +// Get minipool queue capacity +func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (QueueCapacity, error) { + + // Data + var wg errgroup.Group + var total *big.Int + var effective *big.Int + var nextMinipool *big.Int + + // Load data + wg.Go(func() error { + var err error + total, err = GetQueueTotalCapacity(rp, opts, legacyRocketMinipoolQueueAddress) + return err + }) + wg.Go(func() error { + var err error + effective, err = GetQueueEffectiveCapacity(rp, opts, legacyRocketMinipoolQueueAddress) + return err + }) + wg.Go(func() error { + var err error + nextMinipool, err = GetQueueNextCapacity(rp, opts, legacyRocketMinipoolQueueAddress) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return QueueCapacity{}, err + } + + // Return + return QueueCapacity{ + Total: total, + Effective: effective, + NextMinipool: nextMinipool, + }, nil + +} + +// Get the total length of the minipool queue +func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, legacyRocketMinipoolQueueAddress, opts) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { + return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) + } + return (*length).Uint64(), nil +} + +// Get the length of a single minipool queue +func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDeposit, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, legacyRocketMinipoolQueueAddress, opts) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { + return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) + } + return (*length).Uint64(), nil +} + +// Get the total capacity of the minipool queue +func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, legacyRocketMinipoolQueueAddress, opts) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + } + return *capacity, nil +} + +// Get the total effective capacity of the minipool queue (used in node demand calculation) +func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, legacyRocketMinipoolQueueAddress, opts) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) + } + return *capacity, nil +} + +// Get the capacity of the next minipool in the queue +func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (*big.Int, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, legacyRocketMinipoolQueueAddress, opts) + if err != nil { + return nil, err + } + capacity := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { + return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) + } + return *capacity, nil +} + +// Get Queue position details of a minipool +func GetQueueDetails(rp *rocketpool.RocketPool, mp *minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (QueueDetails, error) { + position, err := GetQueuePositionOfMinipool(mp, opts, legacyRocketMinipoolQueueAddress) + if err != nil { + return QueueDetails{}, err + } + + // Return + return QueueDetails{ + Position: position, + }, nil +} + +// Get a minipools position in queue (1-indexed). 0 means it is currently not queued. +func GetQueuePositionOfMinipool(mp *minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { + depositType, err := mp.GetDepositType(opts) + if err != nil { + return 0, fmt.Errorf("Could not get deposit type: %w", err) + } + if depositType == rptypes.None { + return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.Address) + } + + queryIndex := func(key string) (uint64, error) { + index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) + if err != nil { + return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.Address, err) + } + return uint64(index + 1), nil + } + + position := uint64(0) + + // half cleared first + if depositType != rptypes.Half { + position, err = GetQueueLength(mp.RocketPool, rptypes.Half, opts, legacyRocketMinipoolQueueAddress) + if err != nil { + return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + } + } else { + return queryIndex("minipools.available.half") + } + + // full deposits next + if depositType != rptypes.Full { + length, err := GetQueueLength(mp.RocketPool, rptypes.Full, opts, legacyRocketMinipoolQueueAddress) + if err != nil { + return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + } + position += length + } else { + index, err := queryIndex("minipools.available.full") + if err != nil || index == 0 { + return 0, err + } + return position + index, nil + } + + // must be empty type now + index, err := queryIndex("minipools.available.empty") + if err != nil || index == 0 { + return 0, err + } + return position + index, nil +} + +// Get the minipool at the specified position in queue (0-indexed). +func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (*minipool.Minipool, error) { + totalLength, err := GetQueueTotalLength(rp, opts, legacyRocketMinipoolQueueAddress) + if err != nil { + return nil, fmt.Errorf("Could not get total queue length: %w", err) + } + if position >= totalLength { + return nil, fmt.Errorf("Could not get index %d beyond queue length %d", position, totalLength) + } + lengths, err := GetQueueLengths(rp, opts, legacyRocketMinipoolQueueAddress) + if err != nil { + return nil, fmt.Errorf("Could not get queue lengths: %w", err) + } + + getMinipool := func(key string) (*minipool.Minipool, error) { + pos := big.NewInt(int64(position)) + address, err := storage.GetAddressQueueItem(rp, opts, crypto.Keccak256Hash([]byte(key)), pos) + if err != nil { + return nil, fmt.Errorf("Could not get address in queue at position %d: %w", position, err) + } + return minipool.NewMinipool(rp, address, opts) + } + + if position < lengths.HalfDeposit { + return getMinipool("minipools.available.half") + } + position -= lengths.HalfDeposit + if position < lengths.FullDeposit { + return getMinipool("minipools.available.full") + } + position -= lengths.FullDeposit + return getMinipool("minipools.available.empty") +} + +// Get contracts +var rocketMinipoolQueueLock sync.Mutex + +func getRocketMinipoolQueue(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolQueueLock.Lock() + defer rocketMinipoolQueueLock.Unlock() + if address == nil { + return rp.VersionManager.V1_1_0.GetContract("rocketMinipoolQueue", opts) + } else { + return rp.VersionManager.V1_1_0.GetContractWithAddress("rocketMinipoolQueue", *address) + } +} diff --git a/minipool/queue.go b/minipool/queue.go index e2f7e045c..5dedea207 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -24,9 +24,8 @@ type QueueLengths struct { // Minipool queue capacity type QueueCapacity struct { - Total *big.Int - Effective *big.Int - NextMinipool *big.Int + Total *big.Int + Effective *big.Int } // Minipools queue status details @@ -88,7 +87,6 @@ func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapa var wg errgroup.Group var total *big.Int var effective *big.Int - var nextMinipool *big.Int // Load data wg.Go(func() error { @@ -101,11 +99,6 @@ func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapa effective, err = GetQueueEffectiveCapacity(rp, opts) return err }) - wg.Go(func() error { - var err error - nextMinipool, err = GetQueueNextCapacity(rp, opts) - return err - }) // Wait for data if err := wg.Wait(); err != nil { @@ -114,9 +107,8 @@ func GetQueueCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueCapa // Return return QueueCapacity{ - Total: total, - Effective: effective, - NextMinipool: nextMinipool, + Total: total, + Effective: effective, }, nil } @@ -173,19 +165,6 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( return *capacity, nil } -// Get the capacity of the next minipool in the queue -func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) - if err != nil { - return nil, err - } - capacity := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) - } - return *capacity, nil -} - // Get Queue position details of a minipool func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (QueueDetails, error) { position, err := GetQueuePositionOfMinipool(mp, opts) diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go index 5f24fcee4..bf1233901 100644 --- a/rocketpool/v1.1.0-manager.go +++ b/rocketpool/v1.1.0-manager.go @@ -24,6 +24,7 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 "rocketNetworkPrices": "rocketNetworkPrices.v1", "rocketNodeStaking": "rocketNodeStaking.v2", "rocketNodeDeposit": "rocketNodeDeposit.v2", + "rocketMinipoolQueue": "rocketMinipoolQueue.v1", }, abiMap: map[string]string{ "rocketNetworkPrices": "eJztVslu2zAQ/ZVCZx+0kKKYW1v0UMAFDKc9BUEwJIeBEJkSSMqNEeTfSyuKFSVektYpjKIHAzI5y3sz5ONc3EWlaVrvorOL9adHa6D6vmowOotkbbwF6T/Ma3mD/tzXFq7x69pIg8RoEhlYrA2v7FODj0pZdC5s+4c40C/cX04i58Hjt9aDKKvSr8KuqU0DKxAVDh4hs/O2lSFgWHTltQHf2uc795O7CIL7alG3gYCGyuFkzEfhLaroLHh0OyN6sMHZ09C2XmxBPXkSaJNjFKkN/1OaD5FEFQoyhHrc/51QtqlmtpR4nGioNUpfLnHeVOcebo4U1peLbZEuNwYdBXfeikXpfQi8scUlGv+sx/FtDimNmS6IykETolLgMqMUmE4wkyTniUhIHtNEIqdxIkjKVUEIE8BplsjsDUfjf0f/pKM/GgWv6SfqVOsiyVBLHn4sZzzN8lwSkJDmjAkWukshyUBrSYniwSOjShbIhWBZT6Hv3gBiidaVtQn56tbvkrE1+GJgNmZV7FClZYk/B0vdmlDjLlEnQBA49qIyJkqJVkTReBfga/QPhfvUn6cDuEc92d6Po2GPNZJYSLUH+3w2fTy6JwScpUQRiPke4F82t2Q2fbwlJ8SASlGknONbGPRX7wQPEtJcJIoVYzaHYV1BUOtOPXbLTmmkRXC4v6GvHjSecBpzELRQBVfZe3BQ+Hc4xDQNrSDxmznsfewO+B563Q64v+Y5GyrpuoHiQVGPfQAgTYjM5L9bvDAPyNb3OvIuNdSMKgYi3yVrpfkchASNa8eZX1AVdV1tk69u/ajalQW8NI7JHiWehlTOz7GprV8X4gQVGMLUlORhLru//AWSfqX7", @@ -31,6 +32,8 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 "rocketNodeStaking": "eJzdV8FOAjEQ/RXT855MNIabB01M0BglejCEDN1Zaey2m3YKEuO/OwXcdbMsIkJEbix9ffPem+5k+/QmlCkCedF5ij8JnQHdmxYoOkJaQw4kHd1Z+YJ0T9bBM15FUAYSRSIM5BE4cF8B52nq0HtepjkPLP547yfCExBeB4Kh0oqmvGqsKWAKQ43VDq7syQXJhOI9eRPAoGluA8vMQHtM6qpTfMVUdHjHbKVmAko1C7HGprhEW/KFqKxRYwr8fHxyWjEBKzJUcX0CNuFCGj2ADrgdNlL5MqZ+Cbi77d5r8CPmLGE4Rnaz7bgzZ/P9i3utgAhedp8P2f+ZzqOiUepgYpYFVMZRbRmj88pGtA3UNnFiqbNKR13DWcsAGSucVMgsGEmxUIuOZ6SeJdCfDf5eUC2a5bFsJqpRrXE4BnFYrZynlasbhh60qbQ3P5Z/5ax5hi6yDBk43svcG9VslnlsnRCr92qVqw23ukLfOiVXDxQJWgbNvvc/11+f58N2d62MykN+mN7g9XC9cd8Ka3V38abvjbNGtUHrp05lysf+cJ9qRta+fuwo8zWG5U+8XfLlaJf2NhI3WXwW/sfs+Q42uxSdr9GDiNuCx/4HCbNAvw==", "rocketNodeDeposit": "eJytk11rwjAUhv/KyHWvHBvi3UAGu3AM3Z1IOU1PJdgkJTnpLOJ/X2pr084qm+yuad7znPd8ZH1gQhWOLJut609CoyD/rApkM8a1IgOcHpaa75BWpA1s8a0WZcCRRUyBrIWx6Qte0tSgtf6aGg60P46biFkCwoUjSEQuqPK3SqsCKkhyDBE+syXjuAeyY3Rg4EWV1M7bzCC3GA1dp7jHlM18xOlmUAR0blqzmdFyxFvUA3U5BiTnz5On50AC70hRYJ0F97BISBwhbTrBHAttBS2Royg9uNNiid5Ek7PtSYgq0VihlVdrR9fmXGebBitDG9MrYysFfgVl5hSnOtHAx2imQdmxFEpIJ991iq841oHoApJUhL15xiXkIgW/Kh8u2WEVGI3wL4SV2CogZ/C3kMdJD5M2I5oDwVJr+sHw0hHKZUcs5Fd36vZmx7gvkBOmC9/UQuv85ktsg1rTgw0ZHfjFI7175lffTXC1RWoX/kS5ub6onHw4lzzvyvmXbd58Aw32wtE=", + + "rocketMinipoolQueue": "eJztV0tv2zAM/iuDzzlIsiTLve3RQ4F1h663oigoicyMJXZmy1mDov99yqN1nGcPbZdDb45Ikd/3USKVm4ekKCdtaJKzm/lnwLqE0fVsgslZ4qoy1ODCp6vK/cbwM1Q1DPFi7kTgMBkkJYznjnf1usNn72tsmmgOyziwWni8HSRNgICXbQBbjIowi9ayKicwAzvCbkfM3IS6dTFgXGyKYQmhrTctj4OHBOL22bhqIwGCUYODPh+P9+iTs7hjYenRg2ecKxrjoiwmVTXagXxwLJidBWxS0QX702KLF76L9eTRi/WMuResjb+F0l2wUIzX1Hkyz/VcOVyuoH/DRd61tDjFMmyIyO5d5nOPDNB545URuc+1J2+FcEJbqYXyEL8Vy41TKkNjWSpBGcYVcZPDh/bb2p+XL9PeWsaMQnJpxo3NgIRgkjwnTh4MUu5TsgCSkSGXkbRMAubM61ygJPeh/Q7tr3BcTV8gvfZakjAkuXUamdaWyEqpSFvHyIs0t4Kj45Rl3KFUnMALneo0syitXJFYCd3BmGLdFFUZ81Vt2NdO5/BNx63Py+zpjtMC/3ae1JYuLBMtGiFEjqu69ImqeKCkV2wf4CGG6yrA6DuWw/DrOO5eVXZX5NWwi9TmiG4D+xYsLNvxp67vTaqmCGsjyS9XFs47lO50OEUJcsyy2AzoWPm+wgTcPNNJoZdSOG4oPYD+nAhjsCmeJgPUzEpmD+n/A+/DaYJXXHORMnUEfHdlDmA/fMm2Ltbgv5PXYISMo/Ptmsc2x62BendgonZ1wOV74bLz7Qrx4pfymjAbo06gIszte3RRjz0mX2YvOlt73yGv8AdirywmdlbDxN6bvUHlBBl4w5E5Z96jsPXiWfVGJ9Qjt96ZWIrbf2ct65Y=", }, } } From 60ed0a2279678fb081b798ef23a4c64934b17faf Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 17 Nov 2022 00:10:37 -0500 Subject: [PATCH 513/878] Updated address generation, MinipoolQueue, and MinipoolDepositType --- legacy/v1.1.0/utils/address_generation.go | 71 +++++++++ minipool/queue.go | 167 +++------------------- types/minipool.go | 3 +- utils/address_generation.go | 7 +- 4 files changed, 93 insertions(+), 155 deletions(-) create mode 100644 legacy/v1.1.0/utils/address_generation.go diff --git a/legacy/v1.1.0/utils/address_generation.go b/legacy/v1.1.0/utils/address_generation.go new file mode 100644 index 000000000..2d534a8bb --- /dev/null +++ b/legacy/v1.1.0/utils/address_generation.go @@ -0,0 +1,71 @@ +package utils + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// Combine a node's address and a salt to retreive a new salt compatible with depositing +func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { + // Create a new salt by hashing the original and the node address + saltBytes := [32]byte{} + salt.FillBytes(saltBytes[:]) + saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) + return saltHash +} + +// Precompute the address of a minipool based on the node wallet, deposit type, and unique salt +// If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { + + // Get dependencies + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) + if err != nil { + return common.Address{}, err + } + minipoolAbi, err := rp.GetABI("rocketMinipool", opts) + if err != nil { + return common.Address{}, err + } + + if len(minipoolBytecode) == 0 { + minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + if err != nil { + return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) + } + } + + // Create the hash of the minipool constructor call + depositTypeBytes := [32]byte{} + depositTypeBytes[0] = byte(depositType) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) + if err != nil { + return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) + } + + // Get the node salt and initialization data + nodeSalt := GetNodeSalt(nodeAddress, salt) + initData := append(minipoolBytecode, packedConstructorArgs...) + initHash := crypto.Keccak256(initData) + + address := crypto.CreateAddress2(*rocketMinipoolFactory.Address, nodeSalt, initHash) + return address, nil + +} + +// Get contracts +var rocketMinipoolFactoryLock sync.Mutex + +func getRocketMinipoolFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolFactoryLock.Lock() + defer rocketMinipoolFactoryLock.Unlock() + return rp.GetContract("rocketMinipoolFactory", opts) +} diff --git a/minipool/queue.go b/minipool/queue.go index 5dedea207..69bc4131f 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -6,22 +6,12 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - rptypes "github.com/rocket-pool/rocketpool-go/types" ) -// Minipool queue lengths -type QueueLengths struct { - Total uint64 - FullDeposit uint64 - HalfDeposit uint64 - EmptyDeposit uint64 -} - // Minipool queue capacity type QueueCapacity struct { Total *big.Int @@ -30,54 +20,7 @@ type QueueCapacity struct { // Minipools queue status details type QueueDetails struct { - Position uint64 -} - -// Get minipool queue lengths -func GetQueueLengths(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueLengths, error) { - - // Data - var wg errgroup.Group - var total uint64 - var fullDeposit uint64 - var halfDeposit uint64 - var emptyDeposit uint64 - - // Load data - wg.Go(func() error { - var err error - total, err = GetQueueTotalLength(rp, opts) - return err - }) - wg.Go(func() error { - var err error - fullDeposit, err = GetQueueLength(rp, rptypes.Full, opts) - return err - }) - wg.Go(func() error { - var err error - halfDeposit, err = GetQueueLength(rp, rptypes.Half, opts) - return err - }) - wg.Go(func() error { - var err error - emptyDeposit, err = GetQueueLength(rp, rptypes.Empty, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return QueueLengths{}, err - } - - // Return - return QueueLengths{ - Total: total, - FullDeposit: fullDeposit, - HalfDeposit: halfDeposit, - EmptyDeposit: emptyDeposit, - }, nil - + Position int64 } // Get minipool queue capacity @@ -121,20 +64,7 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } length := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { - return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) - } - return (*length).Uint64(), nil -} - -// Get the length of a single minipool queue -func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDeposit, opts *bind.CallOpts) (uint64, error) { - rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) - if err != nil { - return 0, err - } - length := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { - return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) + return 0, fmt.Errorf("Could not get total minipool queue length: %w", err) } return (*length).Uint64(), nil } @@ -167,7 +97,7 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( // Get Queue position details of a minipool func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (QueueDetails, error) { - position, err := GetQueuePositionOfMinipool(mp, opts) + position, err := GetQueuePositionOfMinipool(rp, mp, opts) if err != nil { return QueueDetails{}, err } @@ -179,90 +109,29 @@ func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpt } // Get a minipools position in queue (1-indexed). 0 means it is currently not queued. -func GetQueuePositionOfMinipool(mp *Minipool, opts *bind.CallOpts) (uint64, error) { - depositType, err := mp.GetDepositType(opts) +func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (int64, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { - return 0, fmt.Errorf("Could not get deposit type: %w", err) - } - if depositType == rptypes.None { - return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.Address) - } - - queryIndex := func(key string) (uint64, error) { - index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) - if err != nil { - return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.Address, err) - } - return uint64(index + 1), nil - } - - position := uint64(0) - - // half cleared first - if depositType != rptypes.Half { - position, err = GetQueueLength(mp.RocketPool, rptypes.Half, opts) - if err != nil { - return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) - } - } else { - return queryIndex("minipools.available.half") - } - - // full deposits next - if depositType != rptypes.Full { - length, err := GetQueueLength(mp.RocketPool, rptypes.Full, opts) - if err != nil { - return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) - } - position += length - } else { - index, err := queryIndex("minipools.available.full") - if err != nil || index == 0 { - return 0, err - } - return position + index, nil - } - - // must be empty type now - index, err := queryIndex("minipools.available.empty") - if err != nil || index == 0 { return 0, err } - return position + index, nil + position := new(*big.Int) + if err := rocketMinipoolQueue.Call(opts, position, "getMinipoolPosition", mp.Address); err != nil { + return 0, fmt.Errorf("Could not get queue position for minipool %s: %w", mp.Address.Hex(), err) + } + return (*position).Int64(), nil } // Get the minipool at the specified position in queue (0-indexed). -func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts) (*Minipool, error) { - totalLength, err := GetQueueTotalLength(rp, opts) - if err != nil { - return nil, fmt.Errorf("Could not get total queue length: %w", err) - } - if position >= totalLength { - return nil, fmt.Errorf("Could not get index %d beyond queue length %d", position, totalLength) - } - lengths, err := GetQueueLengths(rp, opts) +func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts) (common.Address, error) { + rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { - return nil, fmt.Errorf("Could not get queue lengths: %w", err) - } - - getMinipool := func(key string) (*Minipool, error) { - pos := big.NewInt(int64(position)) - address, err := storage.GetAddressQueueItem(rp, opts, crypto.Keccak256Hash([]byte(key)), pos) - if err != nil { - return nil, fmt.Errorf("Could not get address in queue at position %d: %w", position, err) - } - return NewMinipool(rp, address, opts) - } - - if position < lengths.HalfDeposit { - return getMinipool("minipools.available.half") + return common.Address{}, err } - position -= lengths.HalfDeposit - if position < lengths.FullDeposit { - return getMinipool("minipools.available.full") + address := new(common.Address) + if err := rocketMinipoolQueue.Call(opts, address, "getMinipoolAt", big.NewInt(int64(position))); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool at queue position %d: %w", position, err) } - position -= lengths.FullDeposit - return getMinipool("minipools.available.empty") + return *address, nil } // Get contracts diff --git a/types/minipool.go b/types/minipool.go index a6a83bbbd..03a7bd17b 100644 --- a/types/minipool.go +++ b/types/minipool.go @@ -63,9 +63,10 @@ const ( Full Half Empty + Variable ) -var MinipoolDepositTypes = []string{"None", "Full", "Half", "Empty"} +var MinipoolDepositTypes = []string{"None", "Full", "Half", "Empty", "Variable"} // String conversion func (d MinipoolDeposit) String() string { diff --git a/utils/address_generation.go b/utils/address_generation.go index 2d534a8bb..039518b99 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" ) // Combine a node's address and a salt to retreive a new salt compatible with depositing @@ -24,7 +23,7 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { // Get dependencies rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) @@ -44,9 +43,7 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo } // Create the hash of the minipool constructor call - depositTypeBytes := [32]byte{} - depositTypeBytes[0] = byte(depositType) - packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress, depositType) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress) if err != nil { return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) } From 27bcd872ca9d4f7b62fbc64c1fb307ce5c7f9be3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 17 Nov 2022 02:43:00 -0500 Subject: [PATCH 514/878] Made GetQueuePositionOfMinipool 1-indexed again --- minipool/queue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minipool/queue.go b/minipool/queue.go index 69bc4131f..5df6ea174 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -118,7 +118,7 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp *Minipool, opts *b if err := rocketMinipoolQueue.Call(opts, position, "getMinipoolPosition", mp.Address); err != nil { return 0, fmt.Errorf("Could not get queue position for minipool %s: %w", mp.Address.Hex(), err) } - return (*position).Int64(), nil + return (*position).Int64() + 1, nil } // Get the minipool at the specified position in queue (0-indexed). From 3fb16102b5dfbb71c0a3d827f799266e19c3e5b3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 17 Nov 2022 02:50:17 -0500 Subject: [PATCH 515/878] Removed InConsensus --- network/prices.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/network/prices.go b/network/prices.go index bddc78997..e718b1dc2 100644 --- a/network/prices.go +++ b/network/prices.go @@ -59,19 +59,6 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, op return tx.Hash(), nil } -// Check if the network is currently in consensus about the RPL price, or if it is still reaching consensus -func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) - if err != nil { - return false, err - } - isInConsensus := new(bool) - if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { - return false, fmt.Errorf("Could not get consensus status: %w", err) - } - return *isInConsensus, nil -} - // Returns the latest block number that oracles should be reporting prices for func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) From 8c4c0b727f0df49d2290607c9bea2d715cfa8933 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 17 Nov 2022 19:40:24 -0500 Subject: [PATCH 516/878] Updated minipool ABI constructor args --- utils/address_generation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/address_generation.go b/utils/address_generation.go index 039518b99..7b1315a0c 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -43,7 +43,7 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, salt } // Create the hash of the minipool constructor call - packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address, nodeAddress) + packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address) if err != nil { return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) } From 83a3ee51b1a4b85973a695d082e5f2f01d1c3b9f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 21 Nov 2022 00:51:43 -0500 Subject: [PATCH 517/878] Added the new bond reducer contract --- minipool/bond-reducer.go | 41 +++++++++++++++++++++++++++++++++++ minipool/minipool-contract.go | 14 ------------ 2 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 minipool/bond-reducer.go diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go new file mode 100644 index 000000000..6dcca9b80 --- /dev/null +++ b/minipool/bond-reducer.go @@ -0,0 +1,41 @@ +package minipool + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Estimate the gas required to vote to cancel a minipool's bond reduction +func EstimateVoteCancelReductionGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketMinipoolBondReducer.GetTransactionGasInfo(opts, "voteCancelReduction", minipoolAddress) +} + +// Vote to cancel a minipool's bond reduction +func (mp *Minipool) VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketMinipoolBondReducer.Transact(opts, "voteCancelReduction", minipoolAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketMinipoolBondReducerLock sync.Mutex + +func getRocketMinipoolBondReducer(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolBondReducerLock.Lock() + defer rocketMinipoolBondReducerLock.Unlock() + return rp.GetContract("rocketMinipoolBondReducer", opts) +} diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index da72d9f5b..64a05d2d3 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -543,20 +543,6 @@ func (mp *Minipool) GetReduceBondTime(opts *bind.CallOpts) (*big.Int, error) { return *reduceBondTime, nil } -// Estimate the gas required to vote to cancel a minipool's bond reduction -func (mp *Minipool) EstimateVoteCancelReductionGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "voteCancelReduction") -} - -// Vote to cancel a minipool's bond reduction -func (mp *Minipool) VoteCancelReduction(opts *bind.TransactOpts) (common.Hash, error) { - tx, err := mp.Contract.Transact(opts, "voteCancelReduction") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", mp.Address.Hex(), err) - } - return tx.Hash(), nil -} - // Estimate the gas required to promote a vacant minipool func (mp *Minipool) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "promote") From bb74eee13fd8e756d03009849513bc2b0fa8e4ca Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 21 Nov 2022 00:57:08 -0500 Subject: [PATCH 518/878] Fixed a function signature --- minipool/bond-reducer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 6dcca9b80..b429a3b82 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -19,14 +19,14 @@ func EstimateVoteCancelReductionGas(rp *rocketpool.RocketPool, minipoolAddress c } // Vote to cancel a minipool's bond reduction -func (mp *Minipool) VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) if err != nil { return common.Hash{}, err } tx, err := rocketMinipoolBondReducer.Transact(opts, "voteCancelReduction", minipoolAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) } return tx.Hash(), nil } From cd46c25f0dc883d73b5610630cda8b153aba52e9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 23 Nov 2022 01:09:15 -0500 Subject: [PATCH 519/878] Added CreateVacantMinipool --- node/deposit.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/node/deposit.go b/node/deposit.go index f6b2c6ed5..ad7abbd59 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -36,6 +36,28 @@ func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee floa return tx, nil } +// Estimate the gas of CreateVacantMinipool +func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) +} + +// Make a vacant minipool for solo staker migration +func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) + if err != nil { + return nil, fmt.Errorf("Could not create vacant minipool: %w", err) + } + return tx, nil +} + // Get the amount of ETH in the node's deposit credit bank func GetNodeDepositCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) From 809ce68b3036376dcc5b1c3c5773d9ee885bea9e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 24 Nov 2022 00:37:49 -0500 Subject: [PATCH 520/878] Added GetVacant --- minipool/minipool-contract.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 64a05d2d3..0072c0a2a 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -257,6 +257,13 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { } return *nodeDepositAssigned, nil } +func (mp *Minipool) GetVacant(opts *bind.CallOpts) (bool, error) { + isVacant := new(bool) + if err := mp.Contract.Call(opts, isVacant, "getVacant"); err != nil { + return false, fmt.Errorf("Could not get minipool %s vacant status: %w", mp.Address.Hex(), err) + } + return *isVacant, nil +} // Get user deposit details func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { From aee7c0291d7d429ff066131abecedd0e6e602c19 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 24 Nov 2022 00:52:02 -0500 Subject: [PATCH 521/878] Added GetVacant to minipool status --- minipool/minipool-contract.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 0072c0a2a..fe4ee8514 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -27,6 +27,7 @@ type StatusDetails struct { Status rptypes.MinipoolStatus `json:"status"` StatusBlock uint64 `json:"statusBlock"` StatusTime time.Time `json:"statusTime"` + IsVacant bool `json:"isVacant"` } type NodeDetails struct { Address common.Address `json:"address"` @@ -93,6 +94,7 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) var status rptypes.MinipoolStatus var statusBlock uint64 var statusTime time.Time + var isVacant bool // Load data wg.Go(func() error { @@ -110,6 +112,11 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) statusTime, err = mp.GetStatusTime(opts) return err }) + wg.Go(func() error { + var err error + isVacant, err = mp.GetVacant(opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { @@ -121,6 +128,7 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) Status: status, StatusBlock: statusBlock, StatusTime: statusTime, + IsVacant: isVacant, }, nil } From 5fb924463ce11fdb02e47cee884a0d63e322a302 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 7 Dec 2022 23:34:40 -0500 Subject: [PATCH 522/878] Moved GetReduceBondTime to the BondReducer contract --- minipool/bond-reducer.go | 14 ++++++++++++++ minipool/minipool-contract.go | 9 --------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index b429a3b82..cdc14e7d4 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -2,6 +2,7 @@ package minipool import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -31,6 +32,19 @@ func VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Addre return tx.Hash(), nil } +// Gets the time at which the MP owner started the bond reduction process +func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return nil, err + } + reduceBondTime := new(*big.Int) + if err := rocketMinipoolBondReducer.Call(opts, reduceBondTime, "getReduceBondTime", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get reduce bond start time for minipool %s: %w", minipoolAddress.Hex(), err) + } + return *reduceBondTime, nil +} + // Get contracts var rocketMinipoolBondReducerLock sync.Mutex diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index fe4ee8514..56f90bb1f 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -549,15 +549,6 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } -// Gets the time at which the MP owner started the bond reduction process -func (mp *Minipool) GetReduceBondTime(opts *bind.CallOpts) (*big.Int, error) { - reduceBondTime := new(*big.Int) - if err := mp.Contract.Call(opts, reduceBondTime, "getReduceBondTime"); err != nil { - return nil, fmt.Errorf("Could not get reduce bond start time for minipool %s: %w", mp.Address.Hex(), err) - } - return *reduceBondTime, nil -} - // Estimate the gas required to promote a vacant minipool func (mp *Minipool) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "promote") From 1c258831c2e62aac4a7a4b70e37912ae0d664722 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 8 Dec 2022 01:16:48 -0500 Subject: [PATCH 523/878] Added bond reduction functionality --- minipool/bond-reducer.go | 44 ++++++++++++++++++++++++++ settings/trustednode/minipool.go | 54 +++++++++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index cdc14e7d4..5d58df524 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -45,6 +45,50 @@ func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address return *reduceBondTime, nil } +// Estimate the gas required to begin a minipool bond reduction +func EstimateBeginReduceBondAmountGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, newBondAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketMinipoolBondReducer.GetTransactionGasInfo(opts, "beginReduceBondAmount", minipoolAddress, newBondAmount) +} + +// Begin a minipool bond reduction +func BeginReduceBondAmount(rp *rocketpool.RocketPool, minipoolAddress common.Address, newBondAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketMinipoolBondReducer.Transact(opts, "beginReduceBondAmount", minipoolAddress, newBondAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not begin bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas required to reduce a minipool's bond +func EstimateReduceBondAmountGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketMinipoolBondReducer.GetTransactionGasInfo(opts, "reduceBondAmount", minipoolAddress) +} + +// Reduce a minipool's bond +func ReduceBondAmount(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketMinipoolBondReducer.Transact(opts, "reduceBondAmount", minipoolAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", minipoolAddress.Hex(), err) + } + return tx.Hash(), nil +} + // Get contracts var rocketMinipoolBondReducerLock sync.Mutex diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 4bb98264d..26653079c 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -14,12 +14,14 @@ import ( // Config const ( - MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" - ScrubPeriodPath = "minipool.scrub.period" - ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" + MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" + ScrubPeriodPath = "minipool.scrub.period" + ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" + BondReductionWindowStartPath = "minipool.bond.reduction.window.start" + BondReductionWindowLengthPath = "minipool.bond.reduction.window.length" ) -// The cooldown period a member must wait after making a proposal before making another in seconds +// The amount of time, in seconds, the scrub check lasts before a minipool can move from prelaunch to staking func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { @@ -63,6 +65,50 @@ func EstimateProposeScrubPenaltyEnabledGas(rp *rocketpool.RocketPool, value bool return trustednodedao.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) } +// The amount of time, in seconds, a minipool must wait after beginning a bond reduction before it can apply the bond reduction (how long the Oracle DAO has to cancel the reduction if required) +func GetBondReductionWindowStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getBondReductionWindowStart"); err != nil { + return 0, fmt.Errorf("Could not get bond reduction window start: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapBondReductionWindowStart(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, BondReductionWindowStartPath, big.NewInt(int64(value)), opts) +} +func ProposeBondReductionWindowStart(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", BondReductionWindowStartPath), MinipoolSettingsContractName, BondReductionWindowStartPath, big.NewInt(int64(value)), opts) +} +func EstimateProposeBondReductionWindowStartGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", BondReductionWindowStartPath), MinipoolSettingsContractName, BondReductionWindowStartPath, big.NewInt(int64(value)), opts) +} + +// The amount of time, in seconds, a minipool has to reduce its bond once it has passed the check window +func GetBondReductionWindowLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getBondReductionWindowLength"); err != nil { + return 0, fmt.Errorf("Could not get bond reduction window length: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapBondReductionWindowLength(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) +} +func ProposeBondReductionWindowLength(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", BondReductionWindowLengthPath), MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) +} +func EstimateProposeBondReductionWindowLengthGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", BondReductionWindowLengthPath), MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) +} + // Get contracts var minipoolSettingsContractLock sync.Mutex From f6bdb84a9cde947857f84a2d25e65f77a0ffe4d0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 8 Dec 2022 23:41:40 -0500 Subject: [PATCH 524/878] Added GetReduceBondCancelled --- minipool/bond-reducer.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 5d58df524..5ef152c7a 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -32,6 +32,19 @@ func VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Addre return tx.Hash(), nil } +// Gets whether or not the bond reduction process for this minipool has already been cancelled +func GetReduceBondCancelled(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return false, err + } + isCancelled := new(bool) + if err := rocketMinipoolBondReducer.Call(opts, isCancelled, "getBondReduceCancelled", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get bond reduce cancelled status for minipool %s: %w", minipoolAddress.Hex(), err) + } + return *isCancelled, nil +} + // Gets the time at which the MP owner started the bond reduction process func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) From c01f89f0cb3d8feb6c6cf6038fc58196538fd13d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 9 Dec 2022 00:36:36 -0500 Subject: [PATCH 525/878] GetReduceBondTime now returns a Time instead of a raw value --- minipool/bond-reducer.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 5ef152c7a..399ba2ae5 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -46,16 +47,16 @@ func GetReduceBondCancelled(rp *rocketpool.RocketPool, minipoolAddress common.Ad } // Gets the time at which the MP owner started the bond reduction process -func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { +func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (time.Time, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) if err != nil { - return nil, err + return time.Time{}, err } reduceBondTime := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, reduceBondTime, "getReduceBondTime", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get reduce bond start time for minipool %s: %w", minipoolAddress.Hex(), err) + return time.Time{}, fmt.Errorf("Could not get reduce bond time for minipool %s: %w", minipoolAddress.Hex(), err) } - return *reduceBondTime, nil + return time.Unix((*reduceBondTime).Int64(), 0), nil } // Estimate the gas required to begin a minipool bond reduction From 5039c7b98faa8a7e98290fae05a05f61a8d75bc9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 11 Dec 2022 22:52:55 -0500 Subject: [PATCH 526/878] Renamed getBondReduceCancelled to getReduceBondCancelled --- minipool/bond-reducer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 399ba2ae5..8fdf6d2ca 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -40,8 +40,8 @@ func GetReduceBondCancelled(rp *rocketpool.RocketPool, minipoolAddress common.Ad return false, err } isCancelled := new(bool) - if err := rocketMinipoolBondReducer.Call(opts, isCancelled, "getBondReduceCancelled", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get bond reduce cancelled status for minipool %s: %w", minipoolAddress.Hex(), err) + if err := rocketMinipoolBondReducer.Call(opts, isCancelled, "getReduceBondCancelled", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get reduce bond cancelled status for minipool %s: %w", minipoolAddress.Hex(), err) } return *isCancelled, nil } From 7f05e4fc6c4ad187a9f87be369b07843f76d95e1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Dec 2022 00:38:23 -0500 Subject: [PATCH 527/878] Removed DistributeBalanceAndFinalise --- minipool/minipool-contract.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 56f90bb1f..8df287c5c 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -365,24 +365,6 @@ func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, err return tx.Hash(), nil } -// Estimate the gas of DistributeBalanceAndFinalise -func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") -} - -// Distribute the minipool's ETH balance to the node operator and rETH staking pool, -// then finalises the minipool -// !!! WARNING !!! -// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain -// and the balance has been deposited into the minipool! -func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { - tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") - if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) - } - return tx.Hash(), nil -} - // Estimate the gas of Stake func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) From 8a3c686f1717c1702e10ac7645c35d713f3597a7 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Dec 2022 01:22:01 -0500 Subject: [PATCH 528/878] Added GetVersion() to the minipool binding --- minipool/minipool-contract.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index 8df287c5c..b28b4b4f5 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -499,6 +499,15 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e return *address, nil } +// Get the version of the minipool contract +func (mp *Minipool) GetVersion(opts *bind.CallOpts) (uint8, error) { + version := new(uint8) + if err := mp.Contract.Call(opts, version, "version"); err != nil { + return 0, fmt.Errorf("Could not get minipool version: %w", err) + } + return *version, nil +} + // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) From 1afaeb0fa180c167bd3272c43968d4f0385b0111 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Dec 2022 01:55:34 -0500 Subject: [PATCH 529/878] Moved reduce bond into the minipool contract --- minipool/bond-reducer.go | 22 ---------------------- minipool/minipool-contract.go | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 8fdf6d2ca..3b46960c3 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -81,28 +81,6 @@ func BeginReduceBondAmount(rp *rocketpool.RocketPool, minipoolAddress common.Add return tx.Hash(), nil } -// Estimate the gas required to reduce a minipool's bond -func EstimateReduceBondAmountGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketMinipoolBondReducer.GetTransactionGasInfo(opts, "reduceBondAmount", minipoolAddress) -} - -// Reduce a minipool's bond -func ReduceBondAmount(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketMinipoolBondReducer.Transact(opts, "reduceBondAmount", minipoolAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", minipoolAddress.Hex(), err) - } - return tx.Hash(), nil -} - // Get contracts var rocketMinipoolBondReducerLock sync.Mutex diff --git a/minipool/minipool-contract.go b/minipool/minipool-contract.go index b28b4b4f5..81d73ea48 100644 --- a/minipool/minipool-contract.go +++ b/minipool/minipool-contract.go @@ -508,6 +508,20 @@ func (mp *Minipool) GetVersion(opts *bind.CallOpts) (uint8, error) { return *version, nil } +// Estimate the gas required to reduce a minipool's bond +func (mp *Minipool) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "reduceBondAmount") +} + +// Reduce a minipool's bond +func (mp *Minipool) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "reduceBondAmount") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) From cfcb4b2b8ea1479a757543c456cc11337950c377 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 01:20:15 -0500 Subject: [PATCH 530/878] Created a binding for the new versioning system --- minipool/queue.go | 10 +- minipool/v2/minipool-contract.go | 613 +++++++++++++++++++++++++ minipool/{ => v3}/minipool-contract.go | 2 +- node/node.go | 6 +- node/staking.go | 6 +- rocketpool/version-interface.go | 34 ++ 6 files changed, 655 insertions(+), 16 deletions(-) create mode 100644 minipool/v2/minipool-contract.go rename minipool/{ => v3}/minipool-contract.go (99%) create mode 100644 rocketpool/version-interface.go diff --git a/minipool/queue.go b/minipool/queue.go index 5df6ea174..bc41fb649 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -96,8 +96,8 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } // Get Queue position details of a minipool -func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (QueueDetails, error) { - position, err := GetQueuePositionOfMinipool(rp, mp, opts) +func GetQueueDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (QueueDetails, error) { + position, err := GetQueuePositionOfMinipool(rp, minipoolAddress, opts) if err != nil { return QueueDetails{}, err } @@ -109,14 +109,14 @@ func GetQueueDetails(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpt } // Get a minipools position in queue (1-indexed). 0 means it is currently not queued. -func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp *Minipool, opts *bind.CallOpts) (int64, error) { +func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (int64, error) { rocketMinipoolQueue, err := getRocketMinipoolQueue(rp, opts) if err != nil { return 0, err } position := new(*big.Int) - if err := rocketMinipoolQueue.Call(opts, position, "getMinipoolPosition", mp.Address); err != nil { - return 0, fmt.Errorf("Could not get queue position for minipool %s: %w", mp.Address.Hex(), err) + if err := rocketMinipoolQueue.Call(opts, position, "getMinipoolPosition", minipoolAddress); err != nil { + return 0, fmt.Errorf("Could not get queue position for minipool %s: %w", minipoolAddress.Hex(), err) } return (*position).Int64() + 1, nil } diff --git a/minipool/v2/minipool-contract.go b/minipool/v2/minipool-contract.go new file mode 100644 index 000000000..ebfe28456 --- /dev/null +++ b/minipool/v2/minipool-contract.go @@ -0,0 +1,613 @@ +package minipool_v2 + +import ( + "context" + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "golang.org/x/sync/errgroup" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// The number of blocks to look for events in at once when scanning +const EventScanInterval = 10000 + +// Minipool detail types +type StatusDetails struct { + Status rptypes.MinipoolStatus `json:"status"` + StatusBlock uint64 `json:"statusBlock"` + StatusTime time.Time `json:"statusTime"` +} +type NodeDetails struct { + Address common.Address `json:"address"` + Fee float64 `json:"fee"` + DepositBalance *big.Int `json:"depositBalance"` + RefundBalance *big.Int `json:"refundBalance"` + DepositAssigned bool `json:"depositAssigned"` +} +type UserDetails struct { + DepositBalance *big.Int `json:"depositBalance"` + DepositAssigned bool `json:"depositAssigned"` + DepositAssignedTime time.Time `json:"depositAssignedTime"` +} + +// The data from a minipool's MinipoolPrestaked event +type minipoolPrestakeEvent struct { + Pubkey []byte `abi:"validatorPubkey"` + Signature []byte `abi:"validatorSignature"` + DepositDataRoot [32]byte `abi:"depositDataRoot"` + Amount *big.Int `abi:"amount"` + WithdrawalCredentials []byte `abi:"withdrawalCredentials"` + Time *big.Int `abi:"time"` +} + +// Formatted MinipoolPrestaked event data +type PrestakeData struct { + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount *big.Int `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + DepositDataRoot common.Hash `json:"depositDataRoot"` + Time time.Time `json:"time"` +} + +// Minipool contract +type Minipool struct { + Address common.Address + Contract *rocketpool.Contract + RocketPool *rocketpool.RocketPool +} + +// Create new minipool contract +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*Minipool, error) { + + // Get contract + contract, err := getMinipoolContract(rp, address, opts) + if err != nil { + return nil, err + } + + // Create and return + return &Minipool{ + Address: address, + Contract: contract, + RocketPool: rp, + }, nil +} + +// Get status details +func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { + + // Data + var wg errgroup.Group + var status rptypes.MinipoolStatus + var statusBlock uint64 + var statusTime time.Time + + // Load data + wg.Go(func() error { + var err error + status, err = mp.GetStatus(opts) + return err + }) + wg.Go(func() error { + var err error + statusBlock, err = mp.GetStatusBlock(opts) + return err + }) + wg.Go(func() error { + var err error + statusTime, err = mp.GetStatusTime(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return StatusDetails{}, err + } + + // Return + return StatusDetails{ + Status: status, + StatusBlock: statusBlock, + StatusTime: statusTime, + }, nil + +} +func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { + status := new(uint8) + if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + } + return rptypes.MinipoolStatus(*status), nil +} +func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { + statusBlock := new(*big.Int) + if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) + } + return (*statusBlock).Uint64(), nil +} +func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { + statusTime := new(*big.Int) + if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) + } + return time.Unix((*statusTime).Int64(), 0), nil +} +func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { + finalised := new(bool) + if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { + return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) + } + return *finalised, nil +} + +// Get deposit type +func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { + depositType := new(uint8) + if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + } + return rptypes.MinipoolDeposit(*depositType), nil +} + +// Get node details +func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { + + // Data + var wg errgroup.Group + var address common.Address + var fee float64 + var depositBalance *big.Int + var refundBalance *big.Int + var depositAssigned bool + + // Load data + wg.Go(func() error { + var err error + address, err = mp.GetNodeAddress(opts) + return err + }) + wg.Go(func() error { + var err error + fee, err = mp.GetNodeFee(opts) + return err + }) + wg.Go(func() error { + var err error + depositBalance, err = mp.GetNodeDepositBalance(opts) + return err + }) + wg.Go(func() error { + var err error + refundBalance, err = mp.GetNodeRefundBalance(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetNodeDepositAssigned(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return NodeDetails{}, err + } + + // Return + return NodeDetails{ + Address: address, + Fee: fee, + DepositBalance: depositBalance, + RefundBalance: refundBalance, + DepositAssigned: depositAssigned, + }, nil + +} +func (mp *Minipool) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { + nodeAddress := new(common.Address) + if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) + } + return *nodeAddress, nil +} +func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { + nodeFee := new(*big.Int) + if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { + return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + } + return eth.WeiToEth(*nodeFee), nil +} +func (mp *Minipool) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { + nodeFee := new(*big.Int) + if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + } + return *nodeFee, nil +} +func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { + nodeDepositBalance := new(*big.Int) + if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) + } + return *nodeDepositBalance, nil +} +func (mp *Minipool) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { + nodeRefundBalance := new(*big.Int) + if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) + } + return *nodeRefundBalance, nil +} +func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { + nodeDepositAssigned := new(bool) + if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) + } + return *nodeDepositAssigned, nil +} + +// Get user deposit details +func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { + + // Data + var wg errgroup.Group + var depositBalance *big.Int + var depositAssigned bool + var depositAssignedTime time.Time + + // Load data + wg.Go(func() error { + var err error + depositBalance, err = mp.GetUserDepositBalance(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssigned, err = mp.GetUserDepositAssigned(opts) + return err + }) + wg.Go(func() error { + var err error + depositAssignedTime, err = mp.GetUserDepositAssignedTime(opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return UserDetails{}, err + } + + // Return + return UserDetails{ + DepositBalance: depositBalance, + DepositAssigned: depositAssigned, + DepositAssignedTime: depositAssignedTime, + }, nil + +} +func (mp *Minipool) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { + userDepositBalance := new(*big.Int) + if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) + } + return *userDepositBalance, nil +} +func (mp *Minipool) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { + userDepositAssigned := new(bool) + if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { + return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) + } + return *userDepositAssigned, nil +} +func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { + depositAssignedTime := new(*big.Int) + if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { + return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) + } + return time.Unix((*depositAssignedTime).Int64(), 0), nil +} + +// Estimate the gas of Refund +func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "refund") +} + +// Refund node ETH from the minipool +func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "refund") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of DistributeBalance +func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") +} + +// Distribute the minipool's ETH balance to the node operator and rETH staking pool. +// !!! WARNING !!! +// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain +// and the balance has been deposited into the minipool! +func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "distributeBalance") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of DistributeBalanceAndFinalise +func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") +} + +// Distribute the minipool's ETH balance to the node operator and rETH staking pool, +// then finalises the minipool +// !!! WARNING !!! +// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain +// and the balance has been deposited into the minipool! +func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Stake +func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) +} + +// Progress the prelaunch minipool to staking +func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Dissolve +func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "dissolve") +} + +// Dissolve the initialized or prelaunch minipool +func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "dissolve") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Close +func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "close") +} + +// Withdraw node balances from the dissolved minipool and close it +func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "close") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Finalise +func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "finalise") +} + +// Finalise a minipool to get the RPL stake back +func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "finalise") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of DelegateUpgrade +func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") +} + +// Upgrade this minipool to the latest network delegate contract +func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "delegateUpgrade") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of DelegateRollback +func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") +} + +// Rollback to previous delegate contract +func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "delegateRollback") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of SetUseLatestDelegate +func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) +} + +// If set to true, will automatically use the latest delegate contract +func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Getter for useLatestDelegate setting +func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { + setting := new(bool) + if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { + return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *setting, nil +} + +// Returns the address of the minipool's stored delegate +func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + +// Returns the address of the minipool's previous delegate (or address(0) if not set) +func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + +// Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting +func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { + return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + +// Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties +func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { + nodeAmount := new(*big.Int) + if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool node portion: %w", err) + } + return *nodeAmount, nil +} + +// Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties +func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { + userAmount := new(*big.Int) + if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { + return nil, fmt.Errorf("Could not get minipool user portion: %w", err) + } + return *userAmount, nil +} + +// Estimate the gas requiired to vote to scrub a minipool +func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") +} + +// Vote to scrub a minipool +func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "voteScrub") + if err != nil { + return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Get the data from this minipool's MinipoolPrestaked event +func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { + + addressFilter := []common.Address{mp.Address} + topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} + + // Grab the latest block number + currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + } + + // Grab the lowest block number worth querying from (should never have to go back this far in practice) + deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) + fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + } + + fromBlock := fromBlockBig.Uint64() + var log types.Log + found := false + + // Backwards scan through blocks to find the event + for i := currentBlock; i >= fromBlock; i -= EventScanInterval { + from := i - EventScanInterval + 1 + if from < fromBlock { + from = fromBlock + } + + fromBig := big.NewInt(0).SetUint64(from) + toBig := big.NewInt(0).SetUint64(i) + + logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + } + + if len(logs) > 0 { + log = logs[0] + found = true + break + } + } + + if !found { + // This should never happen + return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + } + + // Decode the event + prestakeEvent := new(minipoolPrestakeEvent) + mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) + if err != nil { + return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + } + + // Convert the event to a more useable struct + prestakeData := PrestakeData{ + Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), + WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), + Amount: prestakeEvent.Amount, + Signature: rptypes.BytesToValidatorSignature(prestakeEvent.Signature), + DepositDataRoot: prestakeEvent.DepositDataRoot, + Time: time.Unix(prestakeEvent.Time.Int64(), 0), + } + return prestakeData, nil +} + +// Get a minipool contract +var rocketMinipoolLock sync.Mutex + +func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolLock.Lock() + defer rocketMinipoolLock.Unlock() + return rp.MakeContract("rocketMinipool", minipoolAddress, opts) +} diff --git a/minipool/minipool-contract.go b/minipool/v3/minipool-contract.go similarity index 99% rename from minipool/minipool-contract.go rename to minipool/v3/minipool-contract.go index 81d73ea48..b78433778 100644 --- a/minipool/minipool-contract.go +++ b/minipool/v3/minipool-contract.go @@ -1,4 +1,4 @@ -package minipool +package minipool_v3 import ( "context" diff --git a/node/node.go b/node/node.go index b6c3636bd..844c1dee0 100644 --- a/node/node.go +++ b/node/node.go @@ -85,11 +85,7 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint if err != nil { return 0, err } - version := new(uint8) - if err := rocketNodeManager.Call(opts, version, "version"); err != nil { - return 0, fmt.Errorf("Could not get node manager version: %w", err) - } - return *version, nil + return rocketpool.GetContractVersion(rp, *rocketNodeManager.Address, nil) } // Get the details for a node diff --git a/node/staking.go b/node/staking.go index 2a288177f..bf471a2a5 100644 --- a/node/staking.go +++ b/node/staking.go @@ -17,11 +17,7 @@ func GetNodeStakingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint if err != nil { return 0, err } - version := new(uint8) - if err := rocketNodeStaking.Call(opts, version, "version"); err != nil { - return 0, fmt.Errorf("Could not get node staking version: %w", err) - } - return *version, nil + return rocketpool.GetContractVersion(rp, *rocketNodeStaking.Address, nil) } // Get the total RPL staked in the network diff --git a/rocketpool/version-interface.go b/rocketpool/version-interface.go new file mode 100644 index 000000000..b3eb51a3c --- /dev/null +++ b/rocketpool/version-interface.go @@ -0,0 +1,34 @@ +package rocketpool + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +// Get the version of the given contract +func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bind.CallOpts) (uint8, error) { + + // Get the version interface ABI + abi, err := rp.GetABI("rocketVersionInterface", opts) + if err != nil { + return 0, fmt.Errorf("error loading version interface ABI: %w", err) + } + + // Create contract + contract := &Contract{ + Contract: bind.NewBoundContract(contractAddress, *abi, rp.Client, rp.Client, rp.Client), + Address: &contractAddress, + ABI: abi, + Client: rp.Client, + } + + // Get the contract version + version := new(uint8) + if err := contract.Call(opts, version, "version"); err != nil { + return 0, fmt.Errorf("Could not get contract version: %w", err) + } + + return *version, nil +} From 93b9afb01625c5d0fe50e1209f76149ba2ad1f17 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 02:29:44 -0500 Subject: [PATCH 531/878] Added a common minipool interface --- minipool/minipool-interface.go | 99 ++++++++++++++++++++++++++++++++ minipool/v2/minipool-contract.go | 88 +++++++++------------------- minipool/v3/minipool-contract.go | 89 +++++++++------------------- 3 files changed, 151 insertions(+), 125 deletions(-) create mode 100644 minipool/minipool-interface.go diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go new file mode 100644 index 000000000..146a2cbd7 --- /dev/null +++ b/minipool/minipool-interface.go @@ -0,0 +1,99 @@ +package minipool + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +// The number of blocks to look for events in at once when scanning +const EventScanInterval = 10000 + +// Minipool detail types +type StatusDetails struct { + Status rptypes.MinipoolStatus `json:"status"` + StatusBlock uint64 `json:"statusBlock"` + StatusTime time.Time `json:"statusTime"` + IsVacant bool `json:"isVacant"` +} +type NodeDetails struct { + Address common.Address `json:"address"` + Fee float64 `json:"fee"` + DepositBalance *big.Int `json:"depositBalance"` + RefundBalance *big.Int `json:"refundBalance"` + DepositAssigned bool `json:"depositAssigned"` +} +type UserDetails struct { + DepositBalance *big.Int `json:"depositBalance"` + DepositAssigned bool `json:"depositAssigned"` + DepositAssignedTime time.Time `json:"depositAssignedTime"` +} + +// The data from a minipool's MinipoolPrestaked event +type MinipoolPrestakeEvent struct { + Pubkey []byte `abi:"validatorPubkey"` + Signature []byte `abi:"validatorSignature"` + DepositDataRoot [32]byte `abi:"depositDataRoot"` + Amount *big.Int `abi:"amount"` + WithdrawalCredentials []byte `abi:"withdrawalCredentials"` + Time *big.Int `abi:"time"` +} + +// Formatted MinipoolPrestaked event data +type PrestakeData struct { + Pubkey rptypes.ValidatorPubkey `json:"pubkey"` + WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` + Amount *big.Int `json:"amount"` + Signature rptypes.ValidatorSignature `json:"signature"` + DepositDataRoot common.Hash `json:"depositDataRoot"` + Time time.Time `json:"time"` +} + +type Minipool interface { + GetAddress() common.Address + GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) + GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) + GetStatusBlock(opts *bind.CallOpts) (uint64, error) + GetStatusTime(opts *bind.CallOpts) (time.Time, error) + GetFinalised(opts *bind.CallOpts) (bool, error) + GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) + GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) + GetNodeAddress(opts *bind.CallOpts) (common.Address, error) + GetNodeFee(opts *bind.CallOpts) (float64, error) + GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) + GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) + GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) + GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) + GetUserDetails(opts *bind.CallOpts) (UserDetails, error) + GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) + GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) + GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) + EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Refund(opts *bind.TransactOpts) (common.Hash, error) + EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) + EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Dissolve(opts *bind.TransactOpts) (common.Hash, error) + EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Finalise(opts *bind.TransactOpts) (common.Hash, error) + EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) + EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) + EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) + GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) + GetDelegate(opts *bind.CallOpts) (common.Address, error) + GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) + GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) + CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) + CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) + EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + VoteScrub(opts *bind.TransactOpts) (common.Hash, error) + GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) +} diff --git a/minipool/v2/minipool-contract.go b/minipool/v2/minipool-contract.go index ebfe28456..eedefcb5b 100644 --- a/minipool/v2/minipool-contract.go +++ b/minipool/v2/minipool-contract.go @@ -14,53 +14,12 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// The number of blocks to look for events in at once when scanning -const EventScanInterval = 10000 - -// Minipool detail types -type StatusDetails struct { - Status rptypes.MinipoolStatus `json:"status"` - StatusBlock uint64 `json:"statusBlock"` - StatusTime time.Time `json:"statusTime"` -} -type NodeDetails struct { - Address common.Address `json:"address"` - Fee float64 `json:"fee"` - DepositBalance *big.Int `json:"depositBalance"` - RefundBalance *big.Int `json:"refundBalance"` - DepositAssigned bool `json:"depositAssigned"` -} -type UserDetails struct { - DepositBalance *big.Int `json:"depositBalance"` - DepositAssigned bool `json:"depositAssigned"` - DepositAssignedTime time.Time `json:"depositAssignedTime"` -} - -// The data from a minipool's MinipoolPrestaked event -type minipoolPrestakeEvent struct { - Pubkey []byte `abi:"validatorPubkey"` - Signature []byte `abi:"validatorSignature"` - DepositDataRoot [32]byte `abi:"depositDataRoot"` - Amount *big.Int `abi:"amount"` - WithdrawalCredentials []byte `abi:"withdrawalCredentials"` - Time *big.Int `abi:"time"` -} - -// Formatted MinipoolPrestaked event data -type PrestakeData struct { - Pubkey rptypes.ValidatorPubkey `json:"pubkey"` - WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` - Amount *big.Int `json:"amount"` - Signature rptypes.ValidatorSignature `json:"signature"` - DepositDataRoot common.Hash `json:"depositDataRoot"` - Time time.Time `json:"time"` -} - // Minipool contract type Minipool struct { Address common.Address @@ -69,7 +28,7 @@ type Minipool struct { } // Create new minipool contract -func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*Minipool, error) { +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { // Get contract contract, err := getMinipoolContract(rp, address, opts) @@ -85,8 +44,13 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C }, nil } +// Get the contract address +func (mp *Minipool) GetAddress() common.Address { + return mp.Address +} + // Get status details -func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { +func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { // Data var wg errgroup.Group @@ -113,11 +77,11 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) // Wait for data if err := wg.Wait(); err != nil { - return StatusDetails{}, err + return minipool.StatusDetails{}, err } // Return - return StatusDetails{ + return minipool.StatusDetails{ Status: status, StatusBlock: statusBlock, StatusTime: statusTime, @@ -163,7 +127,7 @@ func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit } // Get node details -func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { +func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, error) { // Data var wg errgroup.Group @@ -202,11 +166,11 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return NodeDetails{}, err + return minipool.NodeDetails{}, err } // Return - return NodeDetails{ + return minipool.NodeDetails{ Address: address, Fee: fee, DepositBalance: depositBalance, @@ -259,7 +223,7 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { } // Get user deposit details -func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { +func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, error) { // Data var wg errgroup.Group @@ -286,11 +250,11 @@ func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return UserDetails{}, err + return minipool.UserDetails{}, err } // Return - return UserDetails{ + return minipool.UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, DepositAssignedTime: depositAssignedTime, @@ -535,7 +499,7 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { +func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (minipool.PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} @@ -543,14 +507,14 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) // Grab the latest block number currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) } // Grab the lowest block number worth querying from (should never have to go back this far in practice) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } fromBlock := fromBlockBig.Uint64() @@ -558,8 +522,8 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) found := false // Backwards scan through blocks to find the event - for i := currentBlock; i >= fromBlock; i -= EventScanInterval { - from := i - EventScanInterval + 1 + for i := currentBlock; i >= fromBlock; i -= minipool.EventScanInterval { + from := i - minipool.EventScanInterval + 1 if from < fromBlock { from = fromBlock } @@ -569,7 +533,7 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) } if len(logs) > 0 { @@ -581,18 +545,18 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) if !found { // This should never happen - return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + return minipool.PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) } // Decode the event - prestakeEvent := new(minipoolPrestakeEvent) + prestakeEvent := new(minipool.MinipoolPrestakeEvent) mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) if err != nil { - return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + return minipool.PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) } // Convert the event to a more useable struct - prestakeData := PrestakeData{ + prestakeData := minipool.PrestakeData{ Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), Amount: prestakeEvent.Amount, diff --git a/minipool/v3/minipool-contract.go b/minipool/v3/minipool-contract.go index b78433778..ccb3ca4db 100644 --- a/minipool/v3/minipool-contract.go +++ b/minipool/v3/minipool-contract.go @@ -14,54 +14,12 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" + "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// The number of blocks to look for events in at once when scanning -const EventScanInterval = 10000 - -// Minipool detail types -type StatusDetails struct { - Status rptypes.MinipoolStatus `json:"status"` - StatusBlock uint64 `json:"statusBlock"` - StatusTime time.Time `json:"statusTime"` - IsVacant bool `json:"isVacant"` -} -type NodeDetails struct { - Address common.Address `json:"address"` - Fee float64 `json:"fee"` - DepositBalance *big.Int `json:"depositBalance"` - RefundBalance *big.Int `json:"refundBalance"` - DepositAssigned bool `json:"depositAssigned"` -} -type UserDetails struct { - DepositBalance *big.Int `json:"depositBalance"` - DepositAssigned bool `json:"depositAssigned"` - DepositAssignedTime time.Time `json:"depositAssignedTime"` -} - -// The data from a minipool's MinipoolPrestaked event -type minipoolPrestakeEvent struct { - Pubkey []byte `abi:"validatorPubkey"` - Signature []byte `abi:"validatorSignature"` - DepositDataRoot [32]byte `abi:"depositDataRoot"` - Amount *big.Int `abi:"amount"` - WithdrawalCredentials []byte `abi:"withdrawalCredentials"` - Time *big.Int `abi:"time"` -} - -// Formatted MinipoolPrestaked event data -type PrestakeData struct { - Pubkey rptypes.ValidatorPubkey `json:"pubkey"` - WithdrawalCredentials common.Hash `json:"withdrawalCredentials"` - Amount *big.Int `json:"amount"` - Signature rptypes.ValidatorSignature `json:"signature"` - DepositDataRoot common.Hash `json:"depositDataRoot"` - Time time.Time `json:"time"` -} - // Minipool contract type Minipool struct { Address common.Address @@ -70,7 +28,7 @@ type Minipool struct { } // Create new minipool contract -func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*Minipool, error) { +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { // Get contract contract, err := getMinipoolContract(rp, address, opts) @@ -86,8 +44,13 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C }, nil } +// Get the contract address +func (mp *Minipool) GetAddress() common.Address { + return mp.Address +} + // Get status details -func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { +func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { // Data var wg errgroup.Group @@ -120,11 +83,11 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) // Wait for data if err := wg.Wait(); err != nil { - return StatusDetails{}, err + return minipool.StatusDetails{}, err } // Return - return StatusDetails{ + return minipool.StatusDetails{ Status: status, StatusBlock: statusBlock, StatusTime: statusTime, @@ -171,7 +134,7 @@ func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit } // Get node details -func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { +func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, error) { // Data var wg errgroup.Group @@ -210,11 +173,11 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return NodeDetails{}, err + return minipool.NodeDetails{}, err } // Return - return NodeDetails{ + return minipool.NodeDetails{ Address: address, Fee: fee, DepositBalance: depositBalance, @@ -274,7 +237,7 @@ func (mp *Minipool) GetVacant(opts *bind.CallOpts) (bool, error) { } // Get user deposit details -func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { +func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, error) { // Data var wg errgroup.Group @@ -301,11 +264,11 @@ func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Wait for data if err := wg.Wait(); err != nil { - return UserDetails{}, err + return minipool.UserDetails{}, err } // Return - return UserDetails{ + return minipool.UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, DepositAssignedTime: depositAssignedTime, @@ -569,7 +532,7 @@ func (mp *Minipool) Promote(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { +func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (minipool.PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} @@ -577,14 +540,14 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) // Grab the latest block number currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) } // Grab the lowest block number worth querying from (should never have to go back this far in practice) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } fromBlock := fromBlockBig.Uint64() @@ -592,8 +555,8 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) found := false // Backwards scan through blocks to find the event - for i := currentBlock; i >= fromBlock; i -= EventScanInterval { - from := i - EventScanInterval + 1 + for i := currentBlock; i >= fromBlock; i -= minipool.EventScanInterval { + from := i - minipool.EventScanInterval + 1 if from < fromBlock { from = fromBlock } @@ -603,7 +566,7 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) if err != nil { - return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + return minipool.PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) } if len(logs) > 0 { @@ -615,18 +578,18 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) if !found { // This should never happen - return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + return minipool.PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) } // Decode the event - prestakeEvent := new(minipoolPrestakeEvent) + prestakeEvent := new(minipool.MinipoolPrestakeEvent) mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) if err != nil { - return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + return minipool.PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) } // Convert the event to a more useable struct - prestakeData := PrestakeData{ + prestakeData := minipool.PrestakeData{ Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), Amount: prestakeEvent.Amount, From fe21fb005fa41f7666a10f7dd95982d7bf86ff01 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 02:41:03 -0500 Subject: [PATCH 532/878] Added a minipool version binder and constructor --- minipool/binder/minipool-binder.go | 30 ++++++++++++++++++++++++++++++ minipool/minipool-interface.go | 1 + minipool/v2/minipool-contract.go | 7 +++++++ minipool/v3/minipool-contract.go | 16 +++++++--------- 4 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 minipool/binder/minipool-binder.go diff --git a/minipool/binder/minipool-binder.go b/minipool/binder/minipool-binder.go new file mode 100644 index 000000000..3e3a73885 --- /dev/null +++ b/minipool/binder/minipool-binder.go @@ -0,0 +1,30 @@ +package binder + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/minipool" + minipool_v2 "github.com/rocket-pool/rocketpool-go/minipool/v2" + minipool_v3 "github.com/rocket-pool/rocketpool-go/minipool/v3" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { + + // Get the contract version + version, err := rocketpool.GetContractVersion(rp, address, opts) + if err != nil { + return nil, fmt.Errorf("error getting minipool contract version: %w", err) + } + + switch version { + case 1, 2: + return minipool_v2.NewMinipool(rp, address, opts) + case 3: + return minipool_v3.NewMinipool(rp, address, opts) + default: + return nil, fmt.Errorf("unexpected minipool contract version [%d]", version) + } +} diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go index 146a2cbd7..74a2dbbfa 100644 --- a/minipool/minipool-interface.go +++ b/minipool/minipool-interface.go @@ -55,6 +55,7 @@ type PrestakeData struct { type Minipool interface { GetAddress() common.Address + GetVersion() uint8 GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) GetStatusBlock(opts *bind.CallOpts) (uint64, error) diff --git a/minipool/v2/minipool-contract.go b/minipool/v2/minipool-contract.go index eedefcb5b..decd8c7f3 100644 --- a/minipool/v2/minipool-contract.go +++ b/minipool/v2/minipool-contract.go @@ -23,6 +23,7 @@ import ( // Minipool contract type Minipool struct { Address common.Address + Version uint8 Contract *rocketpool.Contract RocketPool *rocketpool.RocketPool } @@ -39,6 +40,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Create and return return &Minipool{ Address: address, + Version: 2, Contract: contract, RocketPool: rp, }, nil @@ -49,6 +51,11 @@ func (mp *Minipool) GetAddress() common.Address { return mp.Address } +// Get the contract version +func (mp *Minipool) GetVersion() uint8 { + return mp.Version +} + // Get status details func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { diff --git a/minipool/v3/minipool-contract.go b/minipool/v3/minipool-contract.go index ccb3ca4db..437e0ee00 100644 --- a/minipool/v3/minipool-contract.go +++ b/minipool/v3/minipool-contract.go @@ -23,6 +23,7 @@ import ( // Minipool contract type Minipool struct { Address common.Address + Version uint8 Contract *rocketpool.Contract RocketPool *rocketpool.RocketPool } @@ -39,6 +40,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Create and return return &Minipool{ Address: address, + Version: 3, Contract: contract, RocketPool: rp, }, nil @@ -49,6 +51,11 @@ func (mp *Minipool) GetAddress() common.Address { return mp.Address } +// Get the contract version +func (mp *Minipool) GetVersion() uint8 { + return mp.Version +} + // Get status details func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { @@ -462,15 +469,6 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e return *address, nil } -// Get the version of the minipool contract -func (mp *Minipool) GetVersion(opts *bind.CallOpts) (uint8, error) { - version := new(uint8) - if err := mp.Contract.Call(opts, version, "version"); err != nil { - return 0, fmt.Errorf("Could not get minipool version: %w", err) - } - return *version, nil -} - // Estimate the gas required to reduce a minipool's bond func (mp *Minipool) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "reduceBondAmount") From fadfff299afa091bc5e79dcd481dd46df199f092 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 02:45:55 -0500 Subject: [PATCH 533/878] Added a missing method to the minipool interface --- minipool/minipool-interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go index 74a2dbbfa..d3dbf1a23 100644 --- a/minipool/minipool-interface.go +++ b/minipool/minipool-interface.go @@ -80,6 +80,7 @@ type Minipool interface { EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Dissolve(opts *bind.TransactOpts) (common.Hash, error) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Close(opts *bind.TransactOpts) (common.Hash, error) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Finalise(opts *bind.TransactOpts) (common.Hash, error) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 8b7a6efd4260d8b4a8674a169ca6ac50c712468f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 03:02:25 -0500 Subject: [PATCH 534/878] Consolidated the minipool version implementations into a single namespace for simplicity --- legacy/v1.1.0/minipool/queue.go | 20 +-- ...pool-binder.go => minipool-constructor.go} | 21 ++- ...ol-contract.go => minipool-contract-v2.go} | 145 ++++++++--------- ...ol-contract.go => minipool-contract-v3.go} | 151 ++++++++---------- 4 files changed, 161 insertions(+), 176 deletions(-) rename minipool/{binder/minipool-binder.go => minipool-constructor.go} (53%) rename minipool/{v2/minipool-contract.go => minipool-contract-v2.go} (72%) rename minipool/{v3/minipool-contract.go => minipool-contract-v3.go} (72%) diff --git a/legacy/v1.1.0/minipool/queue.go b/legacy/v1.1.0/minipool/queue.go index 42a1bc978..5129e53e1 100644 --- a/legacy/v1.1.0/minipool/queue.go +++ b/legacy/v1.1.0/minipool/queue.go @@ -189,8 +189,8 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } // Get Queue position details of a minipool -func GetQueueDetails(rp *rocketpool.RocketPool, mp *minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (QueueDetails, error) { - position, err := GetQueuePositionOfMinipool(mp, opts, legacyRocketMinipoolQueueAddress) +func GetQueueDetails(rp *rocketpool.RocketPool, mp minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (QueueDetails, error) { + position, err := GetQueuePositionOfMinipool(rp, mp, opts, legacyRocketMinipoolQueueAddress) if err != nil { return QueueDetails{}, err } @@ -202,19 +202,19 @@ func GetQueueDetails(rp *rocketpool.RocketPool, mp *minipool.Minipool, opts *bin } // Get a minipools position in queue (1-indexed). 0 means it is currently not queued. -func GetQueuePositionOfMinipool(mp *minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { +func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { depositType, err := mp.GetDepositType(opts) if err != nil { return 0, fmt.Errorf("Could not get deposit type: %w", err) } if depositType == rptypes.None { - return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.Address) + return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.GetAddress()) } queryIndex := func(key string) (uint64, error) { - index, err := storage.GetAddressQueueIndexOf(mp.RocketPool, opts, crypto.Keccak256Hash([]byte(key)), mp.Address) + index, err := storage.GetAddressQueueIndexOf(rp, opts, crypto.Keccak256Hash([]byte(key)), mp.GetAddress()) if err != nil { - return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.Address, err) + return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.GetAddress(), err) } return uint64(index + 1), nil } @@ -223,7 +223,7 @@ func GetQueuePositionOfMinipool(mp *minipool.Minipool, opts *bind.CallOpts, lega // half cleared first if depositType != rptypes.Half { - position, err = GetQueueLength(mp.RocketPool, rptypes.Half, opts, legacyRocketMinipoolQueueAddress) + position, err = GetQueueLength(rp, rptypes.Half, opts, legacyRocketMinipoolQueueAddress) if err != nil { return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) } @@ -233,7 +233,7 @@ func GetQueuePositionOfMinipool(mp *minipool.Minipool, opts *bind.CallOpts, lega // full deposits next if depositType != rptypes.Full { - length, err := GetQueueLength(mp.RocketPool, rptypes.Full, opts, legacyRocketMinipoolQueueAddress) + length, err := GetQueueLength(rp, rptypes.Full, opts, legacyRocketMinipoolQueueAddress) if err != nil { return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) } @@ -255,7 +255,7 @@ func GetQueuePositionOfMinipool(mp *minipool.Minipool, opts *bind.CallOpts, lega } // Get the minipool at the specified position in queue (0-indexed). -func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (*minipool.Minipool, error) { +func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (minipool.Minipool, error) { totalLength, err := GetQueueTotalLength(rp, opts, legacyRocketMinipoolQueueAddress) if err != nil { return nil, fmt.Errorf("Could not get total queue length: %w", err) @@ -268,7 +268,7 @@ func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts return nil, fmt.Errorf("Could not get queue lengths: %w", err) } - getMinipool := func(key string) (*minipool.Minipool, error) { + getMinipool := func(key string) (minipool.Minipool, error) { pos := big.NewInt(int64(position)) address, err := storage.GetAddressQueueItem(rp, opts, crypto.Keccak256Hash([]byte(key)), pos) if err != nil { diff --git a/minipool/binder/minipool-binder.go b/minipool/minipool-constructor.go similarity index 53% rename from minipool/binder/minipool-binder.go rename to minipool/minipool-constructor.go index 3e3a73885..8677b65cf 100644 --- a/minipool/binder/minipool-binder.go +++ b/minipool/minipool-constructor.go @@ -1,17 +1,15 @@ -package binder +package minipool import ( "fmt" + "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - minipool_v2 "github.com/rocket-pool/rocketpool-go/minipool/v2" - minipool_v3 "github.com/rocket-pool/rocketpool-go/minipool/v3" "github.com/rocket-pool/rocketpool-go/rocketpool" ) -func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { +func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { // Get the contract version version, err := rocketpool.GetContractVersion(rp, address, opts) @@ -21,10 +19,19 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C switch version { case 1, 2: - return minipool_v2.NewMinipool(rp, address, opts) + return newMinipool_v2(rp, address, opts) case 3: - return minipool_v3.NewMinipool(rp, address, opts) + return newMinipool_v3(rp, address, opts) default: return nil, fmt.Errorf("unexpected minipool contract version [%d]", version) } } + +// Get a minipool contract +var rocketMinipoolLock sync.Mutex + +func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolLock.Lock() + defer rocketMinipoolLock.Unlock() + return rp.MakeContract("rocketMinipool", minipoolAddress, opts) +} diff --git a/minipool/v2/minipool-contract.go b/minipool/minipool-contract-v2.go similarity index 72% rename from minipool/v2/minipool-contract.go rename to minipool/minipool-contract-v2.go index decd8c7f3..a486b7e53 100644 --- a/minipool/v2/minipool-contract.go +++ b/minipool/minipool-contract-v2.go @@ -1,10 +1,9 @@ -package minipool_v2 +package minipool import ( "context" "fmt" "math/big" - "sync" "time" "github.com/ethereum/go-ethereum/core/types" @@ -14,14 +13,13 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Minipool contract -type Minipool struct { +type Minipool_v2 struct { Address common.Address Version uint8 Contract *rocketpool.Contract @@ -29,7 +27,7 @@ type Minipool struct { } // Create new minipool contract -func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { +func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { // Get contract contract, err := getMinipoolContract(rp, address, opts) @@ -38,7 +36,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } // Create and return - return &Minipool{ + return &Minipool_v2{ Address: address, Version: 2, Contract: contract, @@ -47,17 +45,17 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } // Get the contract address -func (mp *Minipool) GetAddress() common.Address { +func (mp *Minipool_v2) GetAddress() common.Address { return mp.Address } // Get the contract version -func (mp *Minipool) GetVersion() uint8 { +func (mp *Minipool_v2) GetVersion() uint8 { return mp.Version } // Get status details -func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { +func (mp *Minipool_v2) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { // Data var wg errgroup.Group @@ -84,39 +82,39 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetail // Wait for data if err := wg.Wait(); err != nil { - return minipool.StatusDetails{}, err + return StatusDetails{}, err } // Return - return minipool.StatusDetails{ + return StatusDetails{ Status: status, StatusBlock: statusBlock, StatusTime: statusTime, }, nil } -func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { +func (mp *Minipool_v2) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } -func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { +func (mp *Minipool_v2) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } -func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *Minipool_v2) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } -func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) @@ -125,7 +123,7 @@ func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { } // Get deposit type -func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { +func (mp *Minipool_v2) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) @@ -134,7 +132,7 @@ func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit } // Get node details -func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, error) { +func (mp *Minipool_v2) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -173,11 +171,11 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, e // Wait for data if err := wg.Wait(); err != nil { - return minipool.NodeDetails{}, err + return NodeDetails{}, err } // Return - return minipool.NodeDetails{ + return NodeDetails{ Address: address, Fee: fee, DepositBalance: depositBalance, @@ -186,42 +184,42 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, e }, nil } -func (mp *Minipool) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v2) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } -func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { +func (mp *Minipool_v2) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } -func (mp *Minipool) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } -func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } -func (mp *Minipool) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } -func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v2) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) @@ -230,7 +228,7 @@ func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { } // Get user deposit details -func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, error) { +func (mp *Minipool_v2) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Data var wg errgroup.Group @@ -257,32 +255,32 @@ func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, e // Wait for data if err := wg.Wait(); err != nil { - return minipool.UserDetails{}, err + return UserDetails{}, err } // Return - return minipool.UserDetails{ + return UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, DepositAssignedTime: depositAssignedTime, }, nil } -func (mp *Minipool) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } -func (mp *Minipool) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v2) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } -func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *Minipool_v2) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) @@ -291,12 +289,12 @@ func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, } // Estimate the gas of Refund -func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "refund") } // Refund node ETH from the minipool -func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) @@ -305,7 +303,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DistributeBalance -func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } @@ -313,7 +311,7 @@ func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocke // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) @@ -322,7 +320,7 @@ func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, err } // Estimate the gas of DistributeBalanceAndFinalise -func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") } @@ -331,7 +329,7 @@ func (mp *Minipool) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactO // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) @@ -340,12 +338,12 @@ func (mp *Minipool) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (commo } // Estimate the gas of Stake -func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } // Progress the prelaunch minipool to staking -func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) @@ -354,12 +352,12 @@ func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, deposit } // Estimate the gas of Dissolve -func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "dissolve") } // Dissolve the initialized or prelaunch minipool -func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) @@ -368,12 +366,12 @@ func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Close -func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "close") } // Withdraw node balances from the dissolved minipool and close it -func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) @@ -382,12 +380,12 @@ func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Finalise -func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "finalise") } // Finalise a minipool to get the RPL stake back -func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) @@ -396,12 +394,12 @@ func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DelegateUpgrade -func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") } // Upgrade this minipool to the latest network delegate contract -func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -410,12 +408,12 @@ func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error } // Estimate the gas of DelegateRollback -func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") } // Rollback to previous delegate contract -func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -424,12 +422,12 @@ func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, erro } // Estimate the gas of SetUseLatestDelegate -func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) } // If set to true, will automatically use the latest delegate contract -func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -438,7 +436,7 @@ func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) } // Getter for useLatestDelegate setting -func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -447,7 +445,7 @@ func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { } // Returns the address of the minipool's stored delegate -func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -456,7 +454,7 @@ func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { } // Returns the address of the minipool's previous delegate (or address(0) if not set) -func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -465,7 +463,7 @@ func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, er } // Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting -func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -474,7 +472,7 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e } // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties -func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool node portion: %w", err) @@ -483,7 +481,7 @@ func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (* } // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties -func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v2) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) @@ -492,12 +490,12 @@ func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (* } // Estimate the gas requiired to vote to scrub a minipool -func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v2) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } // Vote to scrub a minipool -func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v2) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) @@ -506,7 +504,7 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (minipool.PrestakeData, error) { +func (mp *Minipool_v2) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} @@ -514,14 +512,14 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) // Grab the latest block number currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) } // Grab the lowest block number worth querying from (should never have to go back this far in practice) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } fromBlock := fromBlockBig.Uint64() @@ -529,8 +527,8 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) found := false // Backwards scan through blocks to find the event - for i := currentBlock; i >= fromBlock; i -= minipool.EventScanInterval { - from := i - minipool.EventScanInterval + 1 + for i := currentBlock; i >= fromBlock; i -= EventScanInterval { + from := i - EventScanInterval + 1 if from < fromBlock { from = fromBlock } @@ -540,7 +538,7 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) } if len(logs) > 0 { @@ -552,18 +550,18 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) if !found { // This should never happen - return minipool.PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) } // Decode the event - prestakeEvent := new(minipool.MinipoolPrestakeEvent) + prestakeEvent := new(MinipoolPrestakeEvent) mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) } // Convert the event to a more useable struct - prestakeData := minipool.PrestakeData{ + prestakeData := PrestakeData{ Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), Amount: prestakeEvent.Amount, @@ -573,12 +571,3 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) } return prestakeData, nil } - -// Get a minipool contract -var rocketMinipoolLock sync.Mutex - -func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketMinipoolLock.Lock() - defer rocketMinipoolLock.Unlock() - return rp.MakeContract("rocketMinipool", minipoolAddress, opts) -} diff --git a/minipool/v3/minipool-contract.go b/minipool/minipool-contract-v3.go similarity index 72% rename from minipool/v3/minipool-contract.go rename to minipool/minipool-contract-v3.go index 437e0ee00..f66227eeb 100644 --- a/minipool/v3/minipool-contract.go +++ b/minipool/minipool-contract-v3.go @@ -1,10 +1,9 @@ -package minipool_v3 +package minipool import ( "context" "fmt" "math/big" - "sync" "time" "github.com/ethereum/go-ethereum/core/types" @@ -14,14 +13,13 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Minipool contract -type Minipool struct { +type Minipool_v3 struct { Address common.Address Version uint8 Contract *rocketpool.Contract @@ -29,7 +27,7 @@ type Minipool struct { } // Create new minipool contract -func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (minipool.Minipool, error) { +func newMinipool_v3(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { // Get contract contract, err := getMinipoolContract(rp, address, opts) @@ -38,7 +36,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } // Create and return - return &Minipool{ + return &Minipool_v3{ Address: address, Version: 3, Contract: contract, @@ -47,17 +45,17 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } // Get the contract address -func (mp *Minipool) GetAddress() common.Address { +func (mp *Minipool_v3) GetAddress() common.Address { return mp.Address } // Get the contract version -func (mp *Minipool) GetVersion() uint8 { +func (mp *Minipool_v3) GetVersion() uint8 { return mp.Version } // Get status details -func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetails, error) { +func (mp *Minipool_v3) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { // Data var wg errgroup.Group @@ -90,11 +88,11 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetail // Wait for data if err := wg.Wait(); err != nil { - return minipool.StatusDetails{}, err + return StatusDetails{}, err } // Return - return minipool.StatusDetails{ + return StatusDetails{ Status: status, StatusBlock: statusBlock, StatusTime: statusTime, @@ -102,28 +100,28 @@ func (mp *Minipool) GetStatusDetails(opts *bind.CallOpts) (minipool.StatusDetail }, nil } -func (mp *Minipool) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { +func (mp *Minipool_v3) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } -func (mp *Minipool) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { +func (mp *Minipool_v3) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } -func (mp *Minipool) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *Minipool_v3) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } -func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) @@ -132,7 +130,7 @@ func (mp *Minipool) GetFinalised(opts *bind.CallOpts) (bool, error) { } // Get deposit type -func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { +func (mp *Minipool_v3) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) @@ -141,7 +139,7 @@ func (mp *Minipool) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit } // Get node details -func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, error) { +func (mp *Minipool_v3) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -180,11 +178,11 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, e // Wait for data if err := wg.Wait(); err != nil { - return minipool.NodeDetails{}, err + return NodeDetails{}, err } // Return - return minipool.NodeDetails{ + return NodeDetails{ Address: address, Fee: fee, DepositBalance: depositBalance, @@ -193,49 +191,49 @@ func (mp *Minipool) GetNodeDetails(opts *bind.CallOpts) (minipool.NodeDetails, e }, nil } -func (mp *Minipool) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v3) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } -func (mp *Minipool) GetNodeFee(opts *bind.CallOpts) (float64, error) { +func (mp *Minipool_v3) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } -func (mp *Minipool) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } -func (mp *Minipool) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } -func (mp *Minipool) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } -func (mp *Minipool) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v3) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil } -func (mp *Minipool) GetVacant(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { isVacant := new(bool) if err := mp.Contract.Call(opts, isVacant, "getVacant"); err != nil { return false, fmt.Errorf("Could not get minipool %s vacant status: %w", mp.Address.Hex(), err) @@ -244,7 +242,7 @@ func (mp *Minipool) GetVacant(opts *bind.CallOpts) (bool, error) { } // Get user deposit details -func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, error) { +func (mp *Minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Data var wg errgroup.Group @@ -271,32 +269,32 @@ func (mp *Minipool) GetUserDetails(opts *bind.CallOpts) (minipool.UserDetails, e // Wait for data if err := wg.Wait(); err != nil { - return minipool.UserDetails{}, err + return UserDetails{}, err } // Return - return minipool.UserDetails{ + return UserDetails{ DepositBalance: depositBalance, DepositAssigned: depositAssigned, DepositAssignedTime: depositAssignedTime, }, nil } -func (mp *Minipool) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } -func (mp *Minipool) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v3) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } -func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *Minipool_v3) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) @@ -305,12 +303,12 @@ func (mp *Minipool) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, } // Estimate the gas of Refund -func (mp *Minipool) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "refund") } // Refund node ETH from the minipool -func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) @@ -319,7 +317,7 @@ func (mp *Minipool) Refund(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DistributeBalance -func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } @@ -327,7 +325,7 @@ func (mp *Minipool) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocke // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) @@ -336,12 +334,12 @@ func (mp *Minipool) DistributeBalance(opts *bind.TransactOpts) (common.Hash, err } // Estimate the gas of Stake -func (mp *Minipool) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } // Progress the prelaunch minipool to staking -func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) @@ -350,12 +348,12 @@ func (mp *Minipool) Stake(validatorSignature rptypes.ValidatorSignature, deposit } // Estimate the gas of Dissolve -func (mp *Minipool) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "dissolve") } // Dissolve the initialized or prelaunch minipool -func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) @@ -364,12 +362,12 @@ func (mp *Minipool) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Close -func (mp *Minipool) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "close") } // Withdraw node balances from the dissolved minipool and close it -func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) @@ -378,12 +376,12 @@ func (mp *Minipool) Close(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Finalise -func (mp *Minipool) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "finalise") } // Finalise a minipool to get the RPL stake back -func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) @@ -392,12 +390,12 @@ func (mp *Minipool) Finalise(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DelegateUpgrade -func (mp *Minipool) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") } // Upgrade this minipool to the latest network delegate contract -func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -406,12 +404,12 @@ func (mp *Minipool) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error } // Estimate the gas of DelegateRollback -func (mp *Minipool) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") } // Rollback to previous delegate contract -func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -420,12 +418,12 @@ func (mp *Minipool) DelegateRollback(opts *bind.TransactOpts) (common.Hash, erro } // Estimate the gas of SetUseLatestDelegate -func (mp *Minipool) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) } // If set to true, will automatically use the latest delegate contract -func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -434,7 +432,7 @@ func (mp *Minipool) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) } // Getter for useLatestDelegate setting -func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { +func (mp *Minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -443,7 +441,7 @@ func (mp *Minipool) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { } // Returns the address of the minipool's stored delegate -func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -452,7 +450,7 @@ func (mp *Minipool) GetDelegate(opts *bind.CallOpts) (common.Address, error) { } // Returns the address of the minipool's previous delegate (or address(0) if not set) -func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -461,7 +459,7 @@ func (mp *Minipool) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, er } // Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting -func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *Minipool_v3) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -470,12 +468,12 @@ func (mp *Minipool) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, e } // Estimate the gas required to reduce a minipool's bond -func (mp *Minipool) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "reduceBondAmount") } // Reduce a minipool's bond -func (mp *Minipool) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "reduceBondAmount") if err != nil { return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", mp.Address.Hex(), err) @@ -484,7 +482,7 @@ func (mp *Minipool) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, erro } // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties -func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool node portion: %w", err) @@ -493,7 +491,7 @@ func (mp *Minipool) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (* } // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties -func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *Minipool_v3) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) @@ -502,12 +500,12 @@ func (mp *Minipool) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (* } // Estimate the gas required to vote to scrub a minipool -func (mp *Minipool) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } // Vote to scrub a minipool -func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) @@ -516,12 +514,12 @@ func (mp *Minipool) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas required to promote a vacant minipool -func (mp *Minipool) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *Minipool_v3) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "promote") } // Promote a vacant minipool -func (mp *Minipool) Promote(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *Minipool_v3) Promote(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "promote") if err != nil { return common.Hash{}, fmt.Errorf("Could not promote minipool %s: %w", mp.Address.Hex(), err) @@ -530,7 +528,7 @@ func (mp *Minipool) Promote(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (minipool.PrestakeData, error) { +func (mp *Minipool_v3) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} @@ -538,14 +536,14 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) // Grab the latest block number currentBlock, err := mp.RocketPool.Client.BlockNumber(context.Background()) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting current block %s: %w", mp.Address.Hex(), err) } // Grab the lowest block number worth querying from (should never have to go back this far in practice) deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } fromBlock := fromBlockBig.Uint64() @@ -553,8 +551,8 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) found := false // Backwards scan through blocks to find the event - for i := currentBlock; i >= fromBlock; i -= minipool.EventScanInterval { - from := i - minipool.EventScanInterval + 1 + for i := currentBlock; i >= fromBlock; i -= EventScanInterval { + from := i - EventScanInterval + 1 if from < fromBlock { from = fromBlock } @@ -564,7 +562,7 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) logs, err := eth.GetLogs(mp.RocketPool, addressFilter, topicFilter, intervalSize, fromBig, toBig, nil) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) + return PrestakeData{}, fmt.Errorf("Error getting prestake logs for minipool %s: %w", mp.Address.Hex(), err) } if len(logs) > 0 { @@ -576,18 +574,18 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) if !found { // This should never happen - return minipool.PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) + return PrestakeData{}, fmt.Errorf("Error finding prestake log for minipool %s", mp.Address.Hex()) } // Decode the event - prestakeEvent := new(minipool.MinipoolPrestakeEvent) + prestakeEvent := new(MinipoolPrestakeEvent) mp.Contract.Contract.UnpackLog(prestakeEvent, "MinipoolPrestaked", log) if err != nil { - return minipool.PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) + return PrestakeData{}, fmt.Errorf("Error unpacking prestake data: %w", err) } // Convert the event to a more useable struct - prestakeData := minipool.PrestakeData{ + prestakeData := PrestakeData{ Pubkey: rptypes.BytesToValidatorPubkey(prestakeEvent.Pubkey), WithdrawalCredentials: common.BytesToHash(prestakeEvent.WithdrawalCredentials), Amount: prestakeEvent.Amount, @@ -597,12 +595,3 @@ func (mp *Minipool) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) } return prestakeData, nil } - -// Get a minipool contract -var rocketMinipoolLock sync.Mutex - -func getMinipoolContract(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketMinipoolLock.Lock() - defer rocketMinipoolLock.Unlock() - return rp.MakeContract("rocketMinipool", minipoolAddress, opts) -} From f467d6a9ab20c32e144cb5044981aaa47ebaa058 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 03:16:18 -0500 Subject: [PATCH 535/878] Added downcasters for specific minipool version instances --- minipool/minipool-contract-v2.go | 117 ++++++++++++++++------------- minipool/minipool-contract-v3.go | 123 ++++++++++++++++++------------- 2 files changed, 137 insertions(+), 103 deletions(-) diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index a486b7e53..043520d0d 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -18,8 +18,16 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +type MinipoolV2 interface { + Minipool + EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) + EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) +} + // Minipool contract -type Minipool_v2 struct { +type minipool_v2 struct { Address common.Address Version uint8 Contract *rocketpool.Contract @@ -36,7 +44,7 @@ func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address, opts *bin } // Create and return - return &Minipool_v2{ + return &minipool_v2{ Address: address, Version: 2, Contract: contract, @@ -44,18 +52,27 @@ func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address, opts *bin }, nil } +// Get the minipool as a v2 minipool if it implements the required methods +func GetMinipoolAsV2(mp Minipool) (MinipoolV2, bool) { + castedMp, ok := mp.(MinipoolV2) + if ok { + return castedMp, true + } + return nil, false +} + // Get the contract address -func (mp *Minipool_v2) GetAddress() common.Address { +func (mp *minipool_v2) GetAddress() common.Address { return mp.Address } // Get the contract version -func (mp *Minipool_v2) GetVersion() uint8 { +func (mp *minipool_v2) GetVersion() uint8 { return mp.Version } // Get status details -func (mp *Minipool_v2) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { +func (mp *minipool_v2) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { // Data var wg errgroup.Group @@ -93,28 +110,28 @@ func (mp *Minipool_v2) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, err }, nil } -func (mp *Minipool_v2) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { +func (mp *minipool_v2) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } -func (mp *Minipool_v2) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { +func (mp *minipool_v2) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } -func (mp *Minipool_v2) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *minipool_v2) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } -func (mp *Minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) @@ -123,7 +140,7 @@ func (mp *Minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { } // Get deposit type -func (mp *Minipool_v2) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { +func (mp *minipool_v2) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) @@ -132,7 +149,7 @@ func (mp *Minipool_v2) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDepo } // Get node details -func (mp *Minipool_v2) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { +func (mp *minipool_v2) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -184,42 +201,42 @@ func (mp *Minipool_v2) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) }, nil } -func (mp *Minipool_v2) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v2) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } -func (mp *Minipool_v2) GetNodeFee(opts *bind.CallOpts) (float64, error) { +func (mp *minipool_v2) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } -func (mp *Minipool_v2) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } -func (mp *Minipool_v2) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } -func (mp *Minipool_v2) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } -func (mp *Minipool_v2) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v2) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) @@ -228,7 +245,7 @@ func (mp *Minipool_v2) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) } // Get user deposit details -func (mp *Minipool_v2) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { +func (mp *minipool_v2) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Data var wg errgroup.Group @@ -266,21 +283,21 @@ func (mp *Minipool_v2) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) }, nil } -func (mp *Minipool_v2) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } -func (mp *Minipool_v2) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v2) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } -func (mp *Minipool_v2) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *minipool_v2) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) @@ -289,12 +306,12 @@ func (mp *Minipool_v2) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Tim } // Estimate the gas of Refund -func (mp *Minipool_v2) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "refund") } // Refund node ETH from the minipool -func (mp *Minipool_v2) Refund(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) @@ -303,7 +320,7 @@ func (mp *Minipool_v2) Refund(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DistributeBalance -func (mp *Minipool_v2) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } @@ -311,7 +328,7 @@ func (mp *Minipool_v2) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (ro // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool_v2) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) @@ -320,7 +337,7 @@ func (mp *Minipool_v2) DistributeBalance(opts *bind.TransactOpts) (common.Hash, } // Estimate the gas of DistributeBalanceAndFinalise -func (mp *Minipool_v2) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalanceAndFinalise") } @@ -329,7 +346,7 @@ func (mp *Minipool_v2) EstimateDistributeBalanceAndFinaliseGas(opts *bind.Transa // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool_v2) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) @@ -338,12 +355,12 @@ func (mp *Minipool_v2) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (co } // Estimate the gas of Stake -func (mp *Minipool_v2) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } // Progress the prelaunch minipool to staking -func (mp *Minipool_v2) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) @@ -352,12 +369,12 @@ func (mp *Minipool_v2) Stake(validatorSignature rptypes.ValidatorSignature, depo } // Estimate the gas of Dissolve -func (mp *Minipool_v2) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "dissolve") } // Dissolve the initialized or prelaunch minipool -func (mp *Minipool_v2) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) @@ -366,12 +383,12 @@ func (mp *Minipool_v2) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Close -func (mp *Minipool_v2) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "close") } // Withdraw node balances from the dissolved minipool and close it -func (mp *Minipool_v2) Close(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) @@ -380,12 +397,12 @@ func (mp *Minipool_v2) Close(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Finalise -func (mp *Minipool_v2) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "finalise") } // Finalise a minipool to get the RPL stake back -func (mp *Minipool_v2) Finalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) @@ -394,12 +411,12 @@ func (mp *Minipool_v2) Finalise(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DelegateUpgrade -func (mp *Minipool_v2) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") } // Upgrade this minipool to the latest network delegate contract -func (mp *Minipool_v2) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -408,12 +425,12 @@ func (mp *Minipool_v2) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, er } // Estimate the gas of DelegateRollback -func (mp *Minipool_v2) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") } // Rollback to previous delegate contract -func (mp *Minipool_v2) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -422,12 +439,12 @@ func (mp *Minipool_v2) DelegateRollback(opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of SetUseLatestDelegate -func (mp *Minipool_v2) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) } // If set to true, will automatically use the latest delegate contract -func (mp *Minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -436,7 +453,7 @@ func (mp *Minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpt } // Getter for useLatestDelegate setting -func (mp *Minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -445,7 +462,7 @@ func (mp *Minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { } // Returns the address of the minipool's stored delegate -func (mp *Minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -454,7 +471,7 @@ func (mp *Minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) } // Returns the address of the minipool's previous delegate (or address(0) if not set) -func (mp *Minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -463,7 +480,7 @@ func (mp *Minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, } // Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting -func (mp *Minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -472,7 +489,7 @@ func (mp *Minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address } // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties -func (mp *Minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool node portion: %w", err) @@ -481,7 +498,7 @@ func (mp *Minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) } // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties -func (mp *Minipool_v2) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v2) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) @@ -490,12 +507,12 @@ func (mp *Minipool_v2) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) } // Estimate the gas requiired to vote to scrub a minipool -func (mp *Minipool_v2) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v2) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } // Vote to scrub a minipool -func (mp *Minipool_v2) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v2) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) @@ -504,7 +521,7 @@ func (mp *Minipool_v2) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool_v2) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { +func (mp *minipool_v2) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index f66227eeb..29e3c7888 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -18,8 +18,16 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +type MinipoolV3 interface { + Minipool + EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) + EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Promote(opts *bind.TransactOpts) (common.Hash, error) +} + // Minipool contract -type Minipool_v3 struct { +type minipool_v3 struct { Address common.Address Version uint8 Contract *rocketpool.Contract @@ -36,7 +44,7 @@ func newMinipool_v3(rp *rocketpool.RocketPool, address common.Address, opts *bin } // Create and return - return &Minipool_v3{ + return &minipool_v3{ Address: address, Version: 3, Contract: contract, @@ -44,18 +52,27 @@ func newMinipool_v3(rp *rocketpool.RocketPool, address common.Address, opts *bin }, nil } +// Get the minipool as a v3 minipool if it implements the required methods +func GetMinipoolAsV3(mp Minipool) (MinipoolV3, bool) { + castedMp, ok := mp.(MinipoolV3) + if ok { + return castedMp, true + } + return nil, false +} + // Get the contract address -func (mp *Minipool_v3) GetAddress() common.Address { +func (mp *minipool_v3) GetAddress() common.Address { return mp.Address } // Get the contract version -func (mp *Minipool_v3) GetVersion() uint8 { +func (mp *minipool_v3) GetVersion() uint8 { return mp.Version } // Get status details -func (mp *Minipool_v3) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { +func (mp *minipool_v3) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) { // Data var wg errgroup.Group @@ -100,28 +117,28 @@ func (mp *Minipool_v3) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, err }, nil } -func (mp *Minipool_v3) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { +func (mp *minipool_v3) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } -func (mp *Minipool_v3) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { +func (mp *minipool_v3) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } -func (mp *Minipool_v3) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *minipool_v3) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } -func (mp *Minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) @@ -130,7 +147,7 @@ func (mp *Minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { } // Get deposit type -func (mp *Minipool_v3) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { +func (mp *minipool_v3) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) @@ -139,7 +156,7 @@ func (mp *Minipool_v3) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDepo } // Get node details -func (mp *Minipool_v3) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { +func (mp *minipool_v3) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -191,49 +208,49 @@ func (mp *Minipool_v3) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) }, nil } -func (mp *Minipool_v3) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v3) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } -func (mp *Minipool_v3) GetNodeFee(opts *bind.CallOpts) (float64, error) { +func (mp *minipool_v3) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } -func (mp *Minipool_v3) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } -func (mp *Minipool_v3) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } -func (mp *Minipool_v3) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } -func (mp *Minipool_v3) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v3) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil } -func (mp *Minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { isVacant := new(bool) if err := mp.Contract.Call(opts, isVacant, "getVacant"); err != nil { return false, fmt.Errorf("Could not get minipool %s vacant status: %w", mp.Address.Hex(), err) @@ -242,7 +259,7 @@ func (mp *Minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { } // Get user deposit details -func (mp *Minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { +func (mp *minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { // Data var wg errgroup.Group @@ -280,21 +297,21 @@ func (mp *Minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) }, nil } -func (mp *Minipool_v3) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } -func (mp *Minipool_v3) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v3) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } -func (mp *Minipool_v3) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { +func (mp *minipool_v3) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) @@ -303,12 +320,12 @@ func (mp *Minipool_v3) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Tim } // Estimate the gas of Refund -func (mp *Minipool_v3) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "refund") } // Refund node ETH from the minipool -func (mp *Minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) @@ -317,7 +334,7 @@ func (mp *Minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DistributeBalance -func (mp *Minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } @@ -325,7 +342,7 @@ func (mp *Minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (ro // !!! WARNING !!! // DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain // and the balance has been deposited into the minipool! -func (mp *Minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) @@ -334,12 +351,12 @@ func (mp *Minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, } // Estimate the gas of Stake -func (mp *Minipool_v3) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) } // Progress the prelaunch minipool to staking -func (mp *Minipool_v3) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) @@ -348,12 +365,12 @@ func (mp *Minipool_v3) Stake(validatorSignature rptypes.ValidatorSignature, depo } // Estimate the gas of Dissolve -func (mp *Minipool_v3) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "dissolve") } // Dissolve the initialized or prelaunch minipool -func (mp *Minipool_v3) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) @@ -362,12 +379,12 @@ func (mp *Minipool_v3) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Close -func (mp *Minipool_v3) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "close") } // Withdraw node balances from the dissolved minipool and close it -func (mp *Minipool_v3) Close(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) @@ -376,12 +393,12 @@ func (mp *Minipool_v3) Close(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of Finalise -func (mp *Minipool_v3) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "finalise") } // Finalise a minipool to get the RPL stake back -func (mp *Minipool_v3) Finalise(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) @@ -390,12 +407,12 @@ func (mp *Minipool_v3) Finalise(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas of DelegateUpgrade -func (mp *Minipool_v3) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") } // Upgrade this minipool to the latest network delegate contract -func (mp *Minipool_v3) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -404,12 +421,12 @@ func (mp *Minipool_v3) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, er } // Estimate the gas of DelegateRollback -func (mp *Minipool_v3) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateRollback") } // Rollback to previous delegate contract -func (mp *Minipool_v3) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -418,12 +435,12 @@ func (mp *Minipool_v3) DelegateRollback(opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of SetUseLatestDelegate -func (mp *Minipool_v3) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) } // If set to true, will automatically use the latest delegate contract -func (mp *Minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -432,7 +449,7 @@ func (mp *Minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpt } // Getter for useLatestDelegate setting -func (mp *Minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { +func (mp *minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -441,7 +458,7 @@ func (mp *Minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { } // Returns the address of the minipool's stored delegate -func (mp *Minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -450,7 +467,7 @@ func (mp *Minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) } // Returns the address of the minipool's previous delegate (or address(0) if not set) -func (mp *Minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -459,7 +476,7 @@ func (mp *Minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, } // Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting -func (mp *Minipool_v3) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { +func (mp *minipool_v3) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) @@ -468,12 +485,12 @@ func (mp *Minipool_v3) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address } // Estimate the gas required to reduce a minipool's bond -func (mp *Minipool_v3) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "reduceBondAmount") } // Reduce a minipool's bond -func (mp *Minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "reduceBondAmount") if err != nil { return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", mp.Address.Hex(), err) @@ -482,7 +499,7 @@ func (mp *Minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, e } // Given a validator balance, calculates how much belongs to the node taking into consideration rewards and penalties -func (mp *Minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool node portion: %w", err) @@ -491,7 +508,7 @@ func (mp *Minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) } // Given a validator balance, calculates how much belongs to rETH users taking into consideration rewards and penalties -func (mp *Minipool_v3) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { +func (mp *minipool_v3) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { return nil, fmt.Errorf("Could not get minipool user portion: %w", err) @@ -500,12 +517,12 @@ func (mp *Minipool_v3) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) } // Estimate the gas required to vote to scrub a minipool -func (mp *Minipool_v3) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "voteScrub") } // Vote to scrub a minipool -func (mp *Minipool_v3) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) @@ -514,12 +531,12 @@ func (mp *Minipool_v3) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { } // Estimate the gas required to promote a vacant minipool -func (mp *Minipool_v3) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *minipool_v3) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "promote") } // Promote a vacant minipool -func (mp *Minipool_v3) Promote(opts *bind.TransactOpts) (common.Hash, error) { +func (mp *minipool_v3) Promote(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "promote") if err != nil { return common.Hash{}, fmt.Errorf("Could not promote minipool %s: %w", mp.Address.Hex(), err) @@ -528,7 +545,7 @@ func (mp *Minipool_v3) Promote(opts *bind.TransactOpts) (common.Hash, error) { } // Get the data from this minipool's MinipoolPrestaked event -func (mp *Minipool_v3) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { +func (mp *minipool_v3) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) { addressFilter := []common.Address{mp.Address} topicFilter := [][]common.Hash{{mp.Contract.ABI.Events["MinipoolPrestaked"].ID}} From 4379921ccfc6aa99cf03c49f8c629cf749b9a211 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Dec 2022 03:19:53 -0500 Subject: [PATCH 536/878] Added distribute back to the generic minipool interface --- minipool/minipool-contract-v2.go | 2 -- minipool/minipool-interface.go | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index 043520d0d..bd49dcc82 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -20,8 +20,6 @@ import ( type MinipoolV2 interface { Minipool - EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) } diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go index d3dbf1a23..999c4b2df 100644 --- a/minipool/minipool-interface.go +++ b/minipool/minipool-interface.go @@ -75,6 +75,8 @@ type Minipool interface { GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Refund(opts *bind.TransactOpts) (common.Hash, error) + EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) From d1a464672d5a343565501377b0f659bb8f0e3593 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 20 Dec 2022 16:55:52 -0500 Subject: [PATCH 537/878] Fixed GetLogs() so it uses local vars instead of modifying the args directly --- utils/eth/logs.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/eth/logs.go b/utils/eth/logs.go index 783c8a397..3e2834fed 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -87,10 +87,10 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil // Set the start and end, clamping on the latest block intervalSize := big.NewInt(0).Sub(intervalSize, big.NewInt(1)) - start := fromBlock + start := big.NewInt(0).Set(fromBlock) end := big.NewInt(0).Add(start, intervalSize) if end.Cmp(toBlock) == 1 { - end = toBlock + end.Set(toBlock) } for { // Get the logs using the current interval @@ -117,7 +117,7 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil start.Add(end, big.NewInt(1)) end.Add(start, intervalSize) if end.Cmp(toBlock) == 1 { - end = toBlock + end.Set(toBlock) } } } From eea98bd3e185d606e053b736a892ddcfa04c0cd3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 11 Jan 2023 16:45:26 -0500 Subject: [PATCH 538/878] Added GetPreMigrationBalance --- minipool/minipool-contract-v3.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 29e3c7888..9747861a6 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -257,6 +257,13 @@ func (mp *minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { } return *isVacant, nil } +func (mp *minipool_v3) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) { + preMigrationBalance := new(*big.Int) + if err := mp.Contract.Call(opts, preMigrationBalance, "getPreMigrationBalance"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s pre-migration balance: %w", mp.Address.Hex(), err) + } + return *preMigrationBalance, nil +} // Get user deposit details func (mp *minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { From 06e332836c2b83f1a2dc22f79f203fc1ea46f739 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 11 Jan 2023 16:54:48 -0500 Subject: [PATCH 539/878] Added GetPreMigrationBalance to the v3 interface --- minipool/minipool-contract-v3.go | 1 + 1 file changed, 1 insertion(+) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 9747861a6..d53536d1e 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -24,6 +24,7 @@ type MinipoolV3 interface { ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Promote(opts *bind.TransactOpts) (common.Hash, error) + GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) } // Minipool contract From 479219bd5592f3a04af92ac469565dacc2885baf Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 12 Jan 2023 01:13:09 -0500 Subject: [PATCH 540/878] Added raw getters for the min and max minipool stake settings --- settings/protocol/node.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/settings/protocol/node.go b/settings/protocol/node.go index ebba596e4..21dbb2903 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -60,6 +60,19 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The minimum RPL stake per minipool as a fraction of assigned user ETH +func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + } + return *value, nil +} func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } @@ -76,6 +89,19 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The maximum RPL stake per minipool as a fraction of assigned user ETH +func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + } + return *value, nil +} func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } From ea169f1eb8b602d497245674681c61e9233b0a54 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 12 Jan 2023 01:13:09 -0500 Subject: [PATCH 541/878] Added raw getters for the min and max minipool stake settings --- settings/protocol/node.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/settings/protocol/node.go b/settings/protocol/node.go index ebba596e4..21dbb2903 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -60,6 +60,19 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The minimum RPL stake per minipool as a fraction of assigned user ETH +func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + } + return *value, nil +} func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) } @@ -76,6 +89,19 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The maximum RPL stake per minipool as a fraction of assigned user ETH +func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { + return nil, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + } + return *value, nil +} func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) } From 22e2ebdcc955ee557054c35ea1e52c3bba3f7813 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 15 Jan 2023 15:45:40 -0500 Subject: [PATCH 542/878] Added the promotion scrub period variable --- settings/trustednode/minipool.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 26653079c..2ebe2d01e 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -16,6 +16,7 @@ import ( const ( MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" ScrubPeriodPath = "minipool.scrub.period" + PromotionScrubPeriodPath = "minipool.promotion.scrub.period" ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" BondReductionWindowStartPath = "minipool.bond.reduction.window.start" BondReductionWindowLengthPath = "minipool.bond.reduction.window.length" @@ -43,6 +44,28 @@ func EstimateProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) } +// The amount of time, in seconds, the promotion scrub check lasts before a vacant minipool can be promoted +func GetPromotionScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getPromotionScrubPeriod"); err != nil { + return 0, fmt.Errorf("Could not get promotion scrub period: %w", err) + } + return (*value).Uint64(), nil +} +func BootstrapPromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { + return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) +} +func ProposePromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", PromotionScrubPeriodPath), MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) +} +func EstimatePromotionProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", PromotionScrubPeriodPath), MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) +} + // Whether or not the RPL slashing penalty is applied to scrubbed minipools func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) From eb9ffb481e6f816e29ab018ca78863f2979543a6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 15 Jan 2023 16:40:30 -0500 Subject: [PATCH 543/878] Fixed a typo --- settings/trustednode/minipool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 2ebe2d01e..ae2822352 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -62,7 +62,7 @@ func BootstrapPromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts func ProposePromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", PromotionScrubPeriodPath), MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) } -func EstimatePromotionProposeScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposePromotionScrubPeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", PromotionScrubPeriodPath), MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) } From e4cde631ad93160eecf851abec9bf3af93c03796 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 20 Jan 2023 01:04:56 -0500 Subject: [PATCH 544/878] Added GetUserDistributed --- minipool/minipool-contract-v3.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index d53536d1e..82343580c 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -25,6 +25,7 @@ type MinipoolV3 interface { EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) + GetUserDistributed(opts *bind.CallOpts) (bool, error) } // Minipool contract @@ -341,15 +342,21 @@ func (mp *minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Check if the minipool's balance has already been distributed +func (mp *minipool_v3) GetUserDistributed(opts *bind.CallOpts) (bool, error) { + distributed := new(bool) + if err := mp.Contract.Call(opts, distributed, "getUserDistributed"); err != nil { + return false, fmt.Errorf("Could not get user distributed status for minipool %s: %w", mp.Address.Hex(), err) + } + return *distributed, nil +} + // Estimate the gas of DistributeBalance func (mp *minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") } // Distribute the minipool's ETH balance to the node operator and rETH staking pool. -// !!! WARNING !!! -// DO NOT CALL THIS until the minipool's validator has exited from the Beacon Chain -// and the balance has been deposited into the minipool! func (mp *minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { From 1556ad5f688ac2fd5af3b2a69de0b887fe619465 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 1 Feb 2023 01:20:09 -0500 Subject: [PATCH 545/878] Added the native aggregator views --- minipool/minipool.go | 112 +++++++++++++++++++++++++++++++++++++++++-- node/node.go | 92 ++++++++++++++++++++++++++--------- 2 files changed, 178 insertions(+), 26 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 69a336dd8..1282ce91e 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -16,9 +16,10 @@ import ( // Settings const ( - MinipoolPrelaunchBatchSize = 250 - MinipoolAddressBatchSize = 50 - MinipoolDetailsBatchSize = 20 + MinipoolPrelaunchBatchSize = 250 + MinipoolAddressBatchSize = 50 + MinipoolDetailsBatchSize = 20 + NativeMinipoolDetailsBatchSize = 1000 ) // Minipool details @@ -37,6 +38,32 @@ type MinipoolCountsPerStatus struct { Dissolved *big.Int `abi:"dissolvedCount"` } +// Minipool details from the native getMinipoolDetails() function +type NativeMinipolDetails struct { + Exists bool `abi:"exists"` + MinipoolAddress common.Address `abi:"minipoolAddress"` + Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` + Status rptypes.MinipoolStatus `abi:"status"` + StatusBlock *big.Int `abi:"statusBlock"` + StatusTime *big.Int `abi:"statusTime"` + Finalised bool `abi:"finalised"` + DepositType rptypes.MinipoolDeposit `abi:"depositType"` + NodeFee *big.Int `abi:"nodeFee"` + NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` + NodeDepositAssigned bool `abi:"nodeDepositAssigned"` + UserDepositBalance *big.Int `abi:"userDepositBalance"` + UserDepositAssigned bool `abi:"userDepositAssigned"` + UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` + UseLatestDelegate bool `abi:"useLatestDelegate"` + Delegate common.Address `abi:"delegate"` + PreviousDelegate common.Address `abi:"previousDelegate"` + EffectiveDelegate common.Address `abi:"effectiveDelegate"` + PenaltyCount *big.Int `abi:"penaltyCount"` + PenaltyRate *big.Int `abi:"penaltyRate"` + UserDistributed bool `abi:"userDistributed"` + Slashed bool `abi:"slashed"` +} + // Get all minipool details func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { minipoolAddresses, err := GetMinipoolAddresses(rp, opts) @@ -55,6 +82,85 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return loadMinipoolDetails(rp, minipoolAddresses, opts) } +// Get the details for a minipool +func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (NativeMinipolDetails, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return NativeMinipolDetails{}, err + } + details := new(NativeMinipolDetails) + if err := rocketMinipoolManager.Call(opts, details, "getMinipoolDetails", minipoolAddress); err != nil { + return NativeMinipolDetails{}, fmt.Errorf("Could not get minipool %s details: %w", minipoolAddress.Hex(), err) + } + return *details, nil +} + +// Get the details for all of the minipools on a node +func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]NativeMinipolDetails, error) { + // Get the minipool count + minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return nil, err + } + totalDetails := make([]NativeMinipolDetails, 0, minipoolCount) + + // Get the contract + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return nil, err + } + + // Get all of the minipools + index := uint64(0) + limit := big.NewInt(int64(NativeMinipoolDetailsBatchSize)) + for index < minipoolCount { + offset := big.NewInt(int64(index)) + + details := new([]NativeMinipolDetails) + if err := rocketMinipoolManager.Call(opts, details, "getNodeMinipoolDetails", nodeAddress, offset, limit); err != nil { + return nil, fmt.Errorf("could not get minipool details for node %s from range %d to %d: %w", nodeAddress.Hex(), index, index+NativeMinipoolDetailsBatchSize, err) + } + + totalDetails = append(totalDetails, *details...) + index += NativeMinipoolDetailsBatchSize + } + + return totalDetails, nil +} + +// Get the details for all of the minipools +func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeMinipolDetails, error) { + // Get the minipool count + minipoolCount, err := GetMinipoolCount(rp, opts) + if err != nil { + return nil, err + } + totalDetails := make([]NativeMinipolDetails, 0, minipoolCount) + + // Get the contract + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return nil, err + } + + // Get all of the minipools + index := uint64(0) + limit := big.NewInt(int64(NativeMinipoolDetailsBatchSize)) + for index < minipoolCount { + offset := big.NewInt(int64(index)) + + details := new([]NativeMinipolDetails) + if err := rocketMinipoolManager.Call(opts, details, "getAllMinipoolDetails", offset, limit); err != nil { + return nil, fmt.Errorf("could not get minipool details from range %d to %d: %w", index, index+NativeMinipoolDetailsBatchSize, err) + } + + totalDetails = append(totalDetails, *details...) + index += NativeMinipoolDetailsBatchSize + } + + return totalDetails, nil +} + // Load minipool details func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { diff --git a/node/node.go b/node/node.go index 844c1dee0..281afbfb8 100644 --- a/node/node.go +++ b/node/node.go @@ -27,6 +27,7 @@ const ( NodeAddressBatchSize = 50 NodeDetailsBatchSize = 20 SmoothingPoolCountBatchSize uint64 = 2000 + NativeNodeDetailsBatchSize = 10000 ) // Node details @@ -39,27 +40,31 @@ type NodeDetails struct { } // Node details -type nodeDetails_Native struct { - exists bool - registrationTime *big.Int - timezoneLocation string - feeDistributorInitialised bool - feeDistributorAddress common.Address - rewardNetwork *big.Int - rplStake *big.Int - effectiveRPLStake *big.Int - minimumRPLStake *big.Int - maximumRPLStake *big.Int - minipoolLimit *big.Int - minipoolCount *big.Int - balanceETH *big.Int - balanceRETH *big.Int - balanceRPL *big.Int - balanceOldRPL *big.Int - withdrawalAddress common.Address - pendingWithdrawalAddress common.Address - smoothingPoolRegistrationState bool - smoothingPoolRegistrationChanged *big.Int +type NativeNodeDetails struct { + Exists bool `abi:"exists"` + RegistrationTime *big.Int `abi:"registrationTime"` + TimezoneLocation string `abi:"timezoneLocation"` + FeeDistributorInitialised bool `abi:"feeDistributorInitialised"` + FeeDistributorAddress common.Address `abi:"feeDistributorAddress"` + RewardNetwork *big.Int `abi:"rewardNetwork"` + RplStake *big.Int `abi:"rplStake"` + EffectiveRPLStake *big.Int `abi:"effectiveRPLStake"` + MinimumRPLStake *big.Int `abi:"minimumRPLStake"` + MaximumRPLStake *big.Int `abi:"maximumRPLStake"` + EthMatched *big.Int `abi:"ethMatched"` + EthMatchedLimit *big.Int `abi:"ethMatchedLimit"` + MinipoolCount *big.Int `abi:"minipoolCount"` + BalanceETH *big.Int `abi:"balanceETH"` + BalanceRETH *big.Int `abi:"balanceRETH"` + BalanceRPL *big.Int `abi:"balanceRPL"` + BalanceOldRPL *big.Int `abi:"balanceOldRPL"` + DepositCreditBalance *big.Int `abi:"depositCreditBalance"` + DistributorBalanceUserETH *big.Int `abi:"distributorBalanceUserETH"` + DistributorBalanceNodeETH *big.Int `abi:"distributorBalanceNodeETH"` + WithdrawalAddress common.Address `abi:"withdrawalAddress"` + PendingWithdrawalAddress common.Address `abi:"pendingWithdrawalAddress"` + SmoothingPoolRegistrationState bool `abi:"smoothingPoolRegistrationState"` + SmoothingPoolRegistrationChanged *big.Int `abi:"smoothingPoolRegistrationChanged"` } // Count of nodes belonging to a timezone @@ -89,9 +94,50 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } // Get the details for a node -/*func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) { +func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NativeNodeDetails, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return NativeNodeDetails{}, err + } + details := new(NativeNodeDetails) + if err := rocketNodeManager.Call(opts, details, "getNodeDetails", nodeAddress); err != nil { + return NativeNodeDetails{}, fmt.Errorf("could not get details for node %s: %w", nodeAddress.Hex(), err) + } + return *details, nil +} + +// Get the details for every node in the network +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { + // Get node count + nodeCount, err := GetNodeCount(rp, opts) + if err != nil { + return nil, err + } + totalDetails := make([]NativeNodeDetails, 0, nodeCount) -}*/ + // Get the contract + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return nil, err + } + + // Get all of the nodes + index := uint64(0) + limit := big.NewInt(int64(NativeNodeDetailsBatchSize)) + for index < nodeCount { + offset := big.NewInt(int64(index)) + + details := new([]NativeNodeDetails) + if err := rocketNodeManager.Call(opts, details, "getAllNodeDetails", offset, limit); err != nil { + return nil, fmt.Errorf("could not get details for node range %d to %d: %w", index, index+NativeNodeDetailsBatchSize, err) + } + + totalDetails = append(totalDetails, *details...) + index += NativeNodeDetailsBatchSize + } + + return totalDetails, nil +} // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { From 33d7fde1b8d455170ff84f9719b01b7c0f0b49ef Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 1 Feb 2023 01:54:34 -0500 Subject: [PATCH 546/878] Fixed a typo --- minipool/minipool.go | 22 +++++++++++----------- node/node.go | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 1282ce91e..8a42088cf 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -39,7 +39,7 @@ type MinipoolCountsPerStatus struct { } // Minipool details from the native getMinipoolDetails() function -type NativeMinipolDetails struct { +type NativeMinipoolDetails struct { Exists bool `abi:"exists"` MinipoolAddress common.Address `abi:"minipoolAddress"` Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` @@ -83,26 +83,26 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opt } // Get the details for a minipool -func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (NativeMinipolDetails, error) { +func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (NativeMinipoolDetails, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) if err != nil { - return NativeMinipolDetails{}, err + return NativeMinipoolDetails{}, err } - details := new(NativeMinipolDetails) + details := new(NativeMinipoolDetails) if err := rocketMinipoolManager.Call(opts, details, "getMinipoolDetails", minipoolAddress); err != nil { - return NativeMinipolDetails{}, fmt.Errorf("Could not get minipool %s details: %w", minipoolAddress.Hex(), err) + return NativeMinipoolDetails{}, fmt.Errorf("Could not get minipool %s details: %w", minipoolAddress.Hex(), err) } return *details, nil } // Get the details for all of the minipools on a node -func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]NativeMinipolDetails, error) { +func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { // Get the minipool count minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) if err != nil { return nil, err } - totalDetails := make([]NativeMinipolDetails, 0, minipoolCount) + totalDetails := make([]NativeMinipoolDetails, 0, minipoolCount) // Get the contract rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) @@ -116,7 +116,7 @@ func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common. for index < minipoolCount { offset := big.NewInt(int64(index)) - details := new([]NativeMinipolDetails) + details := new([]NativeMinipoolDetails) if err := rocketMinipoolManager.Call(opts, details, "getNodeMinipoolDetails", nodeAddress, offset, limit); err != nil { return nil, fmt.Errorf("could not get minipool details for node %s from range %d to %d: %w", nodeAddress.Hex(), index, index+NativeMinipoolDetailsBatchSize, err) } @@ -129,13 +129,13 @@ func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common. } // Get the details for all of the minipools -func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeMinipolDetails, error) { +func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { // Get the minipool count minipoolCount, err := GetMinipoolCount(rp, opts) if err != nil { return nil, err } - totalDetails := make([]NativeMinipolDetails, 0, minipoolCount) + totalDetails := make([]NativeMinipoolDetails, 0, minipoolCount) // Get the contract rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) @@ -149,7 +149,7 @@ func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) for index < minipoolCount { offset := big.NewInt(int64(index)) - details := new([]NativeMinipolDetails) + details := new([]NativeMinipoolDetails) if err := rocketMinipoolManager.Call(opts, details, "getAllMinipoolDetails", offset, limit); err != nil { return nil, fmt.Errorf("could not get minipool details from range %d to %d: %w", index, index+NativeMinipoolDetailsBatchSize, err) } diff --git a/node/node.go b/node/node.go index 281afbfb8..b0fa46e1b 100644 --- a/node/node.go +++ b/node/node.go @@ -108,7 +108,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, // Get the details for every node in the network func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { - // Get node count + // Get the node count nodeCount, err := GetNodeCount(rp, opts) if err != nil { return nil, err From af239567398827ceb85caa231e4538bdb0fd9b65 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 1 Feb 2023 02:09:05 -0500 Subject: [PATCH 547/878] Added nodeAddress to NativeMinipoolDetails --- minipool/minipool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 8a42088cf..8504390f9 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -42,6 +42,7 @@ type MinipoolCountsPerStatus struct { type NativeMinipoolDetails struct { Exists bool `abi:"exists"` MinipoolAddress common.Address `abi:"minipoolAddress"` + NodeAddress common.Address `abi:"nodeAddress"` Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` Status rptypes.MinipoolStatus `abi:"status"` StatusBlock *big.Int `abi:"statusBlock"` From e442fcd2008309e094d74c0aef1be30aa9d06222 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 1 Feb 2023 21:43:24 -0500 Subject: [PATCH 548/878] Updated NodeDetails and MinipoolDetails --- minipool/minipool.go | 48 +++++++++++++++++++++++--------------------- node/node.go | 1 + 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 8504390f9..01b4ce5dd 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -40,29 +40,31 @@ type MinipoolCountsPerStatus struct { // Minipool details from the native getMinipoolDetails() function type NativeMinipoolDetails struct { - Exists bool `abi:"exists"` - MinipoolAddress common.Address `abi:"minipoolAddress"` - NodeAddress common.Address `abi:"nodeAddress"` - Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` - Status rptypes.MinipoolStatus `abi:"status"` - StatusBlock *big.Int `abi:"statusBlock"` - StatusTime *big.Int `abi:"statusTime"` - Finalised bool `abi:"finalised"` - DepositType rptypes.MinipoolDeposit `abi:"depositType"` - NodeFee *big.Int `abi:"nodeFee"` - NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` - NodeDepositAssigned bool `abi:"nodeDepositAssigned"` - UserDepositBalance *big.Int `abi:"userDepositBalance"` - UserDepositAssigned bool `abi:"userDepositAssigned"` - UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` - UseLatestDelegate bool `abi:"useLatestDelegate"` - Delegate common.Address `abi:"delegate"` - PreviousDelegate common.Address `abi:"previousDelegate"` - EffectiveDelegate common.Address `abi:"effectiveDelegate"` - PenaltyCount *big.Int `abi:"penaltyCount"` - PenaltyRate *big.Int `abi:"penaltyRate"` - UserDistributed bool `abi:"userDistributed"` - Slashed bool `abi:"slashed"` + Exists bool `abi:"exists"` + MinipoolAddress common.Address `abi:"minipoolAddress"` + Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` + Status rptypes.MinipoolStatus `abi:"status"` + StatusBlock *big.Int `abi:"statusBlock"` + StatusTime *big.Int `abi:"statusTime"` + Finalised bool `abi:"finalised"` + DepositType rptypes.MinipoolDeposit `abi:"depositType"` + NodeFee *big.Int `abi:"nodeFee"` + NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` + NodeDepositAssigned bool `abi:"nodeDepositAssigned"` + UserDepositBalance *big.Int `abi:"userDepositBalance"` + UserDepositAssigned bool `abi:"userDepositAssigned"` + UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` + UseLatestDelegate bool `abi:"useLatestDelegate"` + Delegate common.Address `abi:"delegate"` + PreviousDelegate common.Address `abi:"previousDelegate"` + EffectiveDelegate common.Address `abi:"effectiveDelegate"` + PenaltyCount *big.Int `abi:"penaltyCount"` + PenaltyRate *big.Int `abi:"penaltyRate"` + UserDistributed bool `abi:"userDistributed"` + Slashed bool `abi:"slashed"` + NodeAddress common.Address `abi:"nodeAddress"` + LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` + LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` } // Get all minipool details diff --git a/node/node.go b/node/node.go index b0fa46e1b..28e0bf729 100644 --- a/node/node.go +++ b/node/node.go @@ -65,6 +65,7 @@ type NativeNodeDetails struct { PendingWithdrawalAddress common.Address `abi:"pendingWithdrawalAddress"` SmoothingPoolRegistrationState bool `abi:"smoothingPoolRegistrationState"` SmoothingPoolRegistrationChanged *big.Int `abi:"smoothingPoolRegistrationChanged"` + NodeAddress common.Address `abi:"nodeAddress"` } // Count of nodes belonging to a timezone From b7e7effbd4b974b7b674b74e7e7d9074834e9a32 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 6 Feb 2023 19:12:07 -0500 Subject: [PATCH 549/878] Added missing functions to the bond reducer --- minipool/bond-reducer.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 3b46960c3..5e3f45c49 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -59,6 +59,32 @@ func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address return time.Unix((*reduceBondTime).Int64(), 0), nil } +// Gets the timestamp at which the bond was last reduced +func GetLastBondReductionTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (time.Time, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return time.Time{}, err + } + lastBondReductionTime := new(*big.Int) + if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionTime, "getLastBondReductionTime", minipoolAddress); err != nil { + return time.Time{}, fmt.Errorf("Could not get last bond reduction time for minipool %s: %w", minipoolAddress.Hex(), err) + } + return time.Unix((*lastBondReductionTime).Int64(), 0), nil +} + +// Gets the previous bond amount of the minipool prior to its last reduction +func GetLastBondReductionPrevValue(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return nil, err + } + lastBondReductionPrevValue := new(*big.Int) + if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionPrevValue, "getLastBondReductionPrevValue", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get last bond reduction previous value for minipool %s: %w", minipoolAddress.Hex(), err) + } + return *lastBondReductionPrevValue, nil +} + // Estimate the gas required to begin a minipool bond reduction func EstimateBeginReduceBondAmountGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, newBondAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) From dd6b472c9971a53c4e5ce53e3538ec93f5037456 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 6 Feb 2023 19:12:50 -0500 Subject: [PATCH 550/878] Hardcoded the rocketVersionInterface ABI so it doesn't have to rely on a deployment --- rocketpool/version-interface.go | 36 +++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/rocketpool/version-interface.go b/rocketpool/version-interface.go index b3eb51a3c..2f1d78e80 100644 --- a/rocketpool/version-interface.go +++ b/rocketpool/version-interface.go @@ -2,25 +2,53 @@ package rocketpool import ( "fmt" + "strings" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ) +const ( + rocketVersionInterfaceABI string = `[ + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + } + ]` +) + // Get the version of the given contract func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bind.CallOpts) (uint8, error) { // Get the version interface ABI - abi, err := rp.GetABI("rocketVersionInterface", opts) + /* + abi, err := rp.GetABI("rocketVersionInterface", opts) + if err != nil { + return 0, fmt.Errorf("error loading version interface ABI: %w", err) + } + */ + + // Parse ABI using the hardcoded string until the contract is deployed + abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceABI)) if err != nil { - return 0, fmt.Errorf("error loading version interface ABI: %w", err) + return 0, fmt.Errorf("Could not parse version interface JSON: %w", err) } // Create contract contract := &Contract{ - Contract: bind.NewBoundContract(contractAddress, *abi, rp.Client, rp.Client, rp.Client), + Contract: bind.NewBoundContract(contractAddress, abiParsed, rp.Client, rp.Client, rp.Client), Address: &contractAddress, - ABI: abi, + ABI: &abiParsed, Client: rp.Client, } From bc3cadb85629af539f6d61b0bb25ffa33ccc55a4 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 01:35:14 -0500 Subject: [PATCH 551/878] Added getters for bond reduction and vacant minipool enable status --- settings/protocol/minipool.go | 16 ++++++++++++++++ settings/protocol/node.go | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 491e7d012..63ba43354 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -132,6 +132,22 @@ func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Durati return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) } +// Minipool bond reductions currently enabled +func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := minipoolSettingsContract.Call(opts, value, "getBondReductionEnabled"); err != nil { + return false, fmt.Errorf("Could not get bond reduction enabled status: %w", err) + } + return *value, nil +} +func BootstrapBondReductionEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { + return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.bond.reduction.enabled", value, opts) +} + // Get contracts var minipoolSettingsContractLock sync.Mutex diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 21dbb2903..f86dc4226 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -48,6 +48,22 @@ func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bi return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) } +// Vacant minipools currently enabled +func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := nodeSettingsContract.Call(opts, value, "getVacantMinipoolsEnabled"); err != nil { + return false, fmt.Errorf("Could not get vacant minipools enabled status: %w", err) + } + return *value, nil +} +func BootstrapVacantMinipoolsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { + return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.vacant.minipools.enabled", value, opts) +} + // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { nodeSettingsContract, err := getNodeSettingsContract(rp, opts) From 0f3ae658d86461cd7a5d3cccafd92b0b29431c5b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 02:17:24 -0500 Subject: [PATCH 552/878] Moved GetMinipoolBytecode into the legacy v1.1.0 folder --- legacy/v1.1.0/minipool/factory.go | 37 ++++++++++++++++ legacy/v1.1.0/utils/address_generation.go | 6 +-- minipool/factory.go | 16 +++---- rocketpool/v1.1.0-manager.go | 11 +++-- utils/address_generation.go | 51 ----------------------- 5 files changed, 56 insertions(+), 65 deletions(-) create mode 100644 legacy/v1.1.0/minipool/factory.go diff --git a/legacy/v1.1.0/minipool/factory.go b/legacy/v1.1.0/minipool/factory.go new file mode 100644 index 000000000..5f6947a24 --- /dev/null +++ b/legacy/v1.1.0/minipool/factory.go @@ -0,0 +1,37 @@ +package minipool + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits +func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketMinipoolFactoryAddress *common.Address) ([]byte, error) { + rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, legacyRocketMinipoolFactoryAddress, opts) + if err != nil { + return []byte{}, err + } + bytecode := new([]byte) + if err := rocketMinipoolFactory.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { + return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + } + return *bytecode, nil +} + +// Get contracts +var rocketMinipoolFactoryLock sync.Mutex + +func getRocketMinipoolFactory(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMinipoolFactoryLock.Lock() + defer rocketMinipoolFactoryLock.Unlock() + if address == nil { + return rp.VersionManager.V1_1_0.GetContract("rocketMinipoolFactory", opts) + } else { + return rp.VersionManager.V1_1_0.GetContractWithAddress("rocketMinipoolFactory", *address) + } +} diff --git a/legacy/v1.1.0/utils/address_generation.go b/legacy/v1.1.0/utils/address_generation.go index 2d534a8bb..1faa9a472 100644 --- a/legacy/v1.1.0/utils/address_generation.go +++ b/legacy/v1.1.0/utils/address_generation.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/minipool" + v110_minipool "github.com/rocket-pool/rocketpool-go/legacy/v1.1.0/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" ) @@ -24,7 +24,7 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { // Precompute the address of a minipool based on the node wallet, deposit type, and unique salt // If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { +func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depositType rptypes.MinipoolDeposit, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts, legacyRocketMinipoolFactoryAddress *common.Address) (common.Address, error) { // Get dependencies rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) @@ -37,7 +37,7 @@ func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, depo } if len(minipoolBytecode) == 0 { - minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) + minipoolBytecode, err = v110_minipool.GetMinipoolBytecode(rp, nil, legacyRocketMinipoolFactoryAddress) if err != nil { return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) } diff --git a/minipool/factory.go b/minipool/factory.go index d7d1da3a8..5b80347ad 100644 --- a/minipool/factory.go +++ b/minipool/factory.go @@ -2,24 +2,26 @@ package minipool import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" ) -// Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits -func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]byte, error) { +// Get the address of a minipool based on the node address and a salt +func GetExpectedAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, salt *big.Int, opts *bind.CallOpts) (common.Address, error) { rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) if err != nil { - return []byte{}, err + return common.Address{}, err } - bytecode := new([]byte) - if err := rocketMinipoolFactory.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + address := new(common.Address) + if err := rocketMinipoolFactory.Call(opts, address, "getExpectedAddress", nodeAddress, salt); err != nil { + return common.Address{}, fmt.Errorf("Could not get minipool expected address: %w", err) } - return *bytecode, nil + return *address, nil } // Get contracts diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go index bf1233901..10d2a35bd 100644 --- a/rocketpool/v1.1.0-manager.go +++ b/rocketpool/v1.1.0-manager.go @@ -21,10 +21,11 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 rp: rp, rpVersion: rpVersion, contractNameMap: map[string]string{ - "rocketNetworkPrices": "rocketNetworkPrices.v1", - "rocketNodeStaking": "rocketNodeStaking.v2", - "rocketNodeDeposit": "rocketNodeDeposit.v2", - "rocketMinipoolQueue": "rocketMinipoolQueue.v1", + "rocketNetworkPrices": "rocketNetworkPrices.v1", + "rocketNodeStaking": "rocketNodeStaking.v2", + "rocketNodeDeposit": "rocketNodeDeposit.v2", + "rocketMinipoolQueue": "rocketMinipoolQueue.v1", + "rocketMinipoolFactory": "rocketMinipoolFactory.v1", }, abiMap: map[string]string{ "rocketNetworkPrices": "eJztVslu2zAQ/ZVCZx+0kKKYW1v0UMAFDKc9BUEwJIeBEJkSSMqNEeTfSyuKFSVektYpjKIHAzI5y3sz5ONc3EWlaVrvorOL9adHa6D6vmowOotkbbwF6T/Ma3mD/tzXFq7x69pIg8RoEhlYrA2v7FODj0pZdC5s+4c40C/cX04i58Hjt9aDKKvSr8KuqU0DKxAVDh4hs/O2lSFgWHTltQHf2uc795O7CIL7alG3gYCGyuFkzEfhLaroLHh0OyN6sMHZ09C2XmxBPXkSaJNjFKkN/1OaD5FEFQoyhHrc/51QtqlmtpR4nGioNUpfLnHeVOcebo4U1peLbZEuNwYdBXfeikXpfQi8scUlGv+sx/FtDimNmS6IykETolLgMqMUmE4wkyTniUhIHtNEIqdxIkjKVUEIE8BplsjsDUfjf0f/pKM/GgWv6SfqVOsiyVBLHn4sZzzN8lwSkJDmjAkWukshyUBrSYniwSOjShbIhWBZT6Hv3gBiidaVtQn56tbvkrE1+GJgNmZV7FClZYk/B0vdmlDjLlEnQBA49qIyJkqJVkTReBfga/QPhfvUn6cDuEc92d6Po2GPNZJYSLUH+3w2fTy6JwScpUQRiPke4F82t2Q2fbwlJ8SASlGknONbGPRX7wQPEtJcJIoVYzaHYV1BUOtOPXbLTmmkRXC4v6GvHjSecBpzELRQBVfZe3BQ+Hc4xDQNrSDxmznsfewO+B563Q64v+Y5GyrpuoHiQVGPfQAgTYjM5L9bvDAPyNb3OvIuNdSMKgYi3yVrpfkchASNa8eZX1AVdV1tk69u/ajalQW8NI7JHiWehlTOz7GprV8X4gQVGMLUlORhLru//AWSfqX7", @@ -34,6 +35,8 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 "rocketNodeDeposit": "eJytk11rwjAUhv/KyHWvHBvi3UAGu3AM3Z1IOU1PJdgkJTnpLOJ/X2pr084qm+yuad7znPd8ZH1gQhWOLJut609CoyD/rApkM8a1IgOcHpaa75BWpA1s8a0WZcCRRUyBrIWx6Qte0tSgtf6aGg60P46biFkCwoUjSEQuqPK3SqsCKkhyDBE+syXjuAeyY3Rg4EWV1M7bzCC3GA1dp7jHlM18xOlmUAR0blqzmdFyxFvUA3U5BiTnz5On50AC70hRYJ0F97BISBwhbTrBHAttBS2Royg9uNNiid5Ek7PtSYgq0VihlVdrR9fmXGebBitDG9MrYysFfgVl5hSnOtHAx2imQdmxFEpIJ991iq841oHoApJUhL15xiXkIgW/Kh8u2WEVGI3wL4SV2CogZ/C3kMdJD5M2I5oDwVJr+sHw0hHKZUcs5Fd36vZmx7gvkBOmC9/UQuv85ktsg1rTgw0ZHfjFI7175lffTXC1RWoX/kS5ub6onHw4lzzvyvmXbd58Aw32wtE=", "rocketMinipoolQueue": "eJztV0tv2zAM/iuDzzlIsiTLve3RQ4F1h663oigoicyMJXZmy1mDov99yqN1nGcPbZdDb45Ikd/3USKVm4ekKCdtaJKzm/lnwLqE0fVsgslZ4qoy1ODCp6vK/cbwM1Q1DPFi7kTgMBkkJYznjnf1usNn72tsmmgOyziwWni8HSRNgICXbQBbjIowi9ayKicwAzvCbkfM3IS6dTFgXGyKYQmhrTctj4OHBOL22bhqIwGCUYODPh+P9+iTs7hjYenRg2ecKxrjoiwmVTXagXxwLJidBWxS0QX702KLF76L9eTRi/WMuResjb+F0l2wUIzX1Hkyz/VcOVyuoH/DRd61tDjFMmyIyO5d5nOPDNB545URuc+1J2+FcEJbqYXyEL8Vy41TKkNjWSpBGcYVcZPDh/bb2p+XL9PeWsaMQnJpxo3NgIRgkjwnTh4MUu5TsgCSkSGXkbRMAubM61ygJPeh/Q7tr3BcTV8gvfZakjAkuXUamdaWyEqpSFvHyIs0t4Kj45Rl3KFUnMALneo0syitXJFYCd3BmGLdFFUZ81Vt2NdO5/BNx63Py+zpjtMC/3ae1JYuLBMtGiFEjqu69ImqeKCkV2wf4CGG6yrA6DuWw/DrOO5eVXZX5NWwi9TmiG4D+xYsLNvxp67vTaqmCGsjyS9XFs47lO50OEUJcsyy2AzoWPm+wgTcPNNJoZdSOG4oPYD+nAhjsCmeJgPUzEpmD+n/A+/DaYJXXHORMnUEfHdlDmA/fMm2Ltbgv5PXYISMo/Ptmsc2x62BendgonZ1wOV74bLz7Qrx4pfymjAbo06gIszte3RRjz0mX2YvOlt73yGv8AdirywmdlbDxN6bvUHlBBl4w5E5Z96jsPXiWfVGJ9Qjt96ZWIrbf2ct65Y=", + + "rocketMinipoolFactory": "placeholder", }, } } diff --git a/utils/address_generation.go b/utils/address_generation.go index 7b1315a0c..5720b7880 100644 --- a/utils/address_generation.go +++ b/utils/address_generation.go @@ -1,15 +1,10 @@ package utils import ( - "fmt" "math/big" - "sync" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Combine a node's address and a salt to retreive a new salt compatible with depositing @@ -20,49 +15,3 @@ func GetNodeSalt(nodeAddress common.Address, salt *big.Int) common.Hash { saltHash := crypto.Keccak256Hash(nodeAddress.Bytes(), saltBytes[:]) return saltHash } - -// Precompute the address of a minipool based on the node wallet, deposit type, and unique salt -// If you set minipoolBytecode to nil, this will retrieve it from the contracts using minipool.GetMinipoolBytecode(). -func GenerateAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, salt *big.Int, minipoolBytecode []byte, opts *bind.CallOpts) (common.Address, error) { - - // Get dependencies - rocketMinipoolFactory, err := getRocketMinipoolFactory(rp, opts) - if err != nil { - return common.Address{}, err - } - minipoolAbi, err := rp.GetABI("rocketMinipool", opts) - if err != nil { - return common.Address{}, err - } - - if len(minipoolBytecode) == 0 { - minipoolBytecode, err = minipool.GetMinipoolBytecode(rp, nil) - if err != nil { - return common.Address{}, fmt.Errorf("Error getting minipool bytecode: %w", err) - } - } - - // Create the hash of the minipool constructor call - packedConstructorArgs, err := minipoolAbi.Pack("", rp.RocketStorageContract.Address) - if err != nil { - return common.Address{}, fmt.Errorf("Error creating minipool constructor args: %w", err) - } - - // Get the node salt and initialization data - nodeSalt := GetNodeSalt(nodeAddress, salt) - initData := append(minipoolBytecode, packedConstructorArgs...) - initHash := crypto.Keccak256(initData) - - address := crypto.CreateAddress2(*rocketMinipoolFactory.Address, nodeSalt, initHash) - return address, nil - -} - -// Get contracts -var rocketMinipoolFactoryLock sync.Mutex - -func getRocketMinipoolFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketMinipoolFactoryLock.Lock() - defer rocketMinipoolFactoryLock.Unlock() - return rp.GetContract("rocketMinipoolFactory", opts) -} From fe09eb14540afc9c5b4914a03ce3c0c1a76d7a5b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 02:20:32 -0500 Subject: [PATCH 553/878] Added the old minipool factory ABI --- rocketpool/v1.1.0-manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpool/v1.1.0-manager.go b/rocketpool/v1.1.0-manager.go index 10d2a35bd..162484d8d 100644 --- a/rocketpool/v1.1.0-manager.go +++ b/rocketpool/v1.1.0-manager.go @@ -36,7 +36,7 @@ func newLegacyVersionWrapper_v1_1_0(rp *RocketPool) *LegacyVersionWrapper_v1_1_0 "rocketMinipoolQueue": "eJztV0tv2zAM/iuDzzlIsiTLve3RQ4F1h663oigoicyMJXZmy1mDov99yqN1nGcPbZdDb45Ikd/3USKVm4ekKCdtaJKzm/lnwLqE0fVsgslZ4qoy1ODCp6vK/cbwM1Q1DPFi7kTgMBkkJYznjnf1usNn72tsmmgOyziwWni8HSRNgICXbQBbjIowi9ayKicwAzvCbkfM3IS6dTFgXGyKYQmhrTctj4OHBOL22bhqIwGCUYODPh+P9+iTs7hjYenRg2ecKxrjoiwmVTXagXxwLJidBWxS0QX702KLF76L9eTRi/WMuResjb+F0l2wUIzX1Hkyz/VcOVyuoH/DRd61tDjFMmyIyO5d5nOPDNB545URuc+1J2+FcEJbqYXyEL8Vy41TKkNjWSpBGcYVcZPDh/bb2p+XL9PeWsaMQnJpxo3NgIRgkjwnTh4MUu5TsgCSkSGXkbRMAubM61ygJPeh/Q7tr3BcTV8gvfZakjAkuXUamdaWyEqpSFvHyIs0t4Kj45Rl3KFUnMALneo0syitXJFYCd3BmGLdFFUZ81Vt2NdO5/BNx63Py+zpjtMC/3ae1JYuLBMtGiFEjqu69ImqeKCkV2wf4CGG6yrA6DuWw/DrOO5eVXZX5NWwi9TmiG4D+xYsLNvxp67vTaqmCGsjyS9XFs47lO50OEUJcsyy2AzoWPm+wgTcPNNJoZdSOG4oPYD+nAhjsCmeJgPUzEpmD+n/A+/DaYJXXHORMnUEfHdlDmA/fMm2Ltbgv5PXYISMo/Ptmsc2x62BendgonZ1wOV74bLz7Qrx4pfymjAbo06gIszte3RRjz0mX2YvOlt73yGv8AdirywmdlbDxN6bvUHlBBl4w5E5Z96jsPXiWfVGJ9Qjt96ZWIrbf2ct65Y=", - "rocketMinipoolFactory": "placeholder", + "rocketMinipoolFactory": "eNqlkU9LAzEQxb9KyXlPgiK9+efioRf1VkqZzU5LMJ0JyaQlSL+7ibtttxgWxVvIe/Pml5flpzLkogQ1X5ajoCew78mhmivNJB60zF5Zf6C8CXvY4ksxbUCjahTBrhjXfmx46DqPIWRZ+hwYLo6rRgUBwUUUaI01krJKTA4StBYvE3lzEB91DlTHZooRzstOLMTdBELzIwEp7mYLQ8Yx22d0HIyM4rr+5tt8jos5474WVoSb27vRfAAr14NFL1UMjrzAcnoaus5WjvLr1/6n5E0kLYbpuuEL2BblVMtjEtS512m6NruqbL1QJ3PR/4Fpjz4UeZKj/50Kx/BtVY69wUONY/UF4uEWyg==", }, } } From 57b6919c7be5d759c7929bb2d033746270856ee2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 22:43:47 -0500 Subject: [PATCH 554/878] Updated NativeMinipoolDetails, removed GetTotalEffectiveRPLStake --- minipool/minipool.go | 2 ++ node/staking.go | 13 ------------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 01b4ce5dd..1899a9af8 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -65,6 +65,8 @@ type NativeMinipoolDetails struct { NodeAddress common.Address `abi:"nodeAddress"` LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` + IsVacant bool `abi:"vacant"` + Version uint8 `abi:"delegateVersion"` } // Get all minipool details diff --git a/node/staking.go b/node/staking.go index bf471a2a5..9eecc07b3 100644 --- a/node/staking.go +++ b/node/staking.go @@ -33,19 +33,6 @@ func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, return *totalRplStake, nil } -// Get the effective RPL staked in the network -func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp, opts) - if err != nil { - return nil, err - } - totalEffectiveRplStake := new(*big.Int) - if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) - } - return *totalEffectiveRplStake, nil -} - // Get a node's RPL stake func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, opts) From a2b487f4fe72acafad2b4ba5b90225cbbc7dba63 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 22:52:35 -0500 Subject: [PATCH 555/878] Added CalculateNodeRewards to minipool v3 --- minipool/minipool-contract-v3.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 82343580c..88054b725 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -26,6 +26,7 @@ type MinipoolV3 interface { Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) + CalculateNodeRewards(opts *bind.CallOpts) (*big.Int, error) } // Minipool contract @@ -266,6 +267,13 @@ func (mp *minipool_v3) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, er } return *preMigrationBalance, nil } +func (mp *minipool_v3) CalculateNodeRewards(opts *bind.CallOpts) (*big.Int, error) { + rewards := new(*big.Int) + if err := mp.Contract.Call(opts, rewards, "calculateNodeRewards"); err != nil { + return nil, fmt.Errorf("Could not get minipool %s node rewards: %w", mp.Address.Hex(), err) + } + return *rewards, nil +} // Get user deposit details func (mp *minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { From 52256c0c83b49b379c1cd33565c8b4d59c77f063 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 23:04:01 -0500 Subject: [PATCH 556/878] Changed the version checker for Atlas --- utils/version-checker.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/version-checker.go b/utils/version-checker.go index 548945dec..58d07223a 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -15,7 +15,7 @@ func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { if err != nil { return nil, fmt.Errorf("error checking node staking version: %w", err) } - if nodeStakingVersion == 3 { + if nodeStakingVersion > 3 { return version.NewSemver("1.2.0") } @@ -24,7 +24,7 @@ func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { if err != nil { return nil, fmt.Errorf("error checking node manager version: %w", err) } - if nodeMgrVersion == 2 { + if nodeMgrVersion > 1 { return version.NewSemver("1.1.0") } From c5fe2e1c4f0c3b366a6b0e402075d90ca4fd93c0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 23:37:32 -0500 Subject: [PATCH 557/878] Added the ABI for minipool v2 --- minipool/minipool-constructor.go | 32 +++++++++++++++++++++++++++++++- minipool/minipool-contract-v2.go | 8 ++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index 8677b65cf..a04102ace 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -9,6 +9,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) +// Create a minipool binding func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { // Get the contract version @@ -19,7 +20,7 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C switch version { case 1, 2: - return newMinipool_v2(rp, address, opts) + return newMinipool_v2(rp, address) case 3: return newMinipool_v3(rp, address, opts) default: @@ -27,6 +28,35 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } } +// Create a minipool binding from its native details +func NewMinipoolFromDetails(rp *rocketpool.RocketPool, mpd NativeMinipoolDetails, opts *bind.CallOpts) (Minipool, error) { + switch mpd.Version { + case 1, 2: + return newMinipool_v2(rp, mpd.MinipoolAddress) + case 3: + return newMinipool_v3(rp, mpd.MinipoolAddress, opts) + default: + return nil, fmt.Errorf("unexpected minipool contract version [%d]", mpd.Version) + } +} + +// Create a minipool contract directly from its ABI - used for legacy minipools +func createMinipoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { + // Decode ABI + abi, err := rocketpool.DecodeAbi(encodedAbi) + if err != nil { + return nil, fmt.Errorf("Could not decode minipool %s ABI: %w", address, err) + } + + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} + // Get a minipool contract var rocketMinipoolLock sync.Mutex diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index bd49dcc82..1436064a2 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -18,6 +18,10 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +const ( + minipoolV2ABI string = "eJzdWd1v2jAQ/1cqnvvUaVPVt3ZdpUnrVEG7PVQVcpIDLIyN7HMYqva/7xwgHyRAKHGT7qkNXO5+97vzfZjn1x6TSi5nypre1YgJA+c9LucW6fH5lf6N4A9EvSvUNvkGQUsmHpdz6F31WBRpMKZ33pNs5j4YaTWjJyx+/fc8pyi1UdBk6fni85dMEyNEEjNdG4G36EJOf8qaXlKBbzgBfQtzZTiS3lQUYiAMzmSTJJFsaAt2TiFKqgiuGyTLGtBN6kOFTNwwwWRYFQRv4fzNcRJptmDiQauQ2PUfWFQfNfc3ZMm3U1SNJ1gi5BiKmeARQ6UfbDCFZWZtJVfDwV0KB3wsGVoNb9X56SLTGq1KwS1D1lcKt1SS5DtHdcvpRZraXzVEFCZOb73B7+OT5Z5LPleKjhQYZNNTjlTTkAahtkHg/5DPYBaAbuagH3QuceqXar4pOVuXGRAKJlpThHLpyaXE1NOcTm21V6kP2TsxaMOVK07KYs7DfS6VnCF1zk24t8gCLjgunWYOi0xyZGWIztAOHGPAwYapPUhA2tlZmpebF/ziuuNkn6+a3B5oASGqwpJ83ihFN0KF08MRKyRPdeI0BulxlZttISpZK9WW4c7iUvQmXxVaDvZ6ak4s1j8U67e8n4qfbjhOWd6DrhSK6hg0BOkO2szDEpx1NLIhvTPI+kCCUQeBrSm7Nobmzi6cwyeTbrAdoyuHrJN0bUC13B0K8B7d0pyW+QO1q+2mJQtFtnIsPqITDKNCRyl1hbUYve7WHpp4CuRU+klj8pwtWSDgaG+3Nq9hrQW2noYDG+v+DXV4eEXNuJJZwTpMVk2mMu02O0oetOukAzQZ40y3EcxM/KgercdxP9pDJgdu/W6ljnYxw02JjeaSBDC9Sly96MFIxA1qHliEdfO+ltGd1xQqWfRaRkstahjsvBHOp7kIrSAYbuIaTJju1PZ2ok9uAmnbp0I6GCViX/VKKF95HNN8lAxKXvM3VBI1C/Gsr8Kpu05Qmo3huxMasSTimxzQeYFjpqK256p6fBERVDdsSP6dfNdb8liJ6BYEjAnILoePUyhhcZLC4283N+b6SgigxTW5Amv0hvx/Zu1pPtYs8n+H/5F/pu5DCDyu5qjOvM2ECFxa1pTXK3M7+0Yxcp5mldyhCtjWrXLjG19hah7S+Idcjium52w+pFb+gxAYzB0bDzSMD1lq6QK4DpL3u1990BBzKhNdw/VtNAKSiaElYC//AGQZTdM=" +) + type MinipoolV2 interface { Minipool EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) @@ -33,10 +37,10 @@ type minipool_v2 struct { } // Create new minipool contract -func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { +func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address) (Minipool, error) { // Get contract - contract, err := getMinipoolContract(rp, address, opts) + contract, err := createMinipoolContractFromAbi(rp, address, minipoolV2ABI) if err != nil { return nil, err } From 23a9548be382ad745faeed60902765da9b8aab13 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 9 Feb 2023 23:43:01 -0500 Subject: [PATCH 558/878] Removed CalculateNodeRewards from v3, added it to the minipool details struct --- minipool/minipool-contract-v3.go | 8 -------- minipool/minipool.go | 2 ++ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 88054b725..82343580c 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -26,7 +26,6 @@ type MinipoolV3 interface { Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) - CalculateNodeRewards(opts *bind.CallOpts) (*big.Int, error) } // Minipool contract @@ -267,13 +266,6 @@ func (mp *minipool_v3) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, er } return *preMigrationBalance, nil } -func (mp *minipool_v3) CalculateNodeRewards(opts *bind.CallOpts) (*big.Int, error) { - rewards := new(*big.Int) - if err := mp.Contract.Call(opts, rewards, "calculateNodeRewards"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node rewards: %w", mp.Address.Hex(), err) - } - return *rewards, nil -} // Get user deposit details func (mp *minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) { diff --git a/minipool/minipool.go b/minipool/minipool.go index 1899a9af8..0192155f1 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -67,6 +67,8 @@ type NativeMinipoolDetails struct { LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` IsVacant bool `abi:"vacant"` Version uint8 `abi:"delegateVersion"` + Balance *big.Int `abi:"balance"` // Contract balance + NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) } // Get all minipool details From 93a975b60a69a31d1f79a1da74b3015d352f52c0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 00:15:30 -0500 Subject: [PATCH 559/878] Fixed ABI deserialization for NativeMinipoolDetails --- minipool/minipool.go | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index 0192155f1..d78f43851 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -43,11 +43,11 @@ type NativeMinipoolDetails struct { Exists bool `abi:"exists"` MinipoolAddress common.Address `abi:"minipoolAddress"` Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` - Status rptypes.MinipoolStatus `abi:"status"` + StatusRaw uint8 `abi:"status"` StatusBlock *big.Int `abi:"statusBlock"` StatusTime *big.Int `abi:"statusTime"` Finalised bool `abi:"finalised"` - DepositType rptypes.MinipoolDeposit `abi:"depositType"` + DepositTypeRaw uint8 `abi:"depositType"` NodeFee *big.Int `abi:"nodeFee"` NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` NodeDepositAssigned bool `abi:"nodeDepositAssigned"` @@ -69,6 +69,16 @@ type NativeMinipoolDetails struct { Version uint8 `abi:"delegateVersion"` Balance *big.Int `abi:"balance"` // Contract balance NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) + ReduceBondTime *big.Int `abi:"reduceBondTime"` + ReduceBondCancelled bool `abi:"reduceBondCancelled"` + ReduceBondValue *big.Int `abi:"reduceBondValue"` + WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + Status rptypes.MinipoolStatus + DepositType rptypes.MinipoolDeposit +} + +type nmdWrapper struct { + Details NativeMinipoolDetails } // Get all minipool details @@ -95,11 +105,14 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common. if err != nil { return NativeMinipoolDetails{}, err } - details := new(NativeMinipoolDetails) - if err := rocketMinipoolManager.Call(opts, details, "getMinipoolDetails", minipoolAddress); err != nil { + detailsWrapper := new(nmdWrapper) + if err := rocketMinipoolManager.Call(opts, detailsWrapper, "getMinipoolDetails", minipoolAddress); err != nil { return NativeMinipoolDetails{}, fmt.Errorf("Could not get minipool %s details: %w", minipoolAddress.Hex(), err) } - return *details, nil + details := (*detailsWrapper).Details + details.Status = rptypes.MinipoolStatus(details.StatusRaw) + details.DepositType = rptypes.MinipoolDeposit(details.DepositTypeRaw) + return details, nil } // Get the details for all of the minipools on a node @@ -132,6 +145,11 @@ func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common. index += NativeMinipoolDetailsBatchSize } + for _, mpd := range totalDetails { + mpd.Status = rptypes.MinipoolStatus(mpd.StatusRaw) + mpd.DepositType = rptypes.MinipoolDeposit(mpd.DepositTypeRaw) + } + return totalDetails, nil } @@ -165,6 +183,11 @@ func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) index += NativeMinipoolDetailsBatchSize } + for _, mpd := range totalDetails { + mpd.Status = rptypes.MinipoolStatus(mpd.StatusRaw) + mpd.DepositType = rptypes.MinipoolDeposit(mpd.DepositTypeRaw) + } + return totalDetails, nil } From 41bcfdc6872cfdd923a5a12325b44bc8129db06b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 01:09:25 -0500 Subject: [PATCH 560/878] Fixed deserializing NativeNodeDetails --- node/node.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/node/node.go b/node/node.go index 28e0bf729..9f4d950c6 100644 --- a/node/node.go +++ b/node/node.go @@ -68,6 +68,10 @@ type NativeNodeDetails struct { NodeAddress common.Address `abi:"nodeAddress"` } +type nndWrapper struct { + Details NativeNodeDetails +} + // Count of nodes belonging to a timezone type TimezoneCount struct { Timezone string `abi:"timezone"` @@ -100,11 +104,11 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, if err != nil { return NativeNodeDetails{}, err } - details := new(NativeNodeDetails) - if err := rocketNodeManager.Call(opts, details, "getNodeDetails", nodeAddress); err != nil { + detailsWrapper := new(nndWrapper) + if err := rocketNodeManager.Call(opts, detailsWrapper, "getNodeDetails", nodeAddress); err != nil { return NativeNodeDetails{}, fmt.Errorf("could not get details for node %s: %w", nodeAddress.Hex(), err) } - return *details, nil + return (*detailsWrapper).Details, nil } // Get the details for every node in the network From 08b685a19818127f9b1ad30baa2e2e8639136769 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 04:35:21 -0500 Subject: [PATCH 561/878] Added some raw getters --- minipool/minipool.go | 13 +++++++++++++ node/node.go | 45 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/minipool/minipool.go b/minipool/minipool.go index d78f43851..304c7003d 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -545,6 +545,19 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, return (*minipoolCount).Uint64(), nil } +// Get a node's minipool count +func GetNodeMinipoolCountRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return nil, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + } + return *minipoolCount, nil +} + // Get the number of minipools owned by a node that are not finalised func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) diff --git a/node/node.go b/node/node.go index 9f4d950c6..87eb2d7c0 100644 --- a/node/node.go +++ b/node/node.go @@ -417,6 +417,19 @@ func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return (*rewardNetwork).Uint64(), nil } +// Get the network ID for a node's rewards +func GetRewardNetworkRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return nil, err + } + rewardNetwork := new(*big.Int) + if err := rocketNodeManager.Call(opts, rewardNetwork, "getRewardNetwork", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node %s reward network: %w", nodeAddress.Hex(), err) + } + return *rewardNetwork, nil +} + // Check if a node's fee distributor has been initialized yet func GetFeeDistributorInitialized(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp, opts) @@ -484,11 +497,24 @@ func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, if err != nil { return time.Time{}, err } - claimTime := new(*big.Int) - if err := rocketNodeManager.Call(opts, claimTime, "getNodeRegistrationTime", address); err != nil { + registrationTime := new(*big.Int) + if err := rocketNodeManager.Call(opts, registrationTime, "getNodeRegistrationTime", address); err != nil { return time.Time{}, fmt.Errorf("Could not get registration time for %s: %w", address.Hex(), err) } - return time.Unix((*claimTime).Int64(), 0), nil + return time.Unix((*registrationTime).Int64(), 0), nil +} + +// Get the time that the user registered as a claimer +func GetNodeRegistrationTimeRaw(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return nil, err + } + registrationTime := new(*big.Int) + if err := rocketNodeManager.Call(opts, registrationTime, "getNodeRegistrationTime", address); err != nil { + return nil, fmt.Errorf("Could not get registration time for %s: %w", address.Hex(), err) + } + return *registrationTime, nil } // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock @@ -905,6 +931,19 @@ func GetSmoothingPoolRegistrationChanged(rp *rocketpool.RocketPool, nodeAddress return time.Unix((*timestamp).Int64(), 0), nil } +// Get the time of the previous smoothing pool opt-in / opt-out +func GetSmoothingPoolRegistrationChangedRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return nil, err + } + timestamp := new(*big.Int) + if err := rocketNodeManager.Call(opts, timestamp, "getSmoothingPoolRegistrationChanged", nodeAddress); err != nil { + return nil, fmt.Errorf("Could not get node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) + } + return *timestamp, nil +} + // Estimate the gas for opting into / out of the smoothing pool func EstimateSetSmoothingPoolRegistrationStateGas(rp *rocketpool.RocketPool, optIn bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeManager, err := getRocketNodeManager(rp, nil) From cf0d3b30e6835e2e58ec1f8403859b428a8da8c5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 06:24:13 -0500 Subject: [PATCH 562/878] Added the multicall binding and the legacy node details getter --- utils/multicall/abi.go | 19 +++++ utils/multicall/multicaller.go | 141 +++++++++++++++++++++++++++++++++ utils/state/legacy.go | 106 +++++++++++++++++++++++++ 3 files changed, 266 insertions(+) create mode 100644 utils/multicall/abi.go create mode 100644 utils/multicall/multicaller.go create mode 100644 utils/state/legacy.go diff --git a/utils/multicall/abi.go b/utils/multicall/abi.go new file mode 100644 index 000000000..2df9cfa0b --- /dev/null +++ b/utils/multicall/abi.go @@ -0,0 +1,19 @@ +/* +* This code was derived from https://github.com/depocket/multicall-go + */ + +package multicall + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type MultiCall struct { + Target common.Address + CallData []byte +} + +var MultiMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} diff --git a/utils/multicall/multicaller.go b/utils/multicall/multicaller.go new file mode 100644 index 000000000..77ed657b7 --- /dev/null +++ b/utils/multicall/multicaller.go @@ -0,0 +1,141 @@ +package multicall + +import ( + "context" + "fmt" + "strings" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +type Call struct { + Key string `json:"key"` + Method string `json:"method"` + Target common.Address `json:"target"` + CallData []byte `json:"call_data"` + Contract *rocketpool.Contract + output interface{} +} + +type CallResponse struct { + Method string + Status bool + ReturnDataRaw []byte `json:"returnData"` +} + +type Result struct { + Success bool `json:"success"` + Output interface{} +} + +func (call Call) GetMultiCall() MultiCall { + return MultiCall{Target: call.Target, CallData: call.CallData} +} + +type MultiCaller struct { + Client rocketpool.ExecutionClient + Abi abi.ABI + ContractAddress common.Address + calls []Call +} + +func NewMultiCaller(client rocketpool.ExecutionClient, multicallerAddress common.Address) (*MultiCaller, error) { + mcAbi, err := abi.JSON(strings.NewReader(MultiMetaData.ABI)) + if err != nil { + return nil, err + } + + return &MultiCaller{ + Client: client, + Abi: mcAbi, + ContractAddress: multicallerAddress, + calls: []Call{}, + }, nil +} + +func (caller *MultiCaller) AddCall(callName string, contract *rocketpool.Contract, output interface{}, method string, args ...interface{}) error { + callData, err := contract.ABI.Pack(method, args...) + if err != nil { + return fmt.Errorf("error adding call [%s]: %w", method, err) + } + call := Call{ + Method: method, + Target: *contract.Address, + Key: callName, + CallData: callData, + Contract: contract, + output: output, + } + caller.calls = append(caller.calls, call) + return nil +} + +func (caller *MultiCaller) Execute(requireSuccess bool) (map[string]CallResponse, error) { + var multiCalls = make([]MultiCall, 0, len(caller.calls)) + for _, call := range caller.calls { + //fmt.Printf("Call:\n\tMethod: %s\n\tTarget: %s\n\tCallData: 0x%s\n", call.Method, call.Target.Hex(), hex.EncodeToString(call.CallData)) + multiCalls = append(multiCalls, call.GetMultiCall()) + } + callData, err := caller.Abi.Pack("tryAggregate", requireSuccess, multiCalls) + if err != nil { + return nil, err + } + + //fmt.Printf("Calling %s with calldata 0x%s\n", caller.ContractAddress.Hex(), hex.EncodeToString(callData)) + resp, err := caller.Client.CallContract(context.Background(), ethereum.CallMsg{To: &caller.ContractAddress, Data: callData}, nil) + if err != nil { + return nil, err + } + + responses, err := caller.Abi.Unpack("tryAggregate", resp) + + if err != nil { + return nil, err + } + + results := make(map[string]CallResponse) + for i, response := range responses[0].([]struct { + Success bool `json:"success"` + ReturnData []byte `json:"returnData"` + }) { + results[caller.calls[i].Key] = CallResponse{ + Method: caller.calls[i].Method, + ReturnDataRaw: response.ReturnData, + Status: response.Success, + } + } + return results, nil +} + +func (caller *MultiCaller) FlexibleCall(requireSuccess bool) (map[string]Result, error) { + res := make(map[string]Result) + results, err := caller.Execute(requireSuccess) + if err != nil { + caller.calls = []Call{} + return nil, err + } + for _, call := range caller.calls { + callSuccess := results[call.Key].Status + if callSuccess { + err := call.Contract.ABI.UnpackIntoInterface(call.output, call.Method, results[call.Key].ReturnDataRaw) + if err != nil { + caller.calls = []Call{} + return nil, err + } + res[call.Key] = Result{ + Success: results[call.Key].Status, + Output: call.output, + } + } else { + res[call.Key] = Result{ + Success: results[call.Key].Status, + Output: call.output, + } + } + } + caller.calls = []Call{} + return res, err +} diff --git a/utils/state/legacy.go b/utils/state/legacy.go new file mode 100644 index 000000000..184f58419 --- /dev/null +++ b/utils/state/legacy.go @@ -0,0 +1,106 @@ +package state + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/multicall" +) + +// Gets the details for a node using the efficient multicall contract +func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (node.NativeNodeDetails, error) { + // Get contracts + rocketNodeManager, err := rp.GetContract("rocketNodeManager", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + rocketNodeDistributorFactory, err := rp.GetContract("rocketNodeDistributorFactory", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + rocketTokenRETH, err := rp.GetContract("rocketTokenRETH", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + rocketTokenRPL, err := rp.GetContract("rocketTokenRPL", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + rocketTokenRPLFixedSupply, err := rp.GetContract("rocketTokenRPLFixedSupply", nil) + if err != nil { + return node.NativeNodeDetails{}, err + } + + details := node.NativeNodeDetails{} + details.NodeAddress = nodeAddress + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return node.NativeNodeDetails{}, err + } + + avgFee := big.NewInt(0) + mc.AddCall("GetNodeExists", rocketNodeManager, &details.Exists, "getNodeExists", nodeAddress) + mc.AddCall("GetNodeRegistrationTimeRaw", rocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", nodeAddress) + mc.AddCall("GetNodeTimezoneLocation", rocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", nodeAddress) + mc.AddCall("GetFeeDistributorInitialized", rocketNodeManager, &details.FeeDistributorInitialised, "getFeeDistributorInitialised", nodeAddress) + mc.AddCall("GetDistributorAddress", rocketNodeDistributorFactory, &details.FeeDistributorAddress, "getProxyAddress", nodeAddress) + mc.AddCall("GetNodeAverageFeeRaw", rocketNodeManager, &avgFee, "getAverageNodeFee", nodeAddress) + mc.AddCall("GetRewardNetworkRaw", rocketNodeManager, &details.RewardNetwork, "getRewardNetwork", nodeAddress) + mc.AddCall("GetNodeRPLStake", rocketNodeManager, &details.RplStake, "getNodeRPLStake", nodeAddress) + mc.AddCall("GetNodeEffectiveRPLStake", rocketNodeManager, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", nodeAddress) + mc.AddCall("GetNodeMinimumRPLStake", rocketNodeManager, &details.MinimumRPLStake, "getNodeMinimumRPLStake", nodeAddress) + mc.AddCall("GetNodeMaximumRPLStake", rocketNodeManager, &details.MaximumRPLStake, "getNodeMaximumRPLStake", nodeAddress) + mc.AddCall("GetNodeMinipoolCountRaw", rocketMinipoolManager, &details.MinipoolCount, "getNodeMinipoolCount", nodeAddress) + mc.AddCall("GetBalanceRETH", rocketTokenRETH, &details.BalanceRETH, "balanceOf", nodeAddress) + mc.AddCall("GetBalanceRPL", rocketTokenRPL, &details.BalanceRPL, "balanceOf", nodeAddress) + mc.AddCall("GetBalanceOldRPL", rocketTokenRPLFixedSupply, &details.BalanceOldRPL, "balanceOf", nodeAddress) + mc.AddCall("GetNodeWithdrawalAddress", rp.RocketStorageContract, &details.WithdrawalAddress, "getNodeWithdrawalAddress", nodeAddress) + mc.AddCall("GetNodePendingWithdrawalAddress", rp.RocketStorageContract, &details.PendingWithdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress) + mc.AddCall("GetSmoothingPoolRegistrationState", rocketNodeManager, &details.SmoothingPoolRegistrationState, "getSmoothingPoolRegistrationState", nodeAddress) + mc.AddCall("GetSmoothingPoolRegistrationChangedRaw", rocketNodeManager, &details.SmoothingPoolRegistrationChanged, "getSmoothingPoolRegistrationChanged", nodeAddress) + _, err = mc.FlexibleCall(true) + if err != nil { + return node.NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) + } + + // Get the node's ETH balance + details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), nodeAddress, opts.BlockNumber) + if err != nil { + return node.NativeNodeDetails{}, err + } + + // Fix the effective stake + if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { + details.EffectiveRPLStake.SetUint64(0) + } + + // Get the user and node portions of the distributor balance + distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) + if err != nil { + return node.NativeNodeDetails{}, err + } + if distributorBalance.Cmp(big.NewInt(0)) > 0 { + halfBalance := big.NewInt(0) + halfBalance.Div(distributorBalance, big.NewInt(2)) + nodeShare := big.NewInt(0) + nodeShare.Mul(halfBalance, avgFee) + nodeShare.Div(nodeShare, eth.EthToWei(1)) + nodeShare.Add(nodeShare, halfBalance) + details.DistributorBalanceNodeETH = nodeShare + userShare := big.NewInt(0) + userShare.Sub(distributorBalance, nodeShare) + details.DistributorBalanceUserETH = userShare + } + + return details, nil +} From 006d800a522bff8ebb54b8e44e029ef82abb0dfb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 06:25:41 -0500 Subject: [PATCH 563/878] Some cleanup --- utils/multicall/multicaller.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/utils/multicall/multicaller.go b/utils/multicall/multicaller.go index 77ed657b7..95be47eb8 100644 --- a/utils/multicall/multicaller.go +++ b/utils/multicall/multicaller.go @@ -1,3 +1,7 @@ +/* +* This code was derived from https://github.com/depocket/multicall-go + */ + package multicall import ( @@ -76,7 +80,6 @@ func (caller *MultiCaller) AddCall(callName string, contract *rocketpool.Contrac func (caller *MultiCaller) Execute(requireSuccess bool) (map[string]CallResponse, error) { var multiCalls = make([]MultiCall, 0, len(caller.calls)) for _, call := range caller.calls { - //fmt.Printf("Call:\n\tMethod: %s\n\tTarget: %s\n\tCallData: 0x%s\n", call.Method, call.Target.Hex(), hex.EncodeToString(call.CallData)) multiCalls = append(multiCalls, call.GetMultiCall()) } callData, err := caller.Abi.Pack("tryAggregate", requireSuccess, multiCalls) @@ -84,7 +87,6 @@ func (caller *MultiCaller) Execute(requireSuccess bool) (map[string]CallResponse return nil, err } - //fmt.Printf("Calling %s with calldata 0x%s\n", caller.ContractAddress.Hex(), hex.EncodeToString(callData)) resp, err := caller.Client.CallContract(context.Background(), ethereum.CallMsg{To: &caller.ContractAddress, Data: callData}, nil) if err != nil { return nil, err From 1bf385f0f613a9b2a3776cf2c93b39530187aa0e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 16:41:06 -0500 Subject: [PATCH 564/878] Some refactoring, added minipool details getters --- minipool/minipool-contract-v2.go | 5 + minipool/minipool-contract-v3.go | 5 + minipool/minipool-interface.go | 1 + utils/multicall/multicaller.go | 37 +++--- utils/state/common.go | 16 +++ utils/state/contracts.go | 50 ++++++++ utils/state/legacy.go | 106 ----------------- utils/state/minipool.go | 195 +++++++++++++++++++++++++++++++ utils/state/network.go | 0 utils/state/node.go | 168 ++++++++++++++++++++++++++ 10 files changed, 453 insertions(+), 130 deletions(-) create mode 100644 utils/state/common.go create mode 100644 utils/state/contracts.go delete mode 100644 utils/state/legacy.go create mode 100644 utils/state/minipool.go create mode 100644 utils/state/network.go create mode 100644 utils/state/node.go diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index 1436064a2..c25f77f75 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -63,6 +63,11 @@ func GetMinipoolAsV2(mp Minipool) (MinipoolV2, bool) { return nil, false } +// Get the contract +func (mp *minipool_v2) GetContract() *rocketpool.Contract { + return mp.Contract +} + // Get the contract address func (mp *minipool_v2) GetAddress() common.Address { return mp.Address diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 82343580c..8a26f6d6d 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -63,6 +63,11 @@ func GetMinipoolAsV3(mp Minipool) (MinipoolV3, bool) { return nil, false } +// Get the contract +func (mp *minipool_v3) GetContract() *rocketpool.Contract { + return mp.Contract +} + // Get the contract address func (mp *minipool_v3) GetAddress() common.Address { return mp.Address diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go index 999c4b2df..39a4b77c9 100644 --- a/minipool/minipool-interface.go +++ b/minipool/minipool-interface.go @@ -54,6 +54,7 @@ type PrestakeData struct { } type Minipool interface { + GetContract() *rocketpool.Contract GetAddress() common.Address GetVersion() uint8 GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) diff --git a/utils/multicall/multicaller.go b/utils/multicall/multicaller.go index 95be47eb8..d9c2dd440 100644 --- a/utils/multicall/multicaller.go +++ b/utils/multicall/multicaller.go @@ -16,7 +16,6 @@ import ( ) type Call struct { - Key string `json:"key"` Method string `json:"method"` Target common.Address `json:"target"` CallData []byte `json:"call_data"` @@ -60,7 +59,7 @@ func NewMultiCaller(client rocketpool.ExecutionClient, multicallerAddress common }, nil } -func (caller *MultiCaller) AddCall(callName string, contract *rocketpool.Contract, output interface{}, method string, args ...interface{}) error { +func (caller *MultiCaller) AddCall(contract *rocketpool.Contract, output interface{}, method string, args ...interface{}) error { callData, err := contract.ABI.Pack(method, args...) if err != nil { return fmt.Errorf("error adding call [%s]: %w", method, err) @@ -68,7 +67,6 @@ func (caller *MultiCaller) AddCall(callName string, contract *rocketpool.Contrac call := Call{ Method: method, Target: *contract.Address, - Key: callName, CallData: callData, Contract: contract, output: output, @@ -77,7 +75,7 @@ func (caller *MultiCaller) AddCall(callName string, contract *rocketpool.Contrac return nil } -func (caller *MultiCaller) Execute(requireSuccess bool) (map[string]CallResponse, error) { +func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) { var multiCalls = make([]MultiCall, 0, len(caller.calls)) for _, call := range caller.calls { multiCalls = append(multiCalls, call.GetMultiCall()) @@ -98,45 +96,36 @@ func (caller *MultiCaller) Execute(requireSuccess bool) (map[string]CallResponse return nil, err } - results := make(map[string]CallResponse) + results := make([]CallResponse, len(caller.calls)) for i, response := range responses[0].([]struct { Success bool `json:"success"` ReturnData []byte `json:"returnData"` }) { - results[caller.calls[i].Key] = CallResponse{ - Method: caller.calls[i].Method, - ReturnDataRaw: response.ReturnData, - Status: response.Success, - } + results[i].Method = caller.calls[i].Method + results[i].ReturnDataRaw = response.ReturnData + results[i].Status = response.Success } return results, nil } -func (caller *MultiCaller) FlexibleCall(requireSuccess bool) (map[string]Result, error) { - res := make(map[string]Result) +func (caller *MultiCaller) FlexibleCall(requireSuccess bool) ([]Result, error) { + res := make([]Result, len(caller.calls)) results, err := caller.Execute(requireSuccess) if err != nil { caller.calls = []Call{} return nil, err } - for _, call := range caller.calls { - callSuccess := results[call.Key].Status + for i, call := range caller.calls { + callSuccess := results[i].Status if callSuccess { - err := call.Contract.ABI.UnpackIntoInterface(call.output, call.Method, results[call.Key].ReturnDataRaw) + err := call.Contract.ABI.UnpackIntoInterface(call.output, call.Method, results[i].ReturnDataRaw) if err != nil { caller.calls = []Call{} return nil, err } - res[call.Key] = Result{ - Success: results[call.Key].Status, - Output: call.output, - } - } else { - res[call.Key] = Result{ - Success: results[call.Key].Status, - Output: call.output, - } } + res[i].Success = callSuccess + res[i].Output = call.output } caller.calls = []Call{} return res, err diff --git a/utils/state/common.go b/utils/state/common.go new file mode 100644 index 000000000..cc54680a0 --- /dev/null +++ b/utils/state/common.go @@ -0,0 +1,16 @@ +package state + +import ( + "math/big" + + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +const ( + threadLimit int = 6 +) + +// Global constants +var zero = big.NewInt(0) +var two = big.NewInt(2) +var oneInWei = eth.EthToWei(1) diff --git a/utils/state/contracts.go b/utils/state/contracts.go new file mode 100644 index 000000000..a3554c12c --- /dev/null +++ b/utils/state/contracts.go @@ -0,0 +1,50 @@ +package state + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Container for network contracts +type NetworkContracts struct { + RocketNodeManager *rocketpool.Contract + RocketMinipoolManager *rocketpool.Contract + RocketNodeDistributorFactory *rocketpool.Contract + RocketTokenRETH *rocketpool.Contract + RocketTokenRPL *rocketpool.Contract + RocketTokenRPLFixedSupply *rocketpool.Contract + RocketStorage *rocketpool.Contract +} + +// Get a new network contracts container +func NewNetworkContracts(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*NetworkContracts, error) { + contracts := &NetworkContracts{} + var err error + contracts.RocketNodeManager, err = rp.GetContract("rocketNodeManager", opts) + if err != nil { + return nil, err + } + contracts.RocketMinipoolManager, err = rp.GetContract("rocketMinipoolManager", opts) + if err != nil { + return nil, err + } + contracts.RocketNodeDistributorFactory, err = rp.GetContract("rocketNodeDistributorFactory", opts) + if err != nil { + return nil, err + } + contracts.RocketTokenRETH, err = rp.GetContract("rocketTokenRETH", opts) + if err != nil { + return nil, err + } + contracts.RocketTokenRPL, err = rp.GetContract("rocketTokenRPL", opts) + if err != nil { + return nil, err + } + contracts.RocketTokenRPLFixedSupply, err = rp.GetContract("rocketTokenRPLFixedSupply", opts) + if err != nil { + return nil, err + } + contracts.RocketStorage = rp.RocketStorageContract + + return contracts, nil +} diff --git a/utils/state/legacy.go b/utils/state/legacy.go deleted file mode 100644 index 184f58419..000000000 --- a/utils/state/legacy.go +++ /dev/null @@ -1,106 +0,0 @@ -package state - -import ( - "context" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/multicall" -) - -// Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (node.NativeNodeDetails, error) { - // Get contracts - rocketNodeManager, err := rp.GetContract("rocketNodeManager", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - rocketMinipoolManager, err := rp.GetContract("rocketMinipoolManager", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - rocketNodeDistributorFactory, err := rp.GetContract("rocketNodeDistributorFactory", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - rocketTokenRETH, err := rp.GetContract("rocketTokenRETH", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - rocketTokenRPL, err := rp.GetContract("rocketTokenRPL", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - rocketTokenRPLFixedSupply, err := rp.GetContract("rocketTokenRPLFixedSupply", nil) - if err != nil { - return node.NativeNodeDetails{}, err - } - - details := node.NativeNodeDetails{} - details.NodeAddress = nodeAddress - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) - if err != nil { - return node.NativeNodeDetails{}, err - } - - avgFee := big.NewInt(0) - mc.AddCall("GetNodeExists", rocketNodeManager, &details.Exists, "getNodeExists", nodeAddress) - mc.AddCall("GetNodeRegistrationTimeRaw", rocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", nodeAddress) - mc.AddCall("GetNodeTimezoneLocation", rocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", nodeAddress) - mc.AddCall("GetFeeDistributorInitialized", rocketNodeManager, &details.FeeDistributorInitialised, "getFeeDistributorInitialised", nodeAddress) - mc.AddCall("GetDistributorAddress", rocketNodeDistributorFactory, &details.FeeDistributorAddress, "getProxyAddress", nodeAddress) - mc.AddCall("GetNodeAverageFeeRaw", rocketNodeManager, &avgFee, "getAverageNodeFee", nodeAddress) - mc.AddCall("GetRewardNetworkRaw", rocketNodeManager, &details.RewardNetwork, "getRewardNetwork", nodeAddress) - mc.AddCall("GetNodeRPLStake", rocketNodeManager, &details.RplStake, "getNodeRPLStake", nodeAddress) - mc.AddCall("GetNodeEffectiveRPLStake", rocketNodeManager, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", nodeAddress) - mc.AddCall("GetNodeMinimumRPLStake", rocketNodeManager, &details.MinimumRPLStake, "getNodeMinimumRPLStake", nodeAddress) - mc.AddCall("GetNodeMaximumRPLStake", rocketNodeManager, &details.MaximumRPLStake, "getNodeMaximumRPLStake", nodeAddress) - mc.AddCall("GetNodeMinipoolCountRaw", rocketMinipoolManager, &details.MinipoolCount, "getNodeMinipoolCount", nodeAddress) - mc.AddCall("GetBalanceRETH", rocketTokenRETH, &details.BalanceRETH, "balanceOf", nodeAddress) - mc.AddCall("GetBalanceRPL", rocketTokenRPL, &details.BalanceRPL, "balanceOf", nodeAddress) - mc.AddCall("GetBalanceOldRPL", rocketTokenRPLFixedSupply, &details.BalanceOldRPL, "balanceOf", nodeAddress) - mc.AddCall("GetNodeWithdrawalAddress", rp.RocketStorageContract, &details.WithdrawalAddress, "getNodeWithdrawalAddress", nodeAddress) - mc.AddCall("GetNodePendingWithdrawalAddress", rp.RocketStorageContract, &details.PendingWithdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress) - mc.AddCall("GetSmoothingPoolRegistrationState", rocketNodeManager, &details.SmoothingPoolRegistrationState, "getSmoothingPoolRegistrationState", nodeAddress) - mc.AddCall("GetSmoothingPoolRegistrationChangedRaw", rocketNodeManager, &details.SmoothingPoolRegistrationChanged, "getSmoothingPoolRegistrationChanged", nodeAddress) - _, err = mc.FlexibleCall(true) - if err != nil { - return node.NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) - } - - // Get the node's ETH balance - details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), nodeAddress, opts.BlockNumber) - if err != nil { - return node.NativeNodeDetails{}, err - } - - // Fix the effective stake - if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { - details.EffectiveRPLStake.SetUint64(0) - } - - // Get the user and node portions of the distributor balance - distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) - if err != nil { - return node.NativeNodeDetails{}, err - } - if distributorBalance.Cmp(big.NewInt(0)) > 0 { - halfBalance := big.NewInt(0) - halfBalance.Div(distributorBalance, big.NewInt(2)) - nodeShare := big.NewInt(0) - nodeShare.Mul(halfBalance, avgFee) - nodeShare.Div(nodeShare, eth.EthToWei(1)) - nodeShare.Add(nodeShare, halfBalance) - details.DistributorBalanceNodeETH = nodeShare - userShare := big.NewInt(0) - userShare.Sub(distributorBalance, nodeShare) - details.DistributorBalanceUserETH = userShare - } - - return details, nil -} diff --git a/utils/state/minipool.go b/utils/state/minipool.go new file mode 100644 index 000000000..33733fe16 --- /dev/null +++ b/utils/state/minipool.go @@ -0,0 +1,195 @@ +package state + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + legacyMinipoolBatchSize int = 10 +) + +// Gets the details for a minipool using the efficient multicall contract +func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, opts) + if err != nil { + return minipool.NativeMinipoolDetails{}, err + } + + details := minipool.NativeMinipoolDetails{} + details.MinipoolAddress = minipoolAddress + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return minipool.NativeMinipoolDetails{}, err + } + + addMinipoolDetailsCalls(rp, contracts, mc, &details, minipoolAddress, opts) + + _, err = mc.FlexibleCall(true) + if err != nil { + return minipool.NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) + } + + fixupMinipoolDetails(rp, &details, opts) + + return details, nil +} + +// Gets the minpool details for a node using the efficient multicall contract +func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, opts) + if err != nil { + return nil, err + } + + // Get the list of minipool addresses for this node + addresses, err := minipool.GetNodeMinipoolAddresses(rp, nodeAddress, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) +} + +// Gets all minpool details using the efficient multicall contract +func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, opts) + if err != nil { + return nil, err + } + + // Get the list of all minipool addresses + addresses, err := minipool.GetMinipoolAddresses(rp, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) +} + +// Get multiple minipool details at once +func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { + minipoolDetails := make([]minipool.NativeMinipoolDetails, len(addresses)) + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + + // Run the getters in batches + count := len(addresses) + for i := 0; i < count; i += legacyNodeBatchSize { + i := i + max := i + legacyNodeBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + + address := addresses[j] + details := &minipoolDetails[j] + details.MinipoolAddress = address + + addMinipoolDetailsCalls(rp, contracts, mc, details, address, opts) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + for j := i; j < max; j++ { + fixupMinipoolDetails(rp, &minipoolDetails[j], opts) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting node details: %w", err) + } + + return minipoolDetails, nil +} + +// Add all of the calls for the minipool details to the multicaller +func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, address common.Address, opts *bind.CallOpts) error { + // Create the minipool contract binding + mp, err := minipool.NewMinipool(rp, address, opts) + if err != nil { + return err + } + mpContract := mp.GetContract() + + details.Version = mp.GetVersion() + mc.AddCall(contracts.RocketMinipoolManager, &details.Exists, "getMinipoolExists", address) + mc.AddCall(contracts.RocketMinipoolManager, &details.Pubkey, "getMinipoolPubkey", address) + mc.AddCall(mpContract, &details.StatusRaw, "getStatus") + mc.AddCall(mpContract, &details.StatusBlock, "getStatusBlock") + mc.AddCall(mpContract, &details.StatusTime, "getStatusTime") + mc.AddCall(mpContract, &details.Finalised, "getFinalised") + mc.AddCall(mpContract, &details.DepositTypeRaw, "getDepositType") + mc.AddCall(mpContract, &details.NodeFee, "getNodeFee") + mc.AddCall(mpContract, &details.NodeDepositBalance, "getNodeDepositBalance") + mc.AddCall(mpContract, &details.NodeDepositAssigned, "getNodeDepositAssigned") + mc.AddCall(mpContract, &details.UserDepositBalance, "getUserDepositBalance") + mc.AddCall(mpContract, &details.UserDepositAssigned, "getUserDepositAssigned") + mc.AddCall(mpContract, &details.UserDepositAssignedTime, "getUserDepositAssignedTime") + mc.AddCall(mpContract, &details.UseLatestDelegate, "getUseLatestDelegate") + mc.AddCall(mpContract, &details.Delegate, "getDelegate") + mc.AddCall(mpContract, &details.PreviousDelegate, "getPreviousDelegate") + mc.AddCall(mpContract, &details.EffectiveDelegate, "getEffectiveDelegate") + + penaltyCountKey := crypto.Keccak256Hash([]byte("network.penalties.penalty"), address.Bytes()) + mc.AddCall(contracts.RocketStorage, &details.PenaltyCount, "getUint", penaltyCountKey) + + penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) + mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) + + // UserDistributed is v3+ only + // Slashed is v3+ only + + mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") + + // LastBondReductionTime is v3+ only + // LastBondReductionPrevValue is v3+ only + // IsVacant is v3+ only + // NodeShareOfBalance is v3+ only + // ReduceBondTime is v3+ only + // ReduceBondCancelled is v3+ only + // ReduceBondValue is v3+ only + + mc.AddCall(contracts.RocketMinipoolManager, &details.WithdrawalCredentials, "getMinipoolWithdrawalCredentials", address) + + return nil +} + +// Fixes a legacy minipool details struct with supplemental logic +func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *minipool.NativeMinipoolDetails, opts *bind.CallOpts) error { + address := details.MinipoolAddress + + var err error + + // Get the minipool's ETH balance + details.Balance, err = rp.Client.BalanceAt(context.Background(), address, opts.BlockNumber) + if err != nil { + return err + } + + details.Status = types.MinipoolStatus(details.StatusRaw) + details.DepositType = types.MinipoolDeposit(details.DepositTypeRaw) + + return nil +} diff --git a/utils/state/network.go b/utils/state/network.go new file mode 100644 index 000000000..e69de29bb diff --git a/utils/state/node.go b/utils/state/node.go new file mode 100644 index 000000000..69b0c7c65 --- /dev/null +++ b/utils/state/node.go @@ -0,0 +1,168 @@ +package state + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + legacyNodeBatchSize int = 10 +) + +// Gets the details for a node using the efficient multicall contract +func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (node.NativeNodeDetails, error) { + contracts, err := NewNetworkContracts(rp, opts) + if err != nil { + return node.NativeNodeDetails{}, err + } + + details := node.NativeNodeDetails{} + details.NodeAddress = nodeAddress + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return node.NativeNodeDetails{}, err + } + + avgFee := big.NewInt(0) + addNodeDetailsCalls(contracts, mc, &details, nodeAddress, &avgFee) + + _, err = mc.FlexibleCall(true) + if err != nil { + return node.NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) + } + + fixupNodeDetails(rp, &details, avgFee, opts) + + return details, nil +} + +// Gets the details for all nodes using the efficient multicall contract +func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { + contracts, err := NewNetworkContracts(rp, opts) + if err != nil { + return nil, err + } + + // Get the list of node addresses + addresses, err := node.GetNodeAddresses(rp, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + nodeDetails := make([]node.NativeNodeDetails, len(addresses)) + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + + // Run the getters in batches + count := len(addresses) + for i := 0; i < count; i += legacyNodeBatchSize { + i := i + max := i + legacyNodeBatchSize + if max > count { + max = count + } + + avgFees := make([]*big.Int, legacyNodeBatchSize) + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + + address := addresses[j] + details := &nodeDetails[j] + details.NodeAddress = address + + avgFees[j-i] = big.NewInt(0) + addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j-i]) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + for j := i; j < max; j++ { + fixupNodeDetails(rp, &nodeDetails[j], avgFees[j-i], opts) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting node details: %w", err) + } + + return nodeDetails, nil +} + +// Add all of the calls for the node details to the multicaller +func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *node.NativeNodeDetails, address common.Address, avgFee **big.Int) { + mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) + mc.AddCall(contracts.RocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", address) + mc.AddCall(contracts.RocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", address) + mc.AddCall(contracts.RocketNodeManager, &details.FeeDistributorInitialised, "getFeeDistributorInitialised", address) + mc.AddCall(contracts.RocketNodeDistributorFactory, &details.FeeDistributorAddress, "getProxyAddress", address) + mc.AddCall(contracts.RocketNodeManager, avgFee, "getAverageNodeFee", address) + mc.AddCall(contracts.RocketNodeManager, &details.RewardNetwork, "getRewardNetwork", address) + mc.AddCall(contracts.RocketNodeManager, &details.RplStake, "getNodeRPLStake", address) + mc.AddCall(contracts.RocketNodeManager, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", address) + mc.AddCall(contracts.RocketNodeManager, &details.MinimumRPLStake, "getNodeMinimumRPLStake", address) + mc.AddCall(contracts.RocketNodeManager, &details.MaximumRPLStake, "getNodeMaximumRPLStake", address) + mc.AddCall(contracts.RocketMinipoolManager, &details.MinipoolCount, "getNodeMinipoolCount", address) + mc.AddCall(contracts.RocketTokenRETH, &details.BalanceRETH, "balanceOf", address) + mc.AddCall(contracts.RocketTokenRPL, &details.BalanceRPL, "balanceOf", address) + mc.AddCall(contracts.RocketTokenRPLFixedSupply, &details.BalanceOldRPL, "balanceOf", address) + mc.AddCall(contracts.RocketStorage, &details.WithdrawalAddress, "getNodeWithdrawalAddress", address) + mc.AddCall(contracts.RocketStorage, &details.PendingWithdrawalAddress, "getNodePendingWithdrawalAddress", address) + mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationState, "getSmoothingPoolRegistrationState", address) + mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationChanged, "getSmoothingPoolRegistrationChanged", address) +} + +// Fixes a legacy node details struct with supplemental logic +func fixupNodeDetails(rp *rocketpool.RocketPool, details *node.NativeNodeDetails, avgFee *big.Int, opts *bind.CallOpts) error { + address := details.NodeAddress + + var err error + + // Get the node's ETH balance + details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), address, opts.BlockNumber) + if err != nil { + return err + } + + // Fix the effective stake + if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { + details.EffectiveRPLStake.SetUint64(0) + } + + // Get the user and node portions of the distributor balance + distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) + if err != nil { + return err + } + if distributorBalance.Cmp(zero) > 0 { + halfBalance := big.NewInt(0) + halfBalance.Div(distributorBalance, two) + nodeShare := big.NewInt(0) + nodeShare.Mul(halfBalance, avgFee) + nodeShare.Div(nodeShare, oneInWei) + nodeShare.Add(nodeShare, halfBalance) + details.DistributorBalanceNodeETH = nodeShare + userShare := big.NewInt(0) + userShare.Sub(distributorBalance, nodeShare) + details.DistributorBalanceUserETH = userShare + } + + return nil +} From 954f2d9788501b764cb4d9acf87a06fd73f0b79e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 21:50:13 -0500 Subject: [PATCH 565/878] Added multicall support for node and minipool address getters --- utils/state/minipool.go | 110 +++++++++++++++++++++++++++++++++++++--- utils/state/network.go | 1 + utils/state/node.go | 53 +++++++++++++++++-- 3 files changed, 153 insertions(+), 11 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 33733fe16..7562e096c 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -3,6 +3,7 @@ package state import ( "context" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -15,7 +16,8 @@ import ( ) const ( - legacyMinipoolBatchSize int = 10 + legacyMinipoolBatchSize int = 20 + minipoolAddressBatchSize int = 1000 ) // Gets the details for a minipool using the efficient multicall contract @@ -52,9 +54,9 @@ func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress } // Get the list of minipool addresses for this node - addresses, err := minipool.GetNodeMinipoolAddresses(rp, nodeAddress, opts) + addresses, err := getNodeMinipoolAddressesFast(rp, contracts, nodeAddress, multicallerAddress, opts) if err != nil { - return nil, fmt.Errorf("error getting node addresses: %w", err) + return nil, fmt.Errorf("error getting minipool addresses: %w", err) } return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) } @@ -67,13 +69,105 @@ func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress c } // Get the list of all minipool addresses - addresses, err := minipool.GetMinipoolAddresses(rp, opts) + addresses, err := getAllMinipoolAddressesFast(rp, contracts, multicallerAddress, opts) if err != nil { - return nil, fmt.Errorf("error getting node addresses: %w", err) + return nil, fmt.Errorf("error getting minipool addresses: %w", err) } return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) } +// Get all minipool addresses using the multicaller +func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { + // Get minipool count + minipoolCount, err := minipool.GetNodeMinipoolCount(rp, nodeAddress, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + addresses := make([]common.Address, minipoolCount) + + // Run the getters in batches + count := int(minipoolCount) + for i := 0; i < count; i += minipoolAddressBatchSize { + i := i + max := i + minipoolAddressBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(contracts.RocketMinipoolManager, &addresses[j], "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting minipool addresses: %w", err) + } + + return addresses, nil +} + +// Get all minipool addresses using the multicaller +func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { + // Get minipool count + minipoolCount, err := minipool.GetMinipoolCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + addresses := make([]common.Address, minipoolCount) + + // Run the getters in batches + count := int(minipoolCount) + for i := 0; i < count; i += minipoolAddressBatchSize { + i := i + max := i + minipoolAddressBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(contracts.RocketMinipoolManager, &addresses[j], "getMinipoolAt", big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting minipool addresses: %w", err) + } + + return addresses, nil +} + // Get multiple minipool details at once func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { minipoolDetails := make([]minipool.NativeMinipoolDetails, len(addresses)) @@ -84,9 +178,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac // Run the getters in batches count := len(addresses) - for i := 0; i < count; i += legacyNodeBatchSize { + for i := 0; i < count; i += legacyMinipoolBatchSize { i := i - max := i + legacyNodeBatchSize + max := i + legacyMinipoolBatchSize if max > count { max = count } @@ -118,7 +212,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting node details: %w", err) + return nil, fmt.Errorf("error getting minipool details: %w", err) } return minipoolDetails, nil diff --git a/utils/state/network.go b/utils/state/network.go index e69de29bb..7bf2df5b4 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -0,0 +1 @@ +package state diff --git a/utils/state/node.go b/utils/state/node.go index 69b0c7c65..1d77c1366 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -14,7 +14,8 @@ import ( ) const ( - legacyNodeBatchSize int = 10 + legacyNodeBatchSize int = 20 + nodeAddressBatchSize int = 1000 ) // Gets the details for a node using the efficient multicall contract @@ -45,14 +46,14 @@ func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.A } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { +func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { contracts, err := NewNetworkContracts(rp, opts) if err != nil { return nil, err } // Get the list of node addresses - addresses, err := node.GetNodeAddresses(rp, opts) + addresses, err := getNodeAddressesFast(rp, contracts, multicallerAddress, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } @@ -106,6 +107,52 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress commo return nodeDetails, nil } +// Get all node addresses using the multicaller +func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { + // Get minipool count + nodeCount, err := node.GetNodeCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + addresses := make([]common.Address, nodeCount) + + // Run the getters in batches + count := int(nodeCount) + for i := 0; i < count; i += nodeAddressBatchSize { + i := i + max := i + nodeAddressBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(contracts.RocketNodeManager, &addresses[j], "getNodeAt", big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + + return addresses, nil +} + // Add all of the calls for the node details to the multicaller func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *node.NativeNodeDetails, address common.Address, avgFee **big.Int) { mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) From 4b5c79f7bfe738eea5ee22f8c49d4cc4ee067b68 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 11 Feb 2023 22:38:35 -0500 Subject: [PATCH 566/878] Added BalanceBatcher binding --- utils/multicall/abi.go | 14 ++++--- utils/multicall/balances.go | 60 +++++++++++++++++++++++++++ utils/multicall/multicaller.go | 10 ++--- utils/state/node.go | 75 ++++++++++++++++++++++------------ 4 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 utils/multicall/balances.go diff --git a/utils/multicall/abi.go b/utils/multicall/abi.go index 2df9cfa0b..5bbaf033d 100644 --- a/utils/multicall/abi.go +++ b/utils/multicall/abi.go @@ -1,11 +1,13 @@ /* -* This code was derived from https://github.com/depocket/multicall-go - */ +This code was derived from the following sources: + +- https://github.com/depocket/multicall-go +- https://github.com/wbobeirne/eth-balance-checker +*/ package multicall import ( - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ) @@ -14,6 +16,6 @@ type MultiCall struct { CallData []byte } -var MultiMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structDePocketCore.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", -} +var MulticallABI string = "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall2.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" + +var BalancesABI string = "[{\"constant\":true,\"inputs\":[{\"name\":\"user\",\"type\":\"address\"},{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"tokenBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"users\",\"type\":\"address[]\"},{\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"balances\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"}]" diff --git a/utils/multicall/balances.go b/utils/multicall/balances.go new file mode 100644 index 000000000..4d4a6d8bf --- /dev/null +++ b/utils/multicall/balances.go @@ -0,0 +1,60 @@ +package multicall + +import ( + "context" + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +const ( + balanceBatchSize int = 4000 +) + +type BalanceBatcher struct { + Client rocketpool.ExecutionClient + ABI abi.ABI + ContractAddress common.Address +} + +func NewBalanceBatcher(client rocketpool.ExecutionClient, address common.Address) (*BalanceBatcher, error) { + abi, err := abi.JSON(strings.NewReader(BalancesABI)) + if err != nil { + return nil, err + } + + return &BalanceBatcher{ + Client: client, + ContractAddress: address, + ABI: abi, + }, nil +} + +func (b *BalanceBatcher) GetEthBalances(addresses []common.Address, opts *bind.CallOpts) ([]*big.Int, error) { + + tokens := make([]common.Address, len(addresses)) // Array of nils + + callData, err := b.ABI.Pack("balances", addresses, tokens) + if err != nil { + return nil, fmt.Errorf("error creating calldata for balances: %w", err) + } + + response, err := b.Client.CallContract(context.Background(), ethereum.CallMsg{To: &b.ContractAddress, Data: callData}, opts.BlockNumber) + if err != nil { + return nil, fmt.Errorf("error getting balances: %w", err) + } + + balances := new([]*big.Int) + err = b.ABI.UnpackIntoInterface(&balances, "balances", response) + if err != nil { + return nil, fmt.Errorf("error unpacking balances response: %w", err) + } + + return *balances, nil +} diff --git a/utils/multicall/multicaller.go b/utils/multicall/multicaller.go index d9c2dd440..8ca2e9725 100644 --- a/utils/multicall/multicaller.go +++ b/utils/multicall/multicaller.go @@ -40,20 +40,20 @@ func (call Call) GetMultiCall() MultiCall { type MultiCaller struct { Client rocketpool.ExecutionClient - Abi abi.ABI + ABI abi.ABI ContractAddress common.Address calls []Call } func NewMultiCaller(client rocketpool.ExecutionClient, multicallerAddress common.Address) (*MultiCaller, error) { - mcAbi, err := abi.JSON(strings.NewReader(MultiMetaData.ABI)) + mcAbi, err := abi.JSON(strings.NewReader(MulticallABI)) if err != nil { return nil, err } return &MultiCaller{ Client: client, - Abi: mcAbi, + ABI: mcAbi, ContractAddress: multicallerAddress, calls: []Call{}, }, nil @@ -80,7 +80,7 @@ func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) for _, call := range caller.calls { multiCalls = append(multiCalls, call.GetMultiCall()) } - callData, err := caller.Abi.Pack("tryAggregate", requireSuccess, multiCalls) + callData, err := caller.ABI.Pack("tryAggregate", requireSuccess, multiCalls) if err != nil { return nil, err } @@ -90,7 +90,7 @@ func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) return nil, err } - responses, err := caller.Abi.Unpack("tryAggregate", resp) + responses, err := caller.ABI.Unpack("tryAggregate", resp) if err != nil { return nil, err diff --git a/utils/state/node.go b/utils/state/node.go index 1d77c1366..5e995c0d5 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -40,31 +40,50 @@ func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.A return node.NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) } - fixupNodeDetails(rp, &details, avgFee, opts) + // Get the node's ETH balance + details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), nodeAddress, opts.BlockNumber) + if err != nil { + return node.NativeNodeDetails{}, err + } + + // Get the distributor balance + distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) + if err != nil { + return node.NativeNodeDetails{}, err + } + + // Do some postprocessing on the node data + fixupNodeDetails(rp, &details, avgFee, distributorBalance, opts) return details, nil } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { +func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { contracts, err := NewNetworkContracts(rp, opts) if err != nil { return nil, err } + balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) + if err != nil { + return nil, err + } + // Get the list of node addresses addresses, err := getNodeAddressesFast(rp, contracts, multicallerAddress, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } - nodeDetails := make([]node.NativeNodeDetails, len(addresses)) + count := len(addresses) + nodeDetails := make([]node.NativeNodeDetails, count) + avgFees := make([]*big.Int, count) // Sync var wg errgroup.Group wg.SetLimit(threadLimit) // Run the getters in batches - count := len(addresses) for i := 0; i < count; i += legacyNodeBatchSize { i := i max := i + legacyNodeBatchSize @@ -72,7 +91,6 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres max = count } - avgFees := make([]*big.Int, legacyNodeBatchSize) wg.Go(func() error { var err error mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) @@ -80,22 +98,17 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres return err } for j := i; j < max; j++ { - address := addresses[j] details := &nodeDetails[j] details.NodeAddress = address - avgFees[j-i] = big.NewInt(0) - addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j-i]) + avgFees[j] = big.NewInt(0) + addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j]) } _, err = mc.FlexibleCall(true) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } - - for j := i; j < max; j++ { - fixupNodeDetails(rp, &nodeDetails[j], avgFees[j-i], opts) - } return nil }) } @@ -104,6 +117,28 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres return nil, fmt.Errorf("error getting node details: %w", err) } + // Get the balances of the nodes + distributorAddresses := make([]common.Address, count) + balances, err := balanceBatcher.GetEthBalances(addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting node balances: %w", err) + } + for i, details := range nodeDetails { + details.BalanceETH = balances[i] + distributorAddresses[i] = details.FeeDistributorAddress + } + + // Get the balances of the distributors + balances, err = balanceBatcher.GetEthBalances(distributorAddresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting distributor balances: %w", err) + } + + // Do some postprocessing on the node data + for i, details := range nodeDetails { + fixupNodeDetails(rp, &details, avgFees[i], balances[i], opts) + } + return nodeDetails, nil } @@ -177,27 +212,13 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, } // Fixes a legacy node details struct with supplemental logic -func fixupNodeDetails(rp *rocketpool.RocketPool, details *node.NativeNodeDetails, avgFee *big.Int, opts *bind.CallOpts) error { - address := details.NodeAddress - - var err error - - // Get the node's ETH balance - details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), address, opts.BlockNumber) - if err != nil { - return err - } - +func fixupNodeDetails(rp *rocketpool.RocketPool, details *node.NativeNodeDetails, avgFee *big.Int, distributorBalance *big.Int, opts *bind.CallOpts) error { // Fix the effective stake if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { details.EffectiveRPLStake.SetUint64(0) } // Get the user and node portions of the distributor balance - distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) - if err != nil { - return err - } if distributorBalance.Cmp(zero) > 0 { halfBalance := big.NewInt(0) halfBalance.Div(distributorBalance, two) From 5dcb2a84ae7cf066c2622f5a8a2a54b21e23d614 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 00:06:20 -0500 Subject: [PATCH 567/878] Added minipool version batching --- minipool/minipool-constructor.go | 12 ++++ rocketpool/version-interface.go | 15 ++++ utils/multicall/balances.go | 58 ++++++++++++---- utils/state/minipool.go | 116 +++++++++++++++++++++++++------ utils/state/node.go | 4 +- 5 files changed, 168 insertions(+), 37 deletions(-) diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index a04102ace..767d74fd9 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -40,6 +40,18 @@ func NewMinipoolFromDetails(rp *rocketpool.RocketPool, mpd NativeMinipoolDetails } } +// Create a minipool binding from an explicit version number +func NewMinipoolFromVersion(rp *rocketpool.RocketPool, address common.Address, version uint8, opts *bind.CallOpts) (Minipool, error) { + switch version { + case 1, 2: + return newMinipool_v2(rp, address) + case 3: + return newMinipool_v3(rp, address, opts) + default: + return nil, fmt.Errorf("unexpected minipool contract version [%d]", version) + } +} + // Create a minipool contract directly from its ABI - used for legacy minipools func createMinipoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { // Decode ABI diff --git a/rocketpool/version-interface.go b/rocketpool/version-interface.go index 2f1d78e80..6bfc883af 100644 --- a/rocketpool/version-interface.go +++ b/rocketpool/version-interface.go @@ -60,3 +60,18 @@ func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bi return *version, nil } + +func GetRocketVersionContractForAddress(rp *RocketPool, address common.Address) (*Contract, error) { + // Parse ABI using the hardcoded string until the contract is deployed + abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceABI)) + if err != nil { + return nil, fmt.Errorf("Could not parse version interface JSON: %w", err) + } + + return &Contract{ + Contract: bind.NewBoundContract(address, abiParsed, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: &abiParsed, + Client: rp.Client, + }, nil +} diff --git a/utils/multicall/balances.go b/utils/multicall/balances.go index 4d4a6d8bf..40adb3de2 100644 --- a/utils/multicall/balances.go +++ b/utils/multicall/balances.go @@ -11,10 +11,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "golang.org/x/sync/errgroup" ) const ( - balanceBatchSize int = 4000 + balanceBatchSize int = 2000 + threadLimit int = 6 ) type BalanceBatcher struct { @@ -38,23 +40,51 @@ func NewBalanceBatcher(client rocketpool.ExecutionClient, address common.Address func (b *BalanceBatcher) GetEthBalances(addresses []common.Address, opts *bind.CallOpts) ([]*big.Int, error) { - tokens := make([]common.Address, len(addresses)) // Array of nils + // Sync + count := len(addresses) + var wg errgroup.Group + wg.SetLimit(threadLimit) + balances := make([]*big.Int, count) - callData, err := b.ABI.Pack("balances", addresses, tokens) - if err != nil { - return nil, fmt.Errorf("error creating calldata for balances: %w", err) - } + // Run the getters in batches + for i := 0; i < count; i += balanceBatchSize { + i := i + max := i + balanceBatchSize + if max > count { + max = count + } - response, err := b.Client.CallContract(context.Background(), ethereum.CallMsg{To: &b.ContractAddress, Data: callData}, opts.BlockNumber) - if err != nil { - return nil, fmt.Errorf("error getting balances: %w", err) + wg.Go(func() error { + subAddresses := addresses[i:max] + tokens := []common.Address{ + {}, // Empty token for ETH balance + } + callData, err := b.ABI.Pack("balances", subAddresses, tokens) + if err != nil { + return fmt.Errorf("error creating calldata for balances: %w", err) + } + + response, err := b.Client.CallContract(context.Background(), ethereum.CallMsg{To: &b.ContractAddress, Data: callData}, opts.BlockNumber) + if err != nil { + return fmt.Errorf("error calling balances: %w", err) + } + + var subBalances []*big.Int + err = b.ABI.UnpackIntoInterface(&subBalances, "balances", response) + if err != nil { + return fmt.Errorf("error unpacking balances response: %w", err) + } + for j, balance := range subBalances { + balances[i+j] = balance + } + + return nil + }) } - balances := new([]*big.Int) - err = b.ABI.UnpackIntoInterface(&balances, "balances", response) - if err != nil { - return nil, fmt.Errorf("error unpacking balances response: %w", err) + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting balances: %w", err) } - return *balances, nil + return balances, nil } diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 7562e096c..cb46864be 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -1,7 +1,6 @@ package state import ( - "context" "fmt" "math/big" @@ -16,8 +15,9 @@ import ( ) const ( - legacyMinipoolBatchSize int = 20 - minipoolAddressBatchSize int = 1000 + legacyMinipoolBatchSize int = 200 + minipoolAddressBatchSize int = 2000 + minipoolVersionBatchSize int = 500 ) // Gets the details for a minipool using the efficient multicall contract @@ -34,7 +34,11 @@ func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress return minipool.NativeMinipoolDetails{}, err } - addMinipoolDetailsCalls(rp, contracts, mc, &details, minipoolAddress, opts) + version, err := rocketpool.GetContractVersion(rp, minipoolAddress, opts) + if err != nil { + return minipool.NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) + } + addMinipoolDetailsCalls(rp, contracts, mc, &details, minipoolAddress, version, opts) _, err = mc.FlexibleCall(true) if err != nil { @@ -47,33 +51,59 @@ func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress } // Gets the minpool details for a node using the efficient multicall contract -func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { +func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { contracts, err := NewNetworkContracts(rp, opts) if err != nil { return nil, err } + balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) + if err != nil { + return nil, err + } + // Get the list of minipool addresses for this node addresses, err := getNodeMinipoolAddressesFast(rp, contracts, nodeAddress, multicallerAddress, opts) if err != nil { return nil, fmt.Errorf("error getting minipool addresses: %w", err) } - return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) + + // Get the list of minipool versions + versions, err := getMinipoolVersionsFast(rp, contracts, multicallerAddress, addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting minipool versions: %w", err) + } + + // Get the minipool details + return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, versions, balanceBatcher, opts) } // Gets all minpool details using the efficient multicall contract -func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { +func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { contracts, err := NewNetworkContracts(rp, opts) if err != nil { return nil, err } + balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) + if err != nil { + return nil, err + } + // Get the list of all minipool addresses addresses, err := getAllMinipoolAddressesFast(rp, contracts, multicallerAddress, opts) if err != nil { return nil, fmt.Errorf("error getting minipool addresses: %w", err) } - return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, opts) + + // Get the list of minipool versions + versions, err := getMinipoolVersionsFast(rp, contracts, multicallerAddress, addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting minipool versions: %w", err) + } + + // Get the minipool details + return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, versions, balanceBatcher, opts) } // Get all minipool addresses using the multicaller @@ -168,8 +198,52 @@ func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkCo return addresses, nil } +// Get minipool versions using the multicaller +func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, opts *bind.CallOpts) ([]uint8, error) { + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + + // Run the getters in batches + count := len(addresses) + versions := make([]uint8, count) + for i := 0; i < count; i += minipoolVersionBatchSize { + i := i + max := i + minipoolVersionBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + contract, err := rocketpool.GetRocketVersionContractForAddress(rp, addresses[j]) + if err != nil { + return fmt.Errorf("error creating version contract for minipool %s: %w", addresses[j].Hex(), err) + } + mc.AddCall(contract, &versions[j], "version") + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting minipool addresses: %w", err) + } + + return versions, nil +} + // Get multiple minipool details at once -func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { +func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, versions []uint8, balanceBatcher *multicall.BalanceBatcher, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { minipoolDetails := make([]minipool.NativeMinipoolDetails, len(addresses)) // Sync @@ -197,7 +271,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac details := &minipoolDetails[j] details.MinipoolAddress = address - addMinipoolDetailsCalls(rp, contracts, mc, details, address, opts) + addMinipoolDetailsCalls(rp, contracts, mc, details, address, versions[j], opts) } _, err = mc.FlexibleCall(true) if err != nil { @@ -215,13 +289,22 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac return nil, fmt.Errorf("error getting minipool details: %w", err) } + // Get the balances of the minipools + balances, err := balanceBatcher.GetEthBalances(addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting minipool balances: %w", err) + } + for i, details := range minipoolDetails { + details.Balance = balances[i] + } + return minipoolDetails, nil } // Add all of the calls for the minipool details to the multicaller -func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, address common.Address, opts *bind.CallOpts) error { +func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, address common.Address, version uint8, opts *bind.CallOpts) error { // Create the minipool contract binding - mp, err := minipool.NewMinipool(rp, address, opts) + mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) if err != nil { return err } @@ -272,15 +355,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra // Fixes a legacy minipool details struct with supplemental logic func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *minipool.NativeMinipoolDetails, opts *bind.CallOpts) error { - address := details.MinipoolAddress - - var err error - - // Get the minipool's ETH balance - details.Balance, err = rp.Client.BalanceAt(context.Background(), address, opts.BlockNumber) - if err != nil { - return err - } details.Status = types.MinipoolStatus(details.StatusRaw) details.DepositType = types.MinipoolDeposit(details.DepositTypeRaw) diff --git a/utils/state/node.go b/utils/state/node.go index 5e995c0d5..d60c18c7d 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -14,8 +14,8 @@ import ( ) const ( - legacyNodeBatchSize int = 20 - nodeAddressBatchSize int = 1000 + legacyNodeBatchSize int = 200 + nodeAddressBatchSize int = 2000 ) // Gets the details for a node using the efficient multicall contract From 2ac931581330e4b1d0765059876bce855ae0235e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 00:13:35 -0500 Subject: [PATCH 568/878] Updated Geth --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 94248de6f..53814c742 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.25 + github.com/ethereum/go-ethereum v1.10.26 github.com/ferranbt/fastssz v0.1.2 // indirect github.com/hashicorp/go-version v1.6.0 github.com/minio/highwayhash v1.0.2 // indirect diff --git a/go.sum b/go.sum index 157818cdc..4d4ce3cd0 100644 --- a/go.sum +++ b/go.sum @@ -145,8 +145,8 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.25 h1:5dFrKJDnYf8L6/5o42abCE6a9yJm9cs4EJVRyYMr55s= -github.com/ethereum/go-ethereum v1.10.25/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From b4bd541cb7d90a9a84edcc74e348a091a3787c2d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 02:52:40 -0500 Subject: [PATCH 569/878] Some contract name fixes, backwards compat fixes, optimizations --- utils/state/contracts.go | 5 +++++ utils/state/minipool.go | 43 +++++++++++++++++++++++----------------- utils/state/node.go | 14 ++++++------- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index a3554c12c..7a9392f16 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -8,6 +8,7 @@ import ( // Container for network contracts type NetworkContracts struct { RocketNodeManager *rocketpool.Contract + RocketNodeStaking *rocketpool.Contract RocketMinipoolManager *rocketpool.Contract RocketNodeDistributorFactory *rocketpool.Contract RocketTokenRETH *rocketpool.Contract @@ -24,6 +25,10 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*Netwo if err != nil { return nil, err } + contracts.RocketNodeStaking, err = rp.GetContract("rocketNodeStaking", opts) + if err != nil { + return nil, err + } contracts.RocketMinipoolManager, err = rp.GetContract("rocketMinipoolManager", opts) if err != nil { return nil, err diff --git a/utils/state/minipool.go b/utils/state/minipool.go index cb46864be..d1c5ddf58 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -278,9 +278,6 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac return fmt.Errorf("error executing multicall: %w", err) } - for j := i; j < max; j++ { - fixupMinipoolDetails(rp, &minipoolDetails[j], opts) - } return nil }) } @@ -289,13 +286,14 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac return nil, fmt.Errorf("error getting minipool details: %w", err) } - // Get the balances of the minipools + // Get the balances of the minipools and do the postprocessing on them balances, err := balanceBatcher.GetEthBalances(addresses, opts) if err != nil { return nil, fmt.Errorf("error getting minipool balances: %w", err) } - for i, details := range minipoolDetails { - details.Balance = balances[i] + for i := range minipoolDetails { + minipoolDetails[i].Balance = balances[i] + fixupMinipoolDetails(rp, &minipoolDetails[i], opts) } return minipoolDetails, nil @@ -328,6 +326,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.Delegate, "getDelegate") mc.AddCall(mpContract, &details.PreviousDelegate, "getPreviousDelegate") mc.AddCall(mpContract, &details.EffectiveDelegate, "getEffectiveDelegate") + mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") penaltyCountKey := crypto.Keccak256Hash([]byte("network.penalties.penalty"), address.Bytes()) mc.AddCall(contracts.RocketStorage, &details.PenaltyCount, "getUint", penaltyCountKey) @@ -335,18 +334,26 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) - // UserDistributed is v3+ only - // Slashed is v3+ only - - mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") - - // LastBondReductionTime is v3+ only - // LastBondReductionPrevValue is v3+ only - // IsVacant is v3+ only - // NodeShareOfBalance is v3+ only - // ReduceBondTime is v3+ only - // ReduceBondCancelled is v3+ only - // ReduceBondValue is v3+ only + if version < 3 { + // UserDistributed is v3+ only + // Slashed is v3+ only + // LastBondReductionTime is v3+ only + // LastBondReductionPrevValue is v3+ only + // IsVacant is v3+ only + // NodeShareOfBalance is v3+ only + // ReduceBondTime is v3+ only + // ReduceBondCancelled is v3+ only + // ReduceBondValue is v3+ only + details.UserDistributed = false + details.Slashed = false + details.LastBondReductionTime = big.NewInt(0) + details.LastBondReductionPrevValue = big.NewInt(0) + details.IsVacant = false + details.NodeShareOfBalance = big.NewInt(0) + details.ReduceBondTime = big.NewInt(0) + details.ReduceBondCancelled = false + details.ReduceBondValue = big.NewInt(0) + } mc.AddCall(contracts.RocketMinipoolManager, &details.WithdrawalCredentials, "getMinipoolWithdrawalCredentials", address) diff --git a/utils/state/node.go b/utils/state/node.go index d60c18c7d..acb5c1bf3 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -124,7 +124,7 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres return nil, fmt.Errorf("error getting node balances: %w", err) } for i, details := range nodeDetails { - details.BalanceETH = balances[i] + nodeDetails[i].BalanceETH = balances[i] distributorAddresses[i] = details.FeeDistributorAddress } @@ -135,8 +135,8 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres } // Do some postprocessing on the node data - for i, details := range nodeDetails { - fixupNodeDetails(rp, &details, avgFees[i], balances[i], opts) + for i := range nodeDetails { + fixupNodeDetails(rp, &nodeDetails[i], avgFees[i], balances[i], opts) } return nodeDetails, nil @@ -197,10 +197,10 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeDistributorFactory, &details.FeeDistributorAddress, "getProxyAddress", address) mc.AddCall(contracts.RocketNodeManager, avgFee, "getAverageNodeFee", address) mc.AddCall(contracts.RocketNodeManager, &details.RewardNetwork, "getRewardNetwork", address) - mc.AddCall(contracts.RocketNodeManager, &details.RplStake, "getNodeRPLStake", address) - mc.AddCall(contracts.RocketNodeManager, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", address) - mc.AddCall(contracts.RocketNodeManager, &details.MinimumRPLStake, "getNodeMinimumRPLStake", address) - mc.AddCall(contracts.RocketNodeManager, &details.MaximumRPLStake, "getNodeMaximumRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &details.RplStake, "getNodeRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &details.MinimumRPLStake, "getNodeMinimumRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &details.MaximumRPLStake, "getNodeMaximumRPLStake", address) mc.AddCall(contracts.RocketMinipoolManager, &details.MinipoolCount, "getNodeMinipoolCount", address) mc.AddCall(contracts.RocketTokenRETH, &details.BalanceRETH, "balanceOf", address) mc.AddCall(contracts.RocketTokenRPL, &details.BalanceRPL, "balanceOf", address) From a33d3c48b8e10301ae572837f25cb93728dabb78 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 05:26:50 -0500 Subject: [PATCH 570/878] Added support for v1 minipools to the fast version checker --- utils/state/minipool.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index d1c5ddf58..72c1ac71e 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -146,7 +146,7 @@ func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkC } if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting minipool addresses: %w", err) + return nil, fmt.Errorf("error getting minipool addresses for node %s: %w", nodeAddress.Hex(), err) } return addresses, nil @@ -192,7 +192,7 @@ func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkCo } if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting minipool addresses: %w", err) + return nil, fmt.Errorf("error getting all minipool addresses: %w", err) } return addresses, nil @@ -227,7 +227,12 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra } mc.AddCall(contract, &versions[j], "version") } - _, err = mc.FlexibleCall(true) + results, err := mc.FlexibleCall(false) // Allow calls to fail - necessary for Prater + for j, result := range results { + if !result.Success { + versions[j+i] = 1 // Anything that failed the version check didn't have the method yet so it must be v1 + } + } if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -236,7 +241,7 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra } if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting minipool addresses: %w", err) + return nil, fmt.Errorf("error getting minipool versions: %w", err) } return versions, nil From 4087fecdf670a0f3b9e71c58319bbad19821e95e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 17:13:07 -0500 Subject: [PATCH 571/878] Added some missing Atlas methods --- minipool/bond-reducer.go | 13 ++++++ minipool/minipool-contract-v3.go | 11 +++++ minipool/minipool.go | 1 + utils/state/contracts.go | 10 ++++- utils/state/minipool.go | 72 ++++++++++++++++++-------------- utils/state/node.go | 8 ++-- 6 files changed, 79 insertions(+), 36 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index 5e3f45c49..e2355b251 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -59,6 +59,19 @@ func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address return time.Unix((*reduceBondTime).Int64(), 0), nil } +// Gets the amount of ETH a minipool is reducing its bond to +func GetReduceBondValue(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return nil, err + } + reduceBondValue := new(*big.Int) + if err := rocketMinipoolBondReducer.Call(opts, reduceBondValue, "getReduceBondValue", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get reduce bond value for minipool %s: %w", minipoolAddress.Hex(), err) + } + return *reduceBondValue, nil +} + // Gets the timestamp at which the bond was last reduced func GetLastBondReductionTime(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (time.Time, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 8a26f6d6d..8e177c350 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -26,6 +26,8 @@ type MinipoolV3 interface { Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) + GetSlashed(opts *bind.CallOpts) (bool, error) + GetLastBondReductionTime(opts *bind.CallOpts) (*big.Int, error) } // Minipool contract @@ -356,6 +358,15 @@ func (mp *minipool_v3) GetUserDistributed(opts *bind.CallOpts) (bool, error) { return *distributed, nil } +// Check if the minipool's RPL has been slashed +func (mp *minipool_v3) GetSlashed(opts *bind.CallOpts) (bool, error) { + slashed := new(bool) + if err := mp.Contract.Call(opts, slashed, "getSlashed"); err != nil { + return false, fmt.Errorf("Could not get slashed status for minipool %s: %w", mp.Address.Hex(), err) + } + return *slashed, nil +} + // Estimate the gas of DistributeBalance func (mp *minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") diff --git a/minipool/minipool.go b/minipool/minipool.go index 304c7003d..482ecb2c6 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -73,6 +73,7 @@ type NativeMinipoolDetails struct { ReduceBondCancelled bool `abi:"reduceBondCancelled"` ReduceBondValue *big.Int `abi:"reduceBondValue"` WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + PreMigrationBalance *big.Int `abi:"preMigrationBalance"` Status rptypes.MinipoolStatus DepositType rptypes.MinipoolDeposit } diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 7a9392f16..f389ec98c 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -15,10 +15,11 @@ type NetworkContracts struct { RocketTokenRPL *rocketpool.Contract RocketTokenRPLFixedSupply *rocketpool.Contract RocketStorage *rocketpool.Contract + RocketMinipoolBondReducer *rocketpool.Contract } // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*NetworkContracts, error) { +func NewNetworkContracts(rp *rocketpool.RocketPool, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { contracts := &NetworkContracts{} var err error contracts.RocketNodeManager, err = rp.GetContract("rocketNodeManager", opts) @@ -51,5 +52,12 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*Netwo } contracts.RocketStorage = rp.RocketStorageContract + if isAtlasDeployed { + contracts.RocketMinipoolBondReducer, err = rp.GetContract("rocketMinipoolBondReducer", opts) + if err != nil { + return nil, err + } + } + return contracts, nil } diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 72c1ac71e..ef2bab183 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -21,8 +21,8 @@ const ( ) // Gets the details for a minipool using the efficient multicall contract -func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (minipool.NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, opts) +func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return minipool.NativeMinipoolDetails{}, err } @@ -38,7 +38,7 @@ func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress if err != nil { return minipool.NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) } - addMinipoolDetailsCalls(rp, contracts, mc, &details, minipoolAddress, version, opts) + addMinipoolDetailsCalls(rp, contracts, mc, &details, version, opts) _, err = mc.FlexibleCall(true) if err != nil { @@ -51,8 +51,8 @@ func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress } // Gets the minpool details for a node using the efficient multicall contract -func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, opts) +func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err } @@ -79,8 +79,8 @@ func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress } // Gets all minpool details using the efficient multicall contract -func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, opts) +func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { + contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err } @@ -251,6 +251,15 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, versions []uint8, balanceBatcher *multicall.BalanceBatcher, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { minipoolDetails := make([]minipool.NativeMinipoolDetails, len(addresses)) + // Get the balances of the minipools + balances, err := balanceBatcher.GetEthBalances(addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting minipool balances: %w", err) + } + for i := range minipoolDetails { + minipoolDetails[i].Balance = balances[i] + } + // Sync var wg errgroup.Group wg.SetLimit(threadLimit) @@ -276,7 +285,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac details := &minipoolDetails[j] details.MinipoolAddress = address - addMinipoolDetailsCalls(rp, contracts, mc, details, address, versions[j], opts) + addMinipoolDetailsCalls(rp, contracts, mc, details, versions[j], opts) } _, err = mc.FlexibleCall(true) if err != nil { @@ -291,13 +300,8 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac return nil, fmt.Errorf("error getting minipool details: %w", err) } - // Get the balances of the minipools and do the postprocessing on them - balances, err := balanceBatcher.GetEthBalances(addresses, opts) - if err != nil { - return nil, fmt.Errorf("error getting minipool balances: %w", err) - } + // Postprocess the minipools for i := range minipoolDetails { - minipoolDetails[i].Balance = balances[i] fixupMinipoolDetails(rp, &minipoolDetails[i], opts) } @@ -305,8 +309,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } // Add all of the calls for the minipool details to the multicaller -func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, address common.Address, version uint8, opts *bind.CallOpts) error { +func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { // Create the minipool contract binding + address := details.MinipoolAddress mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) if err != nil { return err @@ -316,6 +321,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra details.Version = mp.GetVersion() mc.AddCall(contracts.RocketMinipoolManager, &details.Exists, "getMinipoolExists", address) mc.AddCall(contracts.RocketMinipoolManager, &details.Pubkey, "getMinipoolPubkey", address) + mc.AddCall(contracts.RocketMinipoolManager, &details.WithdrawalCredentials, "getMinipoolWithdrawalCredentials", address) mc.AddCall(mpContract, &details.StatusRaw, "getStatus") mc.AddCall(mpContract, &details.StatusBlock, "getStatusBlock") mc.AddCall(mpContract, &details.StatusTime, "getStatusTime") @@ -333,22 +339,8 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.EffectiveDelegate, "getEffectiveDelegate") mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") - penaltyCountKey := crypto.Keccak256Hash([]byte("network.penalties.penalty"), address.Bytes()) - mc.AddCall(contracts.RocketStorage, &details.PenaltyCount, "getUint", penaltyCountKey) - - penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) - mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) - if version < 3 { - // UserDistributed is v3+ only - // Slashed is v3+ only - // LastBondReductionTime is v3+ only - // LastBondReductionPrevValue is v3+ only - // IsVacant is v3+ only - // NodeShareOfBalance is v3+ only - // ReduceBondTime is v3+ only - // ReduceBondCancelled is v3+ only - // ReduceBondValue is v3+ only + // These fields are all v3+ only details.UserDistributed = false details.Slashed = false details.LastBondReductionTime = big.NewInt(0) @@ -358,9 +350,27 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra details.ReduceBondTime = big.NewInt(0) details.ReduceBondCancelled = false details.ReduceBondValue = big.NewInt(0) + details.PreMigrationBalance = big.NewInt(0) + } else { + mc.AddCall(mpContract, &details.UserDistributed, "getUserDistributed") + mc.AddCall(mpContract, &details.Slashed, "getSlashed") + mc.AddCall(mpContract, &details.IsVacant, "getVacant") + mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", details.Balance) + mc.AddCall(mpContract, &details.PreMigrationBalance, "getPreMigrationBalance") + + // If v3 exists, RocketMinipoolBondReducer exists so this is safe + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondTime, "getReduceBondTime", address) + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondCancelled, "getReduceBondCancelled", address) + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionTime, "getLastBondReductionTime", address) + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionPrevValue, "getLastBondReductionPrevValue", address) + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondValue, "getReduceBondValue", address) } - mc.AddCall(contracts.RocketMinipoolManager, &details.WithdrawalCredentials, "getMinipoolWithdrawalCredentials", address) + penaltyCountKey := crypto.Keccak256Hash([]byte("network.penalties.penalty"), address.Bytes()) + mc.AddCall(contracts.RocketStorage, &details.PenaltyCount, "getUint", penaltyCountKey) + + penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) + mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) return nil } diff --git a/utils/state/node.go b/utils/state/node.go index acb5c1bf3..6100f6539 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -19,8 +19,8 @@ const ( ) // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) (node.NativeNodeDetails, error) { - contracts, err := NewNetworkContracts(rp, opts) +func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (node.NativeNodeDetails, error) { + contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return node.NativeNodeDetails{}, err } @@ -59,8 +59,8 @@ func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.A } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { - contracts, err := NewNetworkContracts(rp, opts) +func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { + contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err } From 2d4d323db18fbcf3f36e4f9c11c048254a60cd67 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 19:45:23 -0500 Subject: [PATCH 572/878] Removed the contract uber-getters --- minipool/minipool-constructor.go | 12 --- minipool/minipool-contract-v3.go | 1 - minipool/minipool.go | 136 ------------------------------- node/node.go | 79 ------------------ utils/state/minipool.go | 64 ++++++++++++--- utils/state/node.go | 51 +++++++++--- 6 files changed, 92 insertions(+), 251 deletions(-) diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index 767d74fd9..128175884 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -28,18 +28,6 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C } } -// Create a minipool binding from its native details -func NewMinipoolFromDetails(rp *rocketpool.RocketPool, mpd NativeMinipoolDetails, opts *bind.CallOpts) (Minipool, error) { - switch mpd.Version { - case 1, 2: - return newMinipool_v2(rp, mpd.MinipoolAddress) - case 3: - return newMinipool_v3(rp, mpd.MinipoolAddress, opts) - default: - return nil, fmt.Errorf("unexpected minipool contract version [%d]", mpd.Version) - } -} - // Create a minipool binding from an explicit version number func NewMinipoolFromVersion(rp *rocketpool.RocketPool, address common.Address, version uint8, opts *bind.CallOpts) (Minipool, error) { switch version { diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 8e177c350..0f1060c9b 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -27,7 +27,6 @@ type MinipoolV3 interface { GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) GetSlashed(opts *bind.CallOpts) (bool, error) - GetLastBondReductionTime(opts *bind.CallOpts) (*big.Int, error) } // Minipool contract diff --git a/minipool/minipool.go b/minipool/minipool.go index 482ecb2c6..b602aa5c5 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -38,50 +38,6 @@ type MinipoolCountsPerStatus struct { Dissolved *big.Int `abi:"dissolvedCount"` } -// Minipool details from the native getMinipoolDetails() function -type NativeMinipoolDetails struct { - Exists bool `abi:"exists"` - MinipoolAddress common.Address `abi:"minipoolAddress"` - Pubkey rptypes.ValidatorPubkey `abi:"pubkey"` - StatusRaw uint8 `abi:"status"` - StatusBlock *big.Int `abi:"statusBlock"` - StatusTime *big.Int `abi:"statusTime"` - Finalised bool `abi:"finalised"` - DepositTypeRaw uint8 `abi:"depositType"` - NodeFee *big.Int `abi:"nodeFee"` - NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` - NodeDepositAssigned bool `abi:"nodeDepositAssigned"` - UserDepositBalance *big.Int `abi:"userDepositBalance"` - UserDepositAssigned bool `abi:"userDepositAssigned"` - UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` - UseLatestDelegate bool `abi:"useLatestDelegate"` - Delegate common.Address `abi:"delegate"` - PreviousDelegate common.Address `abi:"previousDelegate"` - EffectiveDelegate common.Address `abi:"effectiveDelegate"` - PenaltyCount *big.Int `abi:"penaltyCount"` - PenaltyRate *big.Int `abi:"penaltyRate"` - UserDistributed bool `abi:"userDistributed"` - Slashed bool `abi:"slashed"` - NodeAddress common.Address `abi:"nodeAddress"` - LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` - LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` - IsVacant bool `abi:"vacant"` - Version uint8 `abi:"delegateVersion"` - Balance *big.Int `abi:"balance"` // Contract balance - NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) - ReduceBondTime *big.Int `abi:"reduceBondTime"` - ReduceBondCancelled bool `abi:"reduceBondCancelled"` - ReduceBondValue *big.Int `abi:"reduceBondValue"` - WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` - PreMigrationBalance *big.Int `abi:"preMigrationBalance"` - Status rptypes.MinipoolStatus - DepositType rptypes.MinipoolDeposit -} - -type nmdWrapper struct { - Details NativeMinipoolDetails -} - // Get all minipool details func GetMinipools(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]MinipoolDetails, error) { minipoolAddresses, err := GetMinipoolAddresses(rp, opts) @@ -100,98 +56,6 @@ func GetNodeMinipools(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return loadMinipoolDetails(rp, minipoolAddresses, opts) } -// Get the details for a minipool -func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (NativeMinipoolDetails, error) { - rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) - if err != nil { - return NativeMinipoolDetails{}, err - } - detailsWrapper := new(nmdWrapper) - if err := rocketMinipoolManager.Call(opts, detailsWrapper, "getMinipoolDetails", minipoolAddress); err != nil { - return NativeMinipoolDetails{}, fmt.Errorf("Could not get minipool %s details: %w", minipoolAddress.Hex(), err) - } - details := (*detailsWrapper).Details - details.Status = rptypes.MinipoolStatus(details.StatusRaw) - details.DepositType = rptypes.MinipoolDeposit(details.DepositTypeRaw) - return details, nil -} - -// Get the details for all of the minipools on a node -func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - // Get the minipool count - minipoolCount, err := GetNodeMinipoolCount(rp, nodeAddress, opts) - if err != nil { - return nil, err - } - totalDetails := make([]NativeMinipoolDetails, 0, minipoolCount) - - // Get the contract - rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) - if err != nil { - return nil, err - } - - // Get all of the minipools - index := uint64(0) - limit := big.NewInt(int64(NativeMinipoolDetailsBatchSize)) - for index < minipoolCount { - offset := big.NewInt(int64(index)) - - details := new([]NativeMinipoolDetails) - if err := rocketMinipoolManager.Call(opts, details, "getNodeMinipoolDetails", nodeAddress, offset, limit); err != nil { - return nil, fmt.Errorf("could not get minipool details for node %s from range %d to %d: %w", nodeAddress.Hex(), index, index+NativeMinipoolDetailsBatchSize, err) - } - - totalDetails = append(totalDetails, *details...) - index += NativeMinipoolDetailsBatchSize - } - - for _, mpd := range totalDetails { - mpd.Status = rptypes.MinipoolStatus(mpd.StatusRaw) - mpd.DepositType = rptypes.MinipoolDeposit(mpd.DepositTypeRaw) - } - - return totalDetails, nil -} - -// Get the details for all of the minipools -func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - // Get the minipool count - minipoolCount, err := GetMinipoolCount(rp, opts) - if err != nil { - return nil, err - } - totalDetails := make([]NativeMinipoolDetails, 0, minipoolCount) - - // Get the contract - rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) - if err != nil { - return nil, err - } - - // Get all of the minipools - index := uint64(0) - limit := big.NewInt(int64(NativeMinipoolDetailsBatchSize)) - for index < minipoolCount { - offset := big.NewInt(int64(index)) - - details := new([]NativeMinipoolDetails) - if err := rocketMinipoolManager.Call(opts, details, "getAllMinipoolDetails", offset, limit); err != nil { - return nil, fmt.Errorf("could not get minipool details from range %d to %d: %w", index, index+NativeMinipoolDetailsBatchSize, err) - } - - totalDetails = append(totalDetails, *details...) - index += NativeMinipoolDetailsBatchSize - } - - for _, mpd := range totalDetails { - mpd.Status = rptypes.MinipoolStatus(mpd.StatusRaw) - mpd.DepositType = rptypes.MinipoolDeposit(mpd.DepositTypeRaw) - } - - return totalDetails, nil -} - // Load minipool details func loadMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddresses []common.Address, opts *bind.CallOpts) ([]MinipoolDetails, error) { diff --git a/node/node.go b/node/node.go index 87eb2d7c0..9bd603b99 100644 --- a/node/node.go +++ b/node/node.go @@ -39,39 +39,6 @@ type NodeDetails struct { TimezoneLocation string `json:"timezoneLocation"` } -// Node details -type NativeNodeDetails struct { - Exists bool `abi:"exists"` - RegistrationTime *big.Int `abi:"registrationTime"` - TimezoneLocation string `abi:"timezoneLocation"` - FeeDistributorInitialised bool `abi:"feeDistributorInitialised"` - FeeDistributorAddress common.Address `abi:"feeDistributorAddress"` - RewardNetwork *big.Int `abi:"rewardNetwork"` - RplStake *big.Int `abi:"rplStake"` - EffectiveRPLStake *big.Int `abi:"effectiveRPLStake"` - MinimumRPLStake *big.Int `abi:"minimumRPLStake"` - MaximumRPLStake *big.Int `abi:"maximumRPLStake"` - EthMatched *big.Int `abi:"ethMatched"` - EthMatchedLimit *big.Int `abi:"ethMatchedLimit"` - MinipoolCount *big.Int `abi:"minipoolCount"` - BalanceETH *big.Int `abi:"balanceETH"` - BalanceRETH *big.Int `abi:"balanceRETH"` - BalanceRPL *big.Int `abi:"balanceRPL"` - BalanceOldRPL *big.Int `abi:"balanceOldRPL"` - DepositCreditBalance *big.Int `abi:"depositCreditBalance"` - DistributorBalanceUserETH *big.Int `abi:"distributorBalanceUserETH"` - DistributorBalanceNodeETH *big.Int `abi:"distributorBalanceNodeETH"` - WithdrawalAddress common.Address `abi:"withdrawalAddress"` - PendingWithdrawalAddress common.Address `abi:"pendingWithdrawalAddress"` - SmoothingPoolRegistrationState bool `abi:"smoothingPoolRegistrationState"` - SmoothingPoolRegistrationChanged *big.Int `abi:"smoothingPoolRegistrationChanged"` - NodeAddress common.Address `abi:"nodeAddress"` -} - -type nndWrapper struct { - Details NativeNodeDetails -} - // Count of nodes belonging to a timezone type TimezoneCount struct { Timezone string `abi:"timezone"` @@ -98,52 +65,6 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint return rocketpool.GetContractVersion(rp, *rocketNodeManager.Address, nil) } -// Get the details for a node -func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NativeNodeDetails, error) { - rocketNodeManager, err := getRocketNodeManager(rp, opts) - if err != nil { - return NativeNodeDetails{}, err - } - detailsWrapper := new(nndWrapper) - if err := rocketNodeManager.Call(opts, detailsWrapper, "getNodeDetails", nodeAddress); err != nil { - return NativeNodeDetails{}, fmt.Errorf("could not get details for node %s: %w", nodeAddress.Hex(), err) - } - return (*detailsWrapper).Details, nil -} - -// Get the details for every node in the network -func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { - // Get the node count - nodeCount, err := GetNodeCount(rp, opts) - if err != nil { - return nil, err - } - totalDetails := make([]NativeNodeDetails, 0, nodeCount) - - // Get the contract - rocketNodeManager, err := getRocketNodeManager(rp, opts) - if err != nil { - return nil, err - } - - // Get all of the nodes - index := uint64(0) - limit := big.NewInt(int64(NativeNodeDetailsBatchSize)) - for index < nodeCount { - offset := big.NewInt(int64(index)) - - details := new([]NativeNodeDetails) - if err := rocketNodeManager.Call(opts, details, "getAllNodeDetails", offset, limit); err != nil { - return nil, fmt.Errorf("could not get details for node range %d to %d: %w", index, index+NativeNodeDetailsBatchSize, err) - } - - totalDetails = append(totalDetails, *details...) - index += NativeNodeDetailsBatchSize - } - - return totalDetails, nil -} - // Get all node details func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { diff --git a/utils/state/minipool.go b/utils/state/minipool.go index ef2bab183..d248f1fd3 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -20,29 +20,69 @@ const ( minipoolVersionBatchSize int = 500 ) +// Complete details for a minipool +type NativeMinipoolDetails struct { + Exists bool `abi:"exists"` + MinipoolAddress common.Address `abi:"minipoolAddress"` + Pubkey types.ValidatorPubkey `abi:"pubkey"` + StatusRaw uint8 `abi:"status"` + StatusBlock *big.Int `abi:"statusBlock"` + StatusTime *big.Int `abi:"statusTime"` + Finalised bool `abi:"finalised"` + DepositTypeRaw uint8 `abi:"depositType"` + NodeFee *big.Int `abi:"nodeFee"` + NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` + NodeDepositAssigned bool `abi:"nodeDepositAssigned"` + UserDepositBalance *big.Int `abi:"userDepositBalance"` + UserDepositAssigned bool `abi:"userDepositAssigned"` + UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` + UseLatestDelegate bool `abi:"useLatestDelegate"` + Delegate common.Address `abi:"delegate"` + PreviousDelegate common.Address `abi:"previousDelegate"` + EffectiveDelegate common.Address `abi:"effectiveDelegate"` + PenaltyCount *big.Int `abi:"penaltyCount"` + PenaltyRate *big.Int `abi:"penaltyRate"` + UserDistributed bool `abi:"userDistributed"` + Slashed bool `abi:"slashed"` + NodeAddress common.Address `abi:"nodeAddress"` + LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` + LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` + IsVacant bool `abi:"vacant"` + Version uint8 `abi:"delegateVersion"` + Balance *big.Int `abi:"balance"` // Contract balance + NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) + ReduceBondTime *big.Int `abi:"reduceBondTime"` + ReduceBondCancelled bool `abi:"reduceBondCancelled"` + ReduceBondValue *big.Int `abi:"reduceBondValue"` + WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + PreMigrationBalance *big.Int `abi:"preMigrationBalance"` + Status types.MinipoolStatus + DepositType types.MinipoolDeposit +} + // Gets the details for a minipool using the efficient multicall contract -func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (minipool.NativeMinipoolDetails, error) { +func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (NativeMinipoolDetails, error) { contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { - return minipool.NativeMinipoolDetails{}, err + return NativeMinipoolDetails{}, err } - details := minipool.NativeMinipoolDetails{} + details := NativeMinipoolDetails{} details.MinipoolAddress = minipoolAddress mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) if err != nil { - return minipool.NativeMinipoolDetails{}, err + return NativeMinipoolDetails{}, err } version, err := rocketpool.GetContractVersion(rp, minipoolAddress, opts) if err != nil { - return minipool.NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) + return NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) } addMinipoolDetailsCalls(rp, contracts, mc, &details, version, opts) _, err = mc.FlexibleCall(true) if err != nil { - return minipool.NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) + return NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) } fixupMinipoolDetails(rp, &details, opts) @@ -51,7 +91,7 @@ func GetNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, minipoolAddress } // Gets the minpool details for a node using the efficient multicall contract -func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { +func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err @@ -79,7 +119,7 @@ func GetNodeNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress } // Gets all minpool details using the efficient multicall contract -func GetAllNativeMinipoolDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { +func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err @@ -248,8 +288,8 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra } // Get multiple minipool details at once -func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, versions []uint8, balanceBatcher *multicall.BalanceBatcher, opts *bind.CallOpts) ([]minipool.NativeMinipoolDetails, error) { - minipoolDetails := make([]minipool.NativeMinipoolDetails, len(addresses)) +func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, versions []uint8, balanceBatcher *multicall.BalanceBatcher, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { + minipoolDetails := make([]NativeMinipoolDetails, len(addresses)) // Get the balances of the minipools balances, err := balanceBatcher.GetEthBalances(addresses, opts) @@ -309,7 +349,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } // Add all of the calls for the minipool details to the multicaller -func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *minipool.NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { +func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { // Create the minipool contract binding address := details.MinipoolAddress mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) @@ -376,7 +416,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra } // Fixes a legacy minipool details struct with supplemental logic -func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *minipool.NativeMinipoolDetails, opts *bind.CallOpts) error { +func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *NativeMinipoolDetails, opts *bind.CallOpts) error { details.Status = types.MinipoolStatus(details.StatusRaw) details.DepositType = types.MinipoolDeposit(details.DepositTypeRaw) diff --git a/utils/state/node.go b/utils/state/node.go index 6100f6539..ff433d938 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -18,18 +18,47 @@ const ( nodeAddressBatchSize int = 2000 ) +// Complete details for a node +type NativeNodeDetails struct { + Exists bool `abi:"exists"` + RegistrationTime *big.Int `abi:"registrationTime"` + TimezoneLocation string `abi:"timezoneLocation"` + FeeDistributorInitialised bool `abi:"feeDistributorInitialised"` + FeeDistributorAddress common.Address `abi:"feeDistributorAddress"` + RewardNetwork *big.Int `abi:"rewardNetwork"` + RplStake *big.Int `abi:"rplStake"` + EffectiveRPLStake *big.Int `abi:"effectiveRPLStake"` + MinimumRPLStake *big.Int `abi:"minimumRPLStake"` + MaximumRPLStake *big.Int `abi:"maximumRPLStake"` + EthMatched *big.Int `abi:"ethMatched"` + EthMatchedLimit *big.Int `abi:"ethMatchedLimit"` + MinipoolCount *big.Int `abi:"minipoolCount"` + BalanceETH *big.Int `abi:"balanceETH"` + BalanceRETH *big.Int `abi:"balanceRETH"` + BalanceRPL *big.Int `abi:"balanceRPL"` + BalanceOldRPL *big.Int `abi:"balanceOldRPL"` + DepositCreditBalance *big.Int `abi:"depositCreditBalance"` + DistributorBalanceUserETH *big.Int `abi:"distributorBalanceUserETH"` + DistributorBalanceNodeETH *big.Int `abi:"distributorBalanceNodeETH"` + WithdrawalAddress common.Address `abi:"withdrawalAddress"` + PendingWithdrawalAddress common.Address `abi:"pendingWithdrawalAddress"` + SmoothingPoolRegistrationState bool `abi:"smoothingPoolRegistrationState"` + SmoothingPoolRegistrationChanged *big.Int `abi:"smoothingPoolRegistrationChanged"` + NodeAddress common.Address `abi:"nodeAddress"` +} + // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (node.NativeNodeDetails, error) { +func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (NativeNodeDetails, error) { contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { - return node.NativeNodeDetails{}, err + return NativeNodeDetails{}, err } - details := node.NativeNodeDetails{} + details := NativeNodeDetails{} details.NodeAddress = nodeAddress mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) if err != nil { - return node.NativeNodeDetails{}, err + return NativeNodeDetails{}, err } avgFee := big.NewInt(0) @@ -37,19 +66,19 @@ func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.A _, err = mc.FlexibleCall(true) if err != nil { - return node.NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) + return NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) } // Get the node's ETH balance details.BalanceETH, err = rp.Client.BalanceAt(context.Background(), nodeAddress, opts.BlockNumber) if err != nil { - return node.NativeNodeDetails{}, err + return NativeNodeDetails{}, err } // Get the distributor balance distributorBalance, err := rp.Client.BalanceAt(context.Background(), details.FeeDistributorAddress, opts.BlockNumber) if err != nil { - return node.NativeNodeDetails{}, err + return NativeNodeDetails{}, err } // Do some postprocessing on the node data @@ -59,7 +88,7 @@ func GetNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, nodeAddress common.A } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]node.NativeNodeDetails, error) { +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) if err != nil { return nil, err @@ -76,7 +105,7 @@ func GetAllNativeNodeDetails_Legacy(rp *rocketpool.RocketPool, multicallerAddres return nil, fmt.Errorf("error getting node addresses: %w", err) } count := len(addresses) - nodeDetails := make([]node.NativeNodeDetails, count) + nodeDetails := make([]NativeNodeDetails, count) avgFees := make([]*big.Int, count) // Sync @@ -189,7 +218,7 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Add all of the calls for the node details to the multicaller -func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *node.NativeNodeDetails, address common.Address, avgFee **big.Int) { +func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, avgFee **big.Int) { mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) mc.AddCall(contracts.RocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", address) mc.AddCall(contracts.RocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", address) @@ -212,7 +241,7 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, } // Fixes a legacy node details struct with supplemental logic -func fixupNodeDetails(rp *rocketpool.RocketPool, details *node.NativeNodeDetails, avgFee *big.Int, distributorBalance *big.Int, opts *bind.CallOpts) error { +func fixupNodeDetails(rp *rocketpool.RocketPool, details *NativeNodeDetails, avgFee *big.Int, distributorBalance *big.Int, opts *bind.CallOpts) error { // Fix the effective stake if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { details.EffectiveRPLStake.SetUint64(0) From 5e1fe5bae957dece90ea5c2b3b76169d7cb1df6f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 12 Feb 2023 21:01:22 -0500 Subject: [PATCH 573/878] Started porting NetworkDetails over --- utils/state/contracts.go | 36 +++-- utils/state/minipool.go | 23 +-- utils/state/network.go | 317 +++++++++++++++++++++++++++++++++++++++ utils/state/node.go | 14 +- 4 files changed, 350 insertions(+), 40 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index f389ec98c..380cee1c5 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -7,21 +7,39 @@ import ( // Container for network contracts type NetworkContracts struct { - RocketNodeManager *rocketpool.Contract - RocketNodeStaking *rocketpool.Contract - RocketMinipoolManager *rocketpool.Contract - RocketNodeDistributorFactory *rocketpool.Contract - RocketTokenRETH *rocketpool.Contract - RocketTokenRPL *rocketpool.Contract - RocketTokenRPLFixedSupply *rocketpool.Contract - RocketStorage *rocketpool.Contract - RocketMinipoolBondReducer *rocketpool.Contract + // Redstone + RocketDAOProtocolSettingsNode *rocketpool.Contract + RocketMinipoolManager *rocketpool.Contract + RocketNetworkPrices *rocketpool.Contract + RocketNodeDistributorFactory *rocketpool.Contract + RocketNodeManager *rocketpool.Contract + RocketNodeStaking *rocketpool.Contract + RocketRewardsPool *rocketpool.Contract + RocketStorage *rocketpool.Contract + RocketTokenRETH *rocketpool.Contract + RocketTokenRPL *rocketpool.Contract + RocketTokenRPLFixedSupply *rocketpool.Contract + + // Atlas + RocketMinipoolBondReducer *rocketpool.Contract } // Get a new network contracts container func NewNetworkContracts(rp *rocketpool.RocketPool, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { contracts := &NetworkContracts{} var err error + contracts.RocketRewardsPool, err = rp.GetContract("rocketRewardsPool", opts) + if err != nil { + return nil, err + } + contracts.RocketDAOProtocolSettingsNode, err = rp.GetContract("rocketDAOProtocolSettingsNode", opts) + if err != nil { + return nil, err + } + contracts.RocketNetworkPrices, err = rp.GetContract("rocketNetworkPrices", opts) + if err != nil { + return nil, err + } contracts.RocketNodeManager, err = rp.GetContract("rocketNodeManager", opts) if err != nil { return nil, err diff --git a/utils/state/minipool.go b/utils/state/minipool.go index d248f1fd3..04e62a18d 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -61,12 +61,7 @@ type NativeMinipoolDetails struct { } // Gets the details for a minipool using the efficient multicall contract -func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) - if err != nil { - return NativeMinipoolDetails{}, err - } - +func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (NativeMinipoolDetails, error) { details := NativeMinipoolDetails{} details.MinipoolAddress = minipoolAddress mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) @@ -91,12 +86,7 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common. } // Gets the minpool details for a node using the efficient multicall contract -func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) - if err != nil { - return nil, err - } - +func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) if err != nil { return nil, err @@ -119,12 +109,7 @@ func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common. } // Gets all minpool details using the efficient multicall contract -func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) - if err != nil { - return nil, err - } - +func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) if err != nil { return nil, err @@ -398,7 +383,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", details.Balance) mc.AddCall(mpContract, &details.PreMigrationBalance, "getPreMigrationBalance") - // If v3 exists, RocketMinipoolBondReducer exists so this is safe + // If minipool v3 exists, RocketMinipoolBondReducer exists so this is safe mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondTime, "getReduceBondTime", address) mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondCancelled, "getReduceBondCancelled", address) mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionTime, "getLastBondReductionTime", address) diff --git a/utils/state/network.go b/utils/state/network.go index 7bf2df5b4..435469dd2 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -1 +1,318 @@ package state + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/multicall" +) + +type NetworkDetails struct { + RplPrice *big.Int + MinCollateralFraction *big.Int + MaxCollateralFraction *big.Int + IntervalDuration time.Duration + IntervalStart time.Time + NodeOperatorRewardsPercent *big.Int + TrustedNodeOperatorRewardsPercent *big.Int + ProtocolDaoRewardsPercent *big.Int + PendingRPLRewards *big.Int + RewardIndex uint64 + PromotionScrubPeriod time.Duration + BondReductionWindowStart time.Duration + BondReductionWindowLength time.Duration + ScrubPeriod time.Duration + SmoothingPoolAddress common.Address + DepositPoolBalance *big.Int + DepositPoolExcess *big.Int + QueueCapacity minipool.QueueCapacity + RPLInflationIntervalRate *big.Int + RPLTotalSupply *big.Int + PricesBlock uint64 + LatestReportablePricesBlock uint64 + ETHUtilizationRate float64 + StakingETHBalance *big.Int + RETHExchangeRate float64 + TotalETHBalance *big.Int + RETHBalance *big.Int + TotalRETHSupply *big.Int + TotalRPLStake *big.Int + SmoothingPoolBalance *big.Int + NodeFee float64 +} + +// TODO: Finish this, involves porting e.g. GetClaimIntervalTime() over +func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (*NetworkDetails, error) { + + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return nil, err + } + + details := &NetworkDetails{} + + var rewardIndex *big.Int + mc.AddCall(contracts.RocketNetworkPrices, &details.RplPrice, "getRPLPrice") + mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MinCollateralFraction, "getMinimumPerMinipoolStake") + mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MaxCollateralFraction, "getMaximumPerMinipoolStake") + mc.AddCall(contracts.RocketRewardsPool, &rewardIndex, "getRewardIndex") + + details.RewardIndex = rewardIndex.Uint64() + + /* + wg.Go(func() error { + var err error + state.NetworkDetails.IntervalDuration, err = GetClaimIntervalTime(cfg, state.NetworkDetails.RewardIndex, rp, opts) + if err != nil { + return fmt.Errorf("error getting interval duration: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.IntervalStart, err = rewards.GetClaimIntervalTimeStart(rp, opts) + if err != nil { + return fmt.Errorf("error getting interval start: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.NodeOperatorRewardsPercent, err = GetNodeOperatorRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) + if err != nil { + return fmt.Errorf("error getting node operator rewards percent") + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.TrustedNodeOperatorRewardsPercent, err = GetTrustedNodeOperatorRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) + if err != nil { + return fmt.Errorf("error getting trusted node operator rewards percent") + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.ProtocolDaoRewardsPercent, err = GetProtocolDaoRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) + if err != nil { + return fmt.Errorf("error getting protocol DAO rewards percent") + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.PendingRPLRewards, err = GetPendingRPLRewards(cfg, state.NetworkDetails.RewardIndex, rp, opts) + if err != nil { + return fmt.Errorf("error getting pending RPL rewards") + } + return nil + }) + + if isAtlasDeployed { + wg.Go(func() error { + promotionScrubPeriodSeconds, err := trustednode.GetPromotionScrubPeriod(rp, opts) + if err != nil { + return fmt.Errorf("error getting promotion scrub period: %w", err) + } + state.NetworkDetails.PromotionScrubPeriod = time.Duration(promotionScrubPeriodSeconds) * time.Second + return nil + }) + + wg.Go(func() error { + windowStartRaw, err := trustednode.GetBondReductionWindowStart(rp, opts) + if err != nil { + return fmt.Errorf("error getting bond reduction window start: %w", err) + } + state.NetworkDetails.BondReductionWindowStart = time.Duration(windowStartRaw) * time.Second + return nil + }) + + wg.Go(func() error { + windowLengthRaw, err := trustednode.GetBondReductionWindowLength(rp, opts) + if err != nil { + return fmt.Errorf("error getting bond reduction window length: %w", err) + } + state.NetworkDetails.BondReductionWindowLength = time.Duration(windowLengthRaw) * time.Second + return nil + }) + } + + wg.Go(func() error { + scrubPeriodSeconds, err := trustednode.GetScrubPeriod(rp, opts) + if err != nil { + return fmt.Errorf("error getting scrub period: %w", err) + } + state.NetworkDetails.ScrubPeriod = time.Duration(scrubPeriodSeconds) * time.Second + return nil + }) + + wg.Go(func() error { + smoothingPoolContract, err := rp.GetContract("rocketSmoothingPool", opts) + if err != nil { + return fmt.Errorf("error getting smoothing pool contract: %w", err) + } + state.NetworkDetails.SmoothingPoolAddress = *smoothingPoolContract.Address + + state.NetworkDetails.SmoothingPoolBalance, err = rp.Client.BalanceAt(context.Background(), *smoothingPoolContract.Address, opts.BlockNumber) + if err != nil { + return fmt.Errorf("error getting smoothing pool balance: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.DepositPoolBalance, err = deposit.GetBalance(rp, opts) + if err != nil { + return fmt.Errorf("error getting deposit pool balance: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.DepositPoolExcess, err = deposit.GetExcessBalance(rp, opts) + if err != nil { + return fmt.Errorf("error getting deposit pool excess: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.QueueCapacity, err = minipool.GetQueueCapacity(rp, opts) + if err != nil { + return fmt.Errorf("error getting minipool queue capacity: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.RPLInflationIntervalRate, err = tokens.GetRPLInflationIntervalRate(rp, opts) + if err != nil { + return fmt.Errorf("error getting RPL inflation interval: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.RPLTotalSupply, err = tokens.GetRPLTotalSupply(rp, opts) + if err != nil { + return fmt.Errorf("error getting total RPL supply: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.PricesBlock, err = network.GetPricesBlock(rp, opts) + if err != nil { + return fmt.Errorf("error getting ETH1 prices block: %w", err) + } + return nil + }) + + wg.Go(func() error { + latestReportableBlock, err := network.GetLatestReportablePricesBlock(rp, opts) + if err != nil { + return fmt.Errorf("error getting ETH1 latest reportable block: %w", err) + } + state.NetworkDetails.LatestReportablePricesBlock = latestReportableBlock.Uint64() + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.ETHUtilizationRate, err = network.GetETHUtilizationRate(rp, opts) + if err != nil { + return fmt.Errorf("error getting ETH utilization rate: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.StakingETHBalance, err = network.GetStakingETHBalance(rp, opts) + if err != nil { + return fmt.Errorf("error getting total ETH staking balance: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.RETHExchangeRate, err = tokens.GetRETHExchangeRate(rp, opts) + if err != nil { + return fmt.Errorf("error getting ETH-rETH exchange rate: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.TotalETHBalance, err = network.GetTotalETHBalance(rp, opts) + if err != nil { + return fmt.Errorf("error getting total ETH balance (TVL): %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + rethAddress := cfg.Smartnode.GetRethAddress() + state.NetworkDetails.RETHBalance, err = rp.Client.BalanceAt(context.Background(), rethAddress, opts.BlockNumber) + if err != nil { + return fmt.Errorf("error getting ETH balance of rETH staking contract: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.TotalRETHSupply, err = tokens.GetRETHTotalSupply(rp, opts) + if err != nil { + return fmt.Errorf("error getting total rETH supply: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.TotalRPLStake, err = node.GetTotalRPLStake(rp, opts) + if err != nil { + return fmt.Errorf("error getting total amount of RPL staked on the network: %w", err) + } + return nil + }) + + wg.Go(func() error { + var err error + state.NetworkDetails.NodeFee, err = network.GetNodeFee(rp, opts) + if err != nil { + return fmt.Errorf("error getting current node fee for new minipools: %w", err) + } + return nil + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return err + } + + return nil + */ + + return details, nil +} diff --git a/utils/state/node.go b/utils/state/node.go index ff433d938..a8fe0cab9 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -48,12 +48,7 @@ type NativeNodeDetails struct { } // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (NativeNodeDetails, error) { - contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) - if err != nil { - return NativeNodeDetails{}, err - } - +func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (NativeNodeDetails, error) { details := NativeNodeDetails{} details.NodeAddress = nodeAddress mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) @@ -88,12 +83,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { - contracts, err := NewNetworkContracts(rp, isAtlasDeployed, opts) - if err != nil { - return nil, err - } - +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeNodeDetails, error) { balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) if err != nil { return nil, err From 649e103c00e2b91420c974d1fec5037628fefe2f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Feb 2023 00:02:30 -0500 Subject: [PATCH 574/878] Added some more fields to the details structs, fixed some Atlas logic --- network/balances.go | 13 ++++ utils/state/minipool.go | 136 +++++++++++++++++++++++++++------------- utils/state/network.go | 13 +++- utils/state/node.go | 22 ++++--- 4 files changed, 131 insertions(+), 53 deletions(-) diff --git a/network/balances.go b/network/balances.go index c0d81d54d..ce4eaf3b6 100644 --- a/network/balances.go +++ b/network/balances.go @@ -25,6 +25,19 @@ func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e return (*balancesBlock).Uint64(), nil } +// Get the block number which network balances are current for +func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return nil, fmt.Errorf("Could not get network balances block: %w", err) + } + return *balancesBlock, nil +} + // Get the current network total ETH balance func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 04e62a18d..ada72bcfe 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -22,42 +22,47 @@ const ( // Complete details for a minipool type NativeMinipoolDetails struct { - Exists bool `abi:"exists"` - MinipoolAddress common.Address `abi:"minipoolAddress"` - Pubkey types.ValidatorPubkey `abi:"pubkey"` - StatusRaw uint8 `abi:"status"` - StatusBlock *big.Int `abi:"statusBlock"` - StatusTime *big.Int `abi:"statusTime"` - Finalised bool `abi:"finalised"` - DepositTypeRaw uint8 `abi:"depositType"` - NodeFee *big.Int `abi:"nodeFee"` - NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` - NodeDepositAssigned bool `abi:"nodeDepositAssigned"` - UserDepositBalance *big.Int `abi:"userDepositBalance"` - UserDepositAssigned bool `abi:"userDepositAssigned"` - UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` - UseLatestDelegate bool `abi:"useLatestDelegate"` - Delegate common.Address `abi:"delegate"` - PreviousDelegate common.Address `abi:"previousDelegate"` - EffectiveDelegate common.Address `abi:"effectiveDelegate"` - PenaltyCount *big.Int `abi:"penaltyCount"` - PenaltyRate *big.Int `abi:"penaltyRate"` - UserDistributed bool `abi:"userDistributed"` - Slashed bool `abi:"slashed"` - NodeAddress common.Address `abi:"nodeAddress"` - LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` - LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` - IsVacant bool `abi:"vacant"` - Version uint8 `abi:"delegateVersion"` - Balance *big.Int `abi:"balance"` // Contract balance - NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) - ReduceBondTime *big.Int `abi:"reduceBondTime"` - ReduceBondCancelled bool `abi:"reduceBondCancelled"` - ReduceBondValue *big.Int `abi:"reduceBondValue"` - WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` - PreMigrationBalance *big.Int `abi:"preMigrationBalance"` - Status types.MinipoolStatus - DepositType types.MinipoolDeposit + // Redstone + Exists bool `abi:"exists"` + MinipoolAddress common.Address `abi:"minipoolAddress"` + Pubkey types.ValidatorPubkey `abi:"pubkey"` + StatusRaw uint8 `abi:"status"` + StatusBlock *big.Int `abi:"statusBlock"` + StatusTime *big.Int `abi:"statusTime"` + Finalised bool `abi:"finalised"` + DepositTypeRaw uint8 `abi:"depositType"` + NodeFee *big.Int `abi:"nodeFee"` + NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` + NodeDepositAssigned bool `abi:"nodeDepositAssigned"` + UserDepositBalance *big.Int `abi:"userDepositBalance"` + UserDepositAssigned bool `abi:"userDepositAssigned"` + UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` + UseLatestDelegate bool `abi:"useLatestDelegate"` + Delegate common.Address `abi:"delegate"` + PreviousDelegate common.Address `abi:"previousDelegate"` + EffectiveDelegate common.Address `abi:"effectiveDelegate"` + PenaltyCount *big.Int `abi:"penaltyCount"` + PenaltyRate *big.Int `abi:"penaltyRate"` + NodeAddress common.Address `abi:"nodeAddress"` + Version uint8 `abi:"delegateVersion"` + Balance *big.Int `abi:"balance"` // Contract balance + NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) + UserShareOfBalance *big.Int `abi:"userShare"` // Result of calculateUserShare(contract balance) + NodeRefundBalance *big.Int `abi:"nodeRefundBalance"` + WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + Status types.MinipoolStatus + DepositType types.MinipoolDeposit + + // Atlas + UserDistributed bool `abi:"userDistributed"` + Slashed bool `abi:"slashed"` + IsVacant bool `abi:"vacant"` + LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` + LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` + ReduceBondTime *big.Int `abi:"reduceBondTime"` + ReduceBondCancelled bool `abi:"reduceBondCancelled"` + ReduceBondValue *big.Int `abi:"reduceBondValue"` + PreMigrationBalance *big.Int `abi:"preMigrationBalance"` } // Gets the details for a minipool using the efficient multicall contract @@ -285,11 +290,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac minipoolDetails[i].Balance = balances[i] } - // Sync + // Round 1: most of the details var wg errgroup.Group wg.SetLimit(threadLimit) - - // Run the getters in batches count := len(addresses) for i := 0; i < count; i += legacyMinipoolBatchSize { i := i @@ -322,7 +325,40 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting minipool details: %w", err) + return nil, fmt.Errorf("error getting minipool details r1: %w", err) + } + + // Round 2: NodeShare and UserShare once the refund amount has been populated + var wg2 errgroup.Group + wg2.SetLimit(threadLimit) + for i := 0; i < count; i += legacyMinipoolBatchSize { + i := i + max := i + legacyMinipoolBatchSize + if max > count { + max = count + } + + wg2.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + details := &minipoolDetails[j] + addMinipoolShareCalls(rp, contracts, mc, details, versions[j], opts) + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + return nil + }) + } + + if err := wg2.Wait(); err != nil { + return nil, fmt.Errorf("error getting minipool details r2: %w", err) } // Postprocess the minipools @@ -363,6 +399,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.PreviousDelegate, "getPreviousDelegate") mc.AddCall(mpContract, &details.EffectiveDelegate, "getEffectiveDelegate") mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") + mc.AddCall(mpContract, &details.NodeRefundBalance, "getNodeRefundBalance") if version < 3 { // These fields are all v3+ only @@ -371,7 +408,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra details.LastBondReductionTime = big.NewInt(0) details.LastBondReductionPrevValue = big.NewInt(0) details.IsVacant = false - details.NodeShareOfBalance = big.NewInt(0) details.ReduceBondTime = big.NewInt(0) details.ReduceBondCancelled = false details.ReduceBondValue = big.NewInt(0) @@ -380,7 +416,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.UserDistributed, "getUserDistributed") mc.AddCall(mpContract, &details.Slashed, "getSlashed") mc.AddCall(mpContract, &details.IsVacant, "getVacant") - mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", details.Balance) mc.AddCall(mpContract, &details.PreMigrationBalance, "getPreMigrationBalance") // If minipool v3 exists, RocketMinipoolBondReducer exists so this is safe @@ -400,6 +435,23 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra return nil } +// Add the calls for the minipool node and user share to the multicaller +func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { + // Create the minipool contract binding + address := details.MinipoolAddress + mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) + if err != nil { + return err + } + mpContract := mp.GetContract() + + properBalance := big.NewInt(0).Sub(details.Balance, details.NodeRefundBalance) + mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", properBalance) + mc.AddCall(mpContract, &details.UserShareOfBalance, "calculateUserShare", properBalance) + + return nil +} + // Fixes a legacy minipool details struct with supplemental logic func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *NativeMinipoolDetails, opts *bind.CallOpts) error { diff --git a/utils/state/network.go b/utils/state/network.go index 435469dd2..66617c926 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -12,6 +12,7 @@ import ( ) type NetworkDetails struct { + // Redstone RplPrice *big.Int MinCollateralFraction *big.Int MaxCollateralFraction *big.Int @@ -22,9 +23,6 @@ type NetworkDetails struct { ProtocolDaoRewardsPercent *big.Int PendingRPLRewards *big.Int RewardIndex uint64 - PromotionScrubPeriod time.Duration - BondReductionWindowStart time.Duration - BondReductionWindowLength time.Duration ScrubPeriod time.Duration SmoothingPoolAddress common.Address DepositPoolBalance *big.Int @@ -43,6 +41,15 @@ type NetworkDetails struct { TotalRPLStake *big.Int SmoothingPoolBalance *big.Int NodeFee float64 + BalancesBlock *big.Int + LatestReportableBalancesBlock *big.Int + SubmitBalancesEnabled bool + + // Atlas + PromotionScrubPeriod time.Duration + BondReductionWindowStart time.Duration + BondReductionWindowLength time.Duration + DepositPoolUserBalance *big.Int } // TODO: Finish this, involves porting e.g. GetClaimIntervalTime() over diff --git a/utils/state/node.go b/utils/state/node.go index a8fe0cab9..fc654c988 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -241,14 +241,20 @@ func fixupNodeDetails(rp *rocketpool.RocketPool, details *NativeNodeDetails, avg if distributorBalance.Cmp(zero) > 0 { halfBalance := big.NewInt(0) halfBalance.Div(distributorBalance, two) - nodeShare := big.NewInt(0) - nodeShare.Mul(halfBalance, avgFee) - nodeShare.Div(nodeShare, oneInWei) - nodeShare.Add(nodeShare, halfBalance) - details.DistributorBalanceNodeETH = nodeShare - userShare := big.NewInt(0) - userShare.Sub(distributorBalance, nodeShare) - details.DistributorBalanceUserETH = userShare + if details.MinipoolCount.Cmp(zero) == 0 { + // Split it 50/50 if there are no minipools + details.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) + details.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) + } else { + nodeShare := big.NewInt(0) + nodeShare.Mul(halfBalance, avgFee) + nodeShare.Div(nodeShare, oneInWei) + nodeShare.Add(nodeShare, halfBalance) + details.DistributorBalanceNodeETH = nodeShare + userShare := big.NewInt(0) + userShare.Sub(distributorBalance, nodeShare) + details.DistributorBalanceUserETH = userShare + } } return nil From ee0a4b6acc7e73692ad6d54aa7a3052a8e45f593 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Feb 2023 00:31:41 -0500 Subject: [PATCH 575/878] Moved Slashed from the v3 delegate to minipool manager --- minipool/minipool-contract-v3.go | 10 ---------- minipool/minipool.go | 13 +++++++++++++ utils/state/minipool.go | 3 +-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 0f1060c9b..8a26f6d6d 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -26,7 +26,6 @@ type MinipoolV3 interface { Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) - GetSlashed(opts *bind.CallOpts) (bool, error) } // Minipool contract @@ -357,15 +356,6 @@ func (mp *minipool_v3) GetUserDistributed(opts *bind.CallOpts) (bool, error) { return *distributed, nil } -// Check if the minipool's RPL has been slashed -func (mp *minipool_v3) GetSlashed(opts *bind.CallOpts) (bool, error) { - slashed := new(bool) - if err := mp.Contract.Call(opts, slashed, "getSlashed"); err != nil { - return false, fmt.Errorf("Could not get slashed status for minipool %s: %w", mp.Address.Hex(), err) - } - return *slashed, nil -} - // Estimate the gas of DistributeBalance func (mp *minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") diff --git a/minipool/minipool.go b/minipool/minipool.go index b602aa5c5..dec97a1b7 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -576,6 +576,19 @@ func GetVacantMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.Cal return *vacantMinipoolAddress, nil } +// Get a minipool's RPL slashing status +func GetMinipoolRPLSlashed(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketMinipoolManager.Call(opts, value, "getMinipoolRPLSlashed", minipoolAddress); err != nil { + return false, fmt.Errorf("Could not get minipool %s slashed status: %w", minipoolAddress.Hex(), err) + } + return *value, nil +} + // Get contracts var rocketMinipoolManagerLock sync.Mutex diff --git a/utils/state/minipool.go b/utils/state/minipool.go index ada72bcfe..9f65fb13b 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -383,6 +383,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(contracts.RocketMinipoolManager, &details.Exists, "getMinipoolExists", address) mc.AddCall(contracts.RocketMinipoolManager, &details.Pubkey, "getMinipoolPubkey", address) mc.AddCall(contracts.RocketMinipoolManager, &details.WithdrawalCredentials, "getMinipoolWithdrawalCredentials", address) + mc.AddCall(contracts.RocketMinipoolManager, &details.Slashed, "getMinipoolRPLSlashed", address) mc.AddCall(mpContract, &details.StatusRaw, "getStatus") mc.AddCall(mpContract, &details.StatusBlock, "getStatusBlock") mc.AddCall(mpContract, &details.StatusTime, "getStatusTime") @@ -404,7 +405,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra if version < 3 { // These fields are all v3+ only details.UserDistributed = false - details.Slashed = false details.LastBondReductionTime = big.NewInt(0) details.LastBondReductionPrevValue = big.NewInt(0) details.IsVacant = false @@ -414,7 +414,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra details.PreMigrationBalance = big.NewInt(0) } else { mc.AddCall(mpContract, &details.UserDistributed, "getUserDistributed") - mc.AddCall(mpContract, &details.Slashed, "getSlashed") mc.AddCall(mpContract, &details.IsVacant, "getVacant") mc.AddCall(mpContract, &details.PreMigrationBalance, "getPreMigrationBalance") From 3ae9e28c54834dc4ddd4d9dfaf9042b6a1e52af3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 13 Feb 2023 04:55:08 -0500 Subject: [PATCH 576/878] Added some more fields to NetworkDetails --- settings/protocol/minipool.go | 13 +++++++++++++ utils/state/network.go | 2 ++ 2 files changed, 15 insertions(+) diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 63ba43354..dcf21d912 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -128,6 +128,19 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (t seconds := time.Duration((*value).Int64()) * time.Second return seconds, nil } + +// Timeout period in seconds for prelaunch minipools to launch +func GetMinipoolLaunchTimeoutRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { + return nil, fmt.Errorf("Could not get minipool launch timeout: %w", err) + } + return *value, nil +} func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, opts *bind.TransactOpts) (common.Hash, error) { return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) } diff --git a/utils/state/network.go b/utils/state/network.go index 66617c926..7bce109ac 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -44,6 +44,8 @@ type NetworkDetails struct { BalancesBlock *big.Int LatestReportableBalancesBlock *big.Int SubmitBalancesEnabled bool + SubmitPricesEnabled bool + MinipoolLaunchTimeout *big.Int // Atlas PromotionScrubPeriod time.Duration From 59fdff4d389757d34eb1b5cc7feb19235e96ec6d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 14 Feb 2023 22:40:31 -0500 Subject: [PATCH 577/878] Fixed a null int bug --- utils/state/node.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/state/node.go b/utils/state/node.go index fc654c988..584ca71c1 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -255,6 +255,9 @@ func fixupNodeDetails(rp *rocketpool.RocketPool, details *NativeNodeDetails, avg userShare.Sub(distributorBalance, nodeShare) details.DistributorBalanceUserETH = userShare } + } else { + details.DistributorBalanceNodeETH = big.NewInt(0) + details.DistributorBalanceUserETH = big.NewInt(0) } return nil From 2d4f71d0df6c58c9a40c524b577cfa3f3ff239bb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 14 Feb 2023 22:58:23 -0500 Subject: [PATCH 578/878] Added DepositWithCredit --- node/deposit.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/node/deposit.go b/node/deposit.go index ad7abbd59..f3fd6cc60 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -36,6 +36,28 @@ func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee floa return tx, nil } +// Estimate the gas of DepositWithCredit +func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) +} + +// Make a node deposit by using the credit balance +func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + if err != nil { + return nil, fmt.Errorf("Could not make node deposit with credit: %w", err) + } + return tx, nil +} + // Estimate the gas of CreateVacantMinipool func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) From 2f49aad985077d2aa506bbd1d65ceb3b38f51d94 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 15 Feb 2023 16:46:56 -0500 Subject: [PATCH 579/878] Added call opts to GetCurrentVersion --- utils/version-checker.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/version-checker.go b/utils/version-checker.go index 58d07223a..8a4988a6b 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -3,15 +3,16 @@ package utils import ( "fmt" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/hashicorp/go-version" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" ) -func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { +func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { // Check for v1.2 - nodeStakingVersion, err := node.GetNodeStakingVersion(rp, nil) + nodeStakingVersion, err := node.GetNodeStakingVersion(rp, opts) if err != nil { return nil, fmt.Errorf("error checking node staking version: %w", err) } @@ -20,7 +21,7 @@ func GetCurrentVersion(rp *rocketpool.RocketPool) (*version.Version, error) { } // Check for v1.1 - nodeMgrVersion, err := node.GetNodeManagerVersion(rp, nil) + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) if err != nil { return nil, fmt.Errorf("error checking node manager version: %w", err) } From 17760a924bd8049e38b0124097e9b53a4d3a851f Mon Sep 17 00:00:00 2001 From: Nick Doherty Date: Thu, 16 Feb 2023 10:56:17 +1000 Subject: [PATCH 580/878] added missing getStakingMinipoolsCount --- minipool/minipool.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index 54289eb33..e1c330322 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -307,6 +307,19 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e return (*minipoolCount).Uint64(), nil } +// Get the number of staking minipools in the network +func GetStakingMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return 0, err + } + minipoolCount := new(*big.Int) + if err := rocketMinipoolManager.Call(opts, minipoolCount, "getStakingMinipoolCount"); err != nil { + return 0, fmt.Errorf("Could not get staking minipool count: %w", err) + } + return (*minipoolCount).Uint64(), nil +} + // Get the number of finalised minipools in the network func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) From d6ecf0f3bee0344ae02a13cf5738d6bbc3e56db0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 16 Feb 2023 00:15:36 -0500 Subject: [PATCH 581/878] Added CalculateCompleteMinipoolShares() --- utils/state/minipool.go | 161 ++++++++++++++++++++++++++++------------ 1 file changed, 115 insertions(+), 46 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 9f65fb13b..1a454988a 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -15,43 +15,46 @@ import ( ) const ( - legacyMinipoolBatchSize int = 200 - minipoolAddressBatchSize int = 2000 - minipoolVersionBatchSize int = 500 + minipoolBatchSize int = 200 + minipoolCompleteShareBatchSize int = 1000 + minipoolAddressBatchSize int = 2000 + minipoolVersionBatchSize int = 500 ) // Complete details for a minipool type NativeMinipoolDetails struct { // Redstone - Exists bool `abi:"exists"` - MinipoolAddress common.Address `abi:"minipoolAddress"` - Pubkey types.ValidatorPubkey `abi:"pubkey"` - StatusRaw uint8 `abi:"status"` - StatusBlock *big.Int `abi:"statusBlock"` - StatusTime *big.Int `abi:"statusTime"` - Finalised bool `abi:"finalised"` - DepositTypeRaw uint8 `abi:"depositType"` - NodeFee *big.Int `abi:"nodeFee"` - NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` - NodeDepositAssigned bool `abi:"nodeDepositAssigned"` - UserDepositBalance *big.Int `abi:"userDepositBalance"` - UserDepositAssigned bool `abi:"userDepositAssigned"` - UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` - UseLatestDelegate bool `abi:"useLatestDelegate"` - Delegate common.Address `abi:"delegate"` - PreviousDelegate common.Address `abi:"previousDelegate"` - EffectiveDelegate common.Address `abi:"effectiveDelegate"` - PenaltyCount *big.Int `abi:"penaltyCount"` - PenaltyRate *big.Int `abi:"penaltyRate"` - NodeAddress common.Address `abi:"nodeAddress"` - Version uint8 `abi:"delegateVersion"` - Balance *big.Int `abi:"balance"` // Contract balance - NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) - UserShareOfBalance *big.Int `abi:"userShare"` // Result of calculateUserShare(contract balance) - NodeRefundBalance *big.Int `abi:"nodeRefundBalance"` - WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` - Status types.MinipoolStatus - DepositType types.MinipoolDeposit + Exists bool `abi:"exists"` + MinipoolAddress common.Address `abi:"minipoolAddress"` + Pubkey types.ValidatorPubkey `abi:"pubkey"` + StatusRaw uint8 `abi:"status"` + StatusBlock *big.Int `abi:"statusBlock"` + StatusTime *big.Int `abi:"statusTime"` + Finalised bool `abi:"finalised"` + DepositTypeRaw uint8 `abi:"depositType"` + NodeFee *big.Int `abi:"nodeFee"` + NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` + NodeDepositAssigned bool `abi:"nodeDepositAssigned"` + UserDepositBalance *big.Int `abi:"userDepositBalance"` + UserDepositAssigned bool `abi:"userDepositAssigned"` + UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` + UseLatestDelegate bool `abi:"useLatestDelegate"` + Delegate common.Address `abi:"delegate"` + PreviousDelegate common.Address `abi:"previousDelegate"` + EffectiveDelegate common.Address `abi:"effectiveDelegate"` + PenaltyCount *big.Int `abi:"penaltyCount"` + PenaltyRate *big.Int `abi:"penaltyRate"` + NodeAddress common.Address `abi:"nodeAddress"` + Version uint8 `abi:"delegateVersion"` + Balance *big.Int `abi:"balance"` // Contract balance + NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) + UserShareOfBalance *big.Int `abi:"userShare"` // Result of calculateUserShare(contract balance) + NodeRefundBalance *big.Int `abi:"nodeRefundBalance"` + WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + Status types.MinipoolStatus + DepositType types.MinipoolDeposit + NodeShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this + UserShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this // Atlas UserDistributed bool `abi:"userDistributed"` @@ -78,7 +81,8 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common. if err != nil { return NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) } - addMinipoolDetailsCalls(rp, contracts, mc, &details, version, opts) + details.Version = version + addMinipoolDetailsCalls(rp, contracts, mc, &details, opts) _, err = mc.FlexibleCall(true) if err != nil { @@ -136,6 +140,64 @@ func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, multicallerAddress c return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, versions, balanceBatcher, opts) } +// Calculate the node and user shares of the total minipool balance, including the portion on the Beacon chain +func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, minipoolDetails []*NativeMinipoolDetails, beaconBalances []*big.Int, opts *bind.CallOpts) error { + var wg errgroup.Group + wg.SetLimit(threadLimit) + count := len(minipoolDetails) + for i := 0; i < count; i += minipoolCompleteShareBatchSize { + i := i + max := i + minipoolCompleteShareBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + + // Make the minipool contract + details := minipoolDetails[j] + mp, err := minipool.NewMinipoolFromVersion(rp, details.MinipoolAddress, details.Version, opts) + if err != nil { + return err + } + mpContract := mp.GetContract() + + // Calculate the total balance + totalBalance := big.NewInt(0).Set(beaconBalances[j]) // Total balance = beacon balance + totalBalance.Add(totalBalance, details.Balance) // Add contract balance + totalBalance.Sub(totalBalance, details.NodeRefundBalance) // Remove node refund + + // Calculate the node and user shares + if totalBalance.Cmp(zero) >= 0 { + mc.AddCall(mpContract, &details.NodeShareOfBalanceIncludingBeacon, "calculateNodeShare", totalBalance) + mc.AddCall(mpContract, &details.UserShareOfBalanceIncludingBeacon, "calculateUserShare", totalBalance) + } else { + details.NodeShareOfBalanceIncludingBeacon = big.NewInt(0) + details.UserShareOfBalanceIncludingBeacon = big.NewInt(0) + } + } + _, err = mc.FlexibleCall(true) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + return nil + }) + } + + if err := wg.Wait(); err != nil { + return fmt.Errorf("error calculating minipool shares: %w", err) + } + + return nil +} + // Get all minipool addresses using the multicaller func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count @@ -294,9 +356,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac var wg errgroup.Group wg.SetLimit(threadLimit) count := len(addresses) - for i := 0; i < count; i += legacyMinipoolBatchSize { + for i := 0; i < count; i += minipoolBatchSize { i := i - max := i + legacyMinipoolBatchSize + max := i + minipoolBatchSize if max > count { max = count } @@ -312,8 +374,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac address := addresses[j] details := &minipoolDetails[j] details.MinipoolAddress = address + details.Version = versions[j] - addMinipoolDetailsCalls(rp, contracts, mc, details, versions[j], opts) + addMinipoolDetailsCalls(rp, contracts, mc, details, opts) } _, err = mc.FlexibleCall(true) if err != nil { @@ -331,9 +394,9 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac // Round 2: NodeShare and UserShare once the refund amount has been populated var wg2 errgroup.Group wg2.SetLimit(threadLimit) - for i := 0; i < count; i += legacyMinipoolBatchSize { + for i := 0; i < count; i += minipoolBatchSize { i := i - max := i + legacyMinipoolBatchSize + max := i + minipoolBatchSize if max > count { max = count } @@ -346,7 +409,8 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } for j := i; j < max; j++ { details := &minipoolDetails[j] - addMinipoolShareCalls(rp, contracts, mc, details, versions[j], opts) + details.Version = versions[j] + addMinipoolShareCalls(rp, contracts, mc, details, opts) } _, err = mc.FlexibleCall(true) if err != nil { @@ -370,10 +434,10 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac } // Add all of the calls for the minipool details to the multicaller -func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { +func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, opts *bind.CallOpts) error { // Create the minipool contract binding address := details.MinipoolAddress - mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) + mp, err := minipool.NewMinipoolFromVersion(rp, address, details.Version, opts) if err != nil { return err } @@ -402,7 +466,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.NodeAddress, "getNodeAddress") mc.AddCall(mpContract, &details.NodeRefundBalance, "getNodeRefundBalance") - if version < 3 { + if details.Version < 3 { // These fields are all v3+ only details.UserDistributed = false details.LastBondReductionTime = big.NewInt(0) @@ -435,18 +499,23 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra } // Add the calls for the minipool node and user share to the multicaller -func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, version uint8, opts *bind.CallOpts) error { +func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, opts *bind.CallOpts) error { // Create the minipool contract binding address := details.MinipoolAddress - mp, err := minipool.NewMinipoolFromVersion(rp, address, version, opts) + mp, err := minipool.NewMinipoolFromVersion(rp, address, details.Version, opts) if err != nil { return err } mpContract := mp.GetContract() properBalance := big.NewInt(0).Sub(details.Balance, details.NodeRefundBalance) - mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", properBalance) - mc.AddCall(mpContract, &details.UserShareOfBalance, "calculateUserShare", properBalance) + if properBalance.Cmp(zero) >= 0 { + mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", properBalance) + mc.AddCall(mpContract, &details.UserShareOfBalance, "calculateUserShare", properBalance) + } else { + details.NodeShareOfBalance = big.NewInt(0) + details.UserShareOfBalance = big.NewInt(0) + } return nil } From 2c0e8923c5e9d790635b242fd6f59df969cdf710 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 16 Feb 2023 14:27:05 -0500 Subject: [PATCH 582/878] Added credit balance to nodes in the state getter --- utils/state/contracts.go | 5 +++++ utils/state/node.go | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 380cee1c5..399ca46e2 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -11,6 +11,7 @@ type NetworkContracts struct { RocketDAOProtocolSettingsNode *rocketpool.Contract RocketMinipoolManager *rocketpool.Contract RocketNetworkPrices *rocketpool.Contract + RocketNodeDeposit *rocketpool.Contract RocketNodeDistributorFactory *rocketpool.Contract RocketNodeManager *rocketpool.Contract RocketNodeStaking *rocketpool.Contract @@ -68,6 +69,10 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, isAtlasDeployed bool, opts * if err != nil { return nil, err } + contracts.RocketNodeDeposit, err = rp.GetContract("rocketNodeDeposit", opts) + if err != nil { + return nil, err + } contracts.RocketStorage = rp.RocketStorageContract if isAtlasDeployed { diff --git a/utils/state/node.go b/utils/state/node.go index 584ca71c1..fce47f083 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -48,7 +48,7 @@ type NativeNodeDetails struct { } // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (NativeNodeDetails, error) { +func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) (NativeNodeDetails, error) { details := NativeNodeDetails{} details.NodeAddress = nodeAddress mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) @@ -57,7 +57,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, } avgFee := big.NewInt(0) - addNodeDetailsCalls(contracts, mc, &details, nodeAddress, &avgFee) + addNodeDetailsCalls(contracts, mc, &details, nodeAddress, &avgFee, isAtlasDeployed) _, err = mc.FlexibleCall(true) if err != nil { @@ -83,7 +83,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeNodeDetails, error) { +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) if err != nil { return nil, err @@ -122,7 +122,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo details.NodeAddress = address avgFees[j] = big.NewInt(0) - addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j]) + addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j], isAtlasDeployed) } _, err = mc.FlexibleCall(true) if err != nil { @@ -208,7 +208,7 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Add all of the calls for the node details to the multicaller -func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, avgFee **big.Int) { +func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, avgFee **big.Int, isAtlasDeployed bool) { mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) mc.AddCall(contracts.RocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", address) mc.AddCall(contracts.RocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", address) @@ -228,6 +228,10 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketStorage, &details.PendingWithdrawalAddress, "getNodePendingWithdrawalAddress", address) mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationState, "getSmoothingPoolRegistrationState", address) mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationChanged, "getSmoothingPoolRegistrationChanged", address) + + if isAtlasDeployed { + mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) + } } // Fixes a legacy node details struct with supplemental logic From 7b449994f1aad8b451d7addca0ee1d002ab46ffd Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 16 Feb 2023 21:46:00 -0500 Subject: [PATCH 583/878] Enable opts on multicall --- utils/multicall/multicaller.go | 9 +++++---- utils/state/minipool.go | 14 +++++++------- utils/state/node.go | 6 +++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/utils/multicall/multicaller.go b/utils/multicall/multicaller.go index 8ca2e9725..ec03c5e27 100644 --- a/utils/multicall/multicaller.go +++ b/utils/multicall/multicaller.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -75,7 +76,7 @@ func (caller *MultiCaller) AddCall(contract *rocketpool.Contract, output interfa return nil } -func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) { +func (caller *MultiCaller) Execute(requireSuccess bool, opts *bind.CallOpts) ([]CallResponse, error) { var multiCalls = make([]MultiCall, 0, len(caller.calls)) for _, call := range caller.calls { multiCalls = append(multiCalls, call.GetMultiCall()) @@ -85,7 +86,7 @@ func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) return nil, err } - resp, err := caller.Client.CallContract(context.Background(), ethereum.CallMsg{To: &caller.ContractAddress, Data: callData}, nil) + resp, err := caller.Client.CallContract(context.Background(), ethereum.CallMsg{To: &caller.ContractAddress, Data: callData}, opts.BlockNumber) if err != nil { return nil, err } @@ -108,9 +109,9 @@ func (caller *MultiCaller) Execute(requireSuccess bool) ([]CallResponse, error) return results, nil } -func (caller *MultiCaller) FlexibleCall(requireSuccess bool) ([]Result, error) { +func (caller *MultiCaller) FlexibleCall(requireSuccess bool, opts *bind.CallOpts) ([]Result, error) { res := make([]Result, len(caller.calls)) - results, err := caller.Execute(requireSuccess) + results, err := caller.Execute(requireSuccess, opts) if err != nil { caller.calls = []Call{} return nil, err diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 1a454988a..94f77577f 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -84,7 +84,7 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common. details.Version = version addMinipoolDetailsCalls(rp, contracts, mc, &details, opts) - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) } @@ -182,7 +182,7 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo details.UserShareOfBalanceIncludingBeacon = big.NewInt(0) } } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -229,7 +229,7 @@ func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkC for j := i; j < max; j++ { mc.AddCall(contracts.RocketMinipoolManager, &addresses[j], "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(j))) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -275,7 +275,7 @@ func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkCo for j := i; j < max; j++ { mc.AddCall(contracts.RocketMinipoolManager, &addresses[j], "getMinipoolAt", big.NewInt(int64(j))) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -319,7 +319,7 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra } mc.AddCall(contract, &versions[j], "version") } - results, err := mc.FlexibleCall(false) // Allow calls to fail - necessary for Prater + results, err := mc.FlexibleCall(false, opts) // Allow calls to fail - necessary for Prater for j, result := range results { if !result.Success { versions[j+i] = 1 // Anything that failed the version check didn't have the method yet so it must be v1 @@ -378,7 +378,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac addMinipoolDetailsCalls(rp, contracts, mc, details, opts) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -412,7 +412,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac details.Version = versions[j] addMinipoolShareCalls(rp, contracts, mc, details, opts) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } diff --git a/utils/state/node.go b/utils/state/node.go index fce47f083..f05ed80d3 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -59,7 +59,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, avgFee := big.NewInt(0) addNodeDetailsCalls(contracts, mc, &details, nodeAddress, &avgFee, isAtlasDeployed) - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) } @@ -124,7 +124,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo avgFees[j] = big.NewInt(0) addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j], isAtlasDeployed) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } @@ -192,7 +192,7 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts for j := i; j < max; j++ { mc.AddCall(contracts.RocketNodeManager, &addresses[j], "getNodeAt", big.NewInt(int64(j))) } - _, err = mc.FlexibleCall(true) + _, err = mc.FlexibleCall(true, opts) if err != nil { return fmt.Errorf("error executing multicall: %w", err) } From 629b1ee39d4756f3fff7956ba27bd7ed9824792e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Feb 2023 03:49:05 -0500 Subject: [PATCH 584/878] Added GetTotalEffectiveRplStake() --- utils/state/network.go | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/utils/state/network.go b/utils/state/network.go index 7bce109ac..ddf7220f6 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -1,6 +1,7 @@ package state import ( + "fmt" "math/big" "time" @@ -9,6 +10,11 @@ import ( "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + networkEffectiveStakeBatchSize int = 2000 ) type NetworkDetails struct { @@ -325,3 +331,61 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common return details, nil } + +// Gets the details for a node using the efficient multicall contract +func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (*big.Int, error) { + // Get the list of node addresses + addresses, err := getNodeAddressesFast(rp, contracts, multicallerAddress, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + count := len(addresses) + minimumStakes := make([]*big.Int, count) + effectiveStakes := make([]*big.Int, count) + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + + // Run the getters in batches + for i := 0; i < count; i += networkEffectiveStakeBatchSize { + i := i + max := i + networkEffectiveStakeBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + address := addresses[j] + mc.AddCall(contracts.RocketNodeStaking, &minimumStakes[j], "getNodeMinimumRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &effectiveStakes[j], "getNodeEffectiveRPLStake", address) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting effective stakes for all nodes: %w", err) + } + + totalEffectiveStake := big.NewInt(0) + for i, effectiveStake := range effectiveStakes { + minimumStake := minimumStakes[i] + // Fix the effective stake + if effectiveStake.Cmp(minimumStake) >= 0 { + totalEffectiveStake.Add(totalEffectiveStake, effectiveStake) + } + } + + return totalEffectiveStake, nil +} From b7b3436ef638d7c393d9214a9ae33263ebe28374 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Feb 2023 17:07:42 -0500 Subject: [PATCH 585/878] More work porting over GetNetworkDetails --- utils/state/contracts.go | 65 +++++++-- utils/state/network.go | 298 ++++++++++++--------------------------- 2 files changed, 145 insertions(+), 218 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 399ca46e2..bb1101768 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -8,18 +8,26 @@ import ( // Container for network contracts type NetworkContracts struct { // Redstone - RocketDAOProtocolSettingsNode *rocketpool.Contract - RocketMinipoolManager *rocketpool.Contract - RocketNetworkPrices *rocketpool.Contract - RocketNodeDeposit *rocketpool.Contract - RocketNodeDistributorFactory *rocketpool.Contract - RocketNodeManager *rocketpool.Contract - RocketNodeStaking *rocketpool.Contract - RocketRewardsPool *rocketpool.Contract - RocketStorage *rocketpool.Contract - RocketTokenRETH *rocketpool.Contract - RocketTokenRPL *rocketpool.Contract - RocketTokenRPLFixedSupply *rocketpool.Contract + RocketDAOProtocolSettingsMinipool *rocketpool.Contract + RocketDAOProtocolSettingsNetwork *rocketpool.Contract + RocketDAOProtocolSettingsNode *rocketpool.Contract + RocketDAONodeTrustedSettingsMinipool *rocketpool.Contract + RocketDepositPool *rocketpool.Contract + RocketMinipoolManager *rocketpool.Contract + RocketMinipoolQueue *rocketpool.Contract + RocketNetworkBalances *rocketpool.Contract + RocketNetworkFees *rocketpool.Contract + RocketNetworkPrices *rocketpool.Contract + RocketNodeDeposit *rocketpool.Contract + RocketNodeDistributorFactory *rocketpool.Contract + RocketNodeManager *rocketpool.Contract + RocketNodeStaking *rocketpool.Contract + RocketRewardsPool *rocketpool.Contract + RocketSmoothingPool *rocketpool.Contract + RocketStorage *rocketpool.Contract + RocketTokenRETH *rocketpool.Contract + RocketTokenRPL *rocketpool.Contract + RocketTokenRPLFixedSupply *rocketpool.Contract // Atlas RocketMinipoolBondReducer *rocketpool.Contract @@ -73,6 +81,39 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, isAtlasDeployed bool, opts * if err != nil { return nil, err } + contracts.RocketDAONodeTrustedSettingsMinipool, err = rp.GetContract("rocketDAONodeTrustedSettingsMinipool", opts) + if err != nil { + return nil, err + } + contracts.RocketSmoothingPool, err = rp.GetContract("rocketSmoothingPool", opts) + if err != nil { + return nil, err + } + contracts.RocketDepositPool, err = rp.GetContract("rocketDepositPool", opts) + if err != nil { + return nil, err + } + contracts.RocketMinipoolQueue, err = rp.GetContract("rocketMinipoolQueue", opts) + if err != nil { + return nil, err + } + contracts.RocketNetworkBalances, err = rp.GetContract("rocketNetworkBalances", opts) + if err != nil { + return nil, err + } + contracts.RocketNetworkFees, err = rp.GetContract("rocketNetworkFees", opts) + if err != nil { + return nil, err + } + contracts.RocketDAOProtocolSettingsNetwork, err = rp.GetContract("rocketDAOProtocolSettingsNetwork", opts) + if err != nil { + return nil, err + } + contracts.RocketDAOProtocolSettingsMinipool, err = rp.GetContract("rocketDAOProtocolSettingsMinipool", opts) + if err != nil { + return nil, err + } + contracts.RocketStorage = rp.RocketStorageContract if isAtlasDeployed { diff --git a/utils/state/network.go b/utils/state/network.go index ddf7220f6..9c42f5b90 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/minipool" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" "github.com/rocket-pool/rocketpool-go/utils/multicall" "golang.org/x/sync/errgroup" ) @@ -61,23 +62,112 @@ type NetworkDetails struct { } // TODO: Finish this, involves porting e.g. GetClaimIntervalTime() over -func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (*NetworkDetails, error) { - +func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkDetails, error) { + // Create the multicaller mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) if err != nil { return nil, err } + // Create the balance batcher + balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) + if err != nil { + return nil, err + } + details := &NetworkDetails{} + // Local vars for things that need to be converted var rewardIndex *big.Int + var scrubPeriodSeconds *big.Int + var totalQueueCapacity *big.Int + var effectiveQueueCapacity *big.Int + var pricesBlock *big.Int + var latestReportablePricesBlock *big.Int + var ethUtilizationRate *big.Int + var rETHExchangeRate *big.Int + var nodeFee *big.Int + var balancesBlock *big.Int + var latestReportableBalancesBlock *big.Int + var minipoolLaunchTimeout *big.Int + var promotionScrubPeriodSeconds *big.Int + var windowStartRaw *big.Int + var windowLengthRaw *big.Int + + // Multicall getters mc.AddCall(contracts.RocketNetworkPrices, &details.RplPrice, "getRPLPrice") mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MinCollateralFraction, "getMinimumPerMinipoolStake") mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MaxCollateralFraction, "getMaximumPerMinipoolStake") mc.AddCall(contracts.RocketRewardsPool, &rewardIndex, "getRewardIndex") + mc.AddCall(contracts.RocketRewardsPool, &details.IntervalStart, "getClaimIntervalTimeStart") + mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &scrubPeriodSeconds, "getScrubPeriod") + mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolBalance, "getBalance") + mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolExcess, "getExcessBalance") + mc.AddCall(contracts.RocketMinipoolQueue, &totalQueueCapacity, "getTotalCapacity") + mc.AddCall(contracts.RocketMinipoolQueue, &effectiveQueueCapacity, "getEffectiveCapacity") + mc.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") + mc.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") + mc.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") + mc.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") + mc.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") + mc.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") + mc.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") + mc.AddCall(contracts.RocketNetworkBalances, &details.TotalETHBalance, "getTotalETHBalance") + mc.AddCall(contracts.RocketTokenRETH, &details.TotalRETHSupply, "totalSupply") + mc.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") + mc.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") + mc.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") + mc.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") + mc.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") + mc.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") + mc.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") + + if isAtlasDeployed { + mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &promotionScrubPeriodSeconds, "getPromotionScrubPeriod") + mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") + mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") + mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") + } + + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return nil, fmt.Errorf("error executing multicall: %w", err) + } + + // Conversion for raw parameters details.RewardIndex = rewardIndex.Uint64() + details.ScrubPeriod = time.Duration(scrubPeriodSeconds.Uint64()) * time.Second + details.SmoothingPoolAddress = *contracts.RocketSmoothingPool.Address + details.QueueCapacity = minipool.QueueCapacity{ + Total: totalQueueCapacity, + Effective: effectiveQueueCapacity, + } + details.PricesBlock = pricesBlock.Uint64() + details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() + details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) + details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) + details.NodeFee = eth.WeiToEth(nodeFee) + details.BalancesBlock = balancesBlock + details.LatestReportableBalancesBlock = latestReportableBalancesBlock + details.MinipoolLaunchTimeout = minipoolLaunchTimeout + details.PromotionScrubPeriod = time.Duration(promotionScrubPeriodSeconds.Uint64()) * time.Second + details.BondReductionWindowStart = time.Duration(windowStartRaw.Uint64()) * time.Second + details.BondReductionWindowLength = time.Duration(windowLengthRaw.Uint64()) * time.Second + + // Get various balances + addresses := []common.Address{ + *contracts.RocketSmoothingPool.Address, + *contracts.RocketTokenRETH.Address, + } + balances, err := balanceBatcher.GetEthBalances(addresses, opts) + if err != nil { + return nil, fmt.Errorf("error getting contract balances: %w", err) + } + details.SmoothingPoolBalance = balances[0] + details.RETHBalance = balances[1] + // PORT THIS /* wg.Go(func() error { var err error @@ -88,15 +178,6 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common return nil }) - wg.Go(func() error { - var err error - state.NetworkDetails.IntervalStart, err = rewards.GetClaimIntervalTimeStart(rp, opts) - if err != nil { - return fmt.Errorf("error getting interval start: %w", err) - } - return nil - }) - wg.Go(func() error { var err error state.NetworkDetails.NodeOperatorRewardsPercent, err = GetNodeOperatorRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) @@ -132,201 +213,6 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common } return nil }) - - if isAtlasDeployed { - wg.Go(func() error { - promotionScrubPeriodSeconds, err := trustednode.GetPromotionScrubPeriod(rp, opts) - if err != nil { - return fmt.Errorf("error getting promotion scrub period: %w", err) - } - state.NetworkDetails.PromotionScrubPeriod = time.Duration(promotionScrubPeriodSeconds) * time.Second - return nil - }) - - wg.Go(func() error { - windowStartRaw, err := trustednode.GetBondReductionWindowStart(rp, opts) - if err != nil { - return fmt.Errorf("error getting bond reduction window start: %w", err) - } - state.NetworkDetails.BondReductionWindowStart = time.Duration(windowStartRaw) * time.Second - return nil - }) - - wg.Go(func() error { - windowLengthRaw, err := trustednode.GetBondReductionWindowLength(rp, opts) - if err != nil { - return fmt.Errorf("error getting bond reduction window length: %w", err) - } - state.NetworkDetails.BondReductionWindowLength = time.Duration(windowLengthRaw) * time.Second - return nil - }) - } - - wg.Go(func() error { - scrubPeriodSeconds, err := trustednode.GetScrubPeriod(rp, opts) - if err != nil { - return fmt.Errorf("error getting scrub period: %w", err) - } - state.NetworkDetails.ScrubPeriod = time.Duration(scrubPeriodSeconds) * time.Second - return nil - }) - - wg.Go(func() error { - smoothingPoolContract, err := rp.GetContract("rocketSmoothingPool", opts) - if err != nil { - return fmt.Errorf("error getting smoothing pool contract: %w", err) - } - state.NetworkDetails.SmoothingPoolAddress = *smoothingPoolContract.Address - - state.NetworkDetails.SmoothingPoolBalance, err = rp.Client.BalanceAt(context.Background(), *smoothingPoolContract.Address, opts.BlockNumber) - if err != nil { - return fmt.Errorf("error getting smoothing pool balance: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.DepositPoolBalance, err = deposit.GetBalance(rp, opts) - if err != nil { - return fmt.Errorf("error getting deposit pool balance: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.DepositPoolExcess, err = deposit.GetExcessBalance(rp, opts) - if err != nil { - return fmt.Errorf("error getting deposit pool excess: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.QueueCapacity, err = minipool.GetQueueCapacity(rp, opts) - if err != nil { - return fmt.Errorf("error getting minipool queue capacity: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.RPLInflationIntervalRate, err = tokens.GetRPLInflationIntervalRate(rp, opts) - if err != nil { - return fmt.Errorf("error getting RPL inflation interval: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.RPLTotalSupply, err = tokens.GetRPLTotalSupply(rp, opts) - if err != nil { - return fmt.Errorf("error getting total RPL supply: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.PricesBlock, err = network.GetPricesBlock(rp, opts) - if err != nil { - return fmt.Errorf("error getting ETH1 prices block: %w", err) - } - return nil - }) - - wg.Go(func() error { - latestReportableBlock, err := network.GetLatestReportablePricesBlock(rp, opts) - if err != nil { - return fmt.Errorf("error getting ETH1 latest reportable block: %w", err) - } - state.NetworkDetails.LatestReportablePricesBlock = latestReportableBlock.Uint64() - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.ETHUtilizationRate, err = network.GetETHUtilizationRate(rp, opts) - if err != nil { - return fmt.Errorf("error getting ETH utilization rate: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.StakingETHBalance, err = network.GetStakingETHBalance(rp, opts) - if err != nil { - return fmt.Errorf("error getting total ETH staking balance: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.RETHExchangeRate, err = tokens.GetRETHExchangeRate(rp, opts) - if err != nil { - return fmt.Errorf("error getting ETH-rETH exchange rate: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.TotalETHBalance, err = network.GetTotalETHBalance(rp, opts) - if err != nil { - return fmt.Errorf("error getting total ETH balance (TVL): %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - rethAddress := cfg.Smartnode.GetRethAddress() - state.NetworkDetails.RETHBalance, err = rp.Client.BalanceAt(context.Background(), rethAddress, opts.BlockNumber) - if err != nil { - return fmt.Errorf("error getting ETH balance of rETH staking contract: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.TotalRETHSupply, err = tokens.GetRETHTotalSupply(rp, opts) - if err != nil { - return fmt.Errorf("error getting total rETH supply: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.TotalRPLStake, err = node.GetTotalRPLStake(rp, opts) - if err != nil { - return fmt.Errorf("error getting total amount of RPL staked on the network: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.NodeFee, err = network.GetNodeFee(rp, opts) - if err != nil { - return fmt.Errorf("error getting current node fee for new minipools: %w", err) - } - return nil - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return err - } - - return nil */ return details, nil From 1ae542f64a3e71bc494a7a2db6405e8fca29b1ca Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Feb 2023 23:35:38 -0500 Subject: [PATCH 586/878] Finished refactoring network state --- utils/state/contracts.go | 201 +++++++++++++++++++++++++-------------- utils/state/minipool.go | 68 ++++++------- utils/state/network.go | 150 ++++++++++++----------------- utils/state/node.go | 32 +++---- 4 files changed, 241 insertions(+), 210 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index bb1101768..c61740d16 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -1,12 +1,23 @@ package state import ( + "fmt" + "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/multicall" ) // Container for network contracts type NetworkContracts struct { + // Non-RP Utility + BalanceBatcher *multicall.BalanceBatcher + Multicaller *multicall.MultiCaller + ElBlockNumber *big.Int + // Redstone RocketDAOProtocolSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsNetwork *rocketpool.Contract @@ -33,94 +44,140 @@ type NetworkContracts struct { RocketMinipoolBondReducer *rocketpool.Contract } +type contractArtifacts struct { + name string + address common.Address + abiEncoded string + contract **rocketpool.Contract +} + // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { - contracts := &NetworkContracts{} - var err error - contracts.RocketRewardsPool, err = rp.GetContract("rocketRewardsPool", opts) - if err != nil { - return nil, err - } - contracts.RocketDAOProtocolSettingsNode, err = rp.GetContract("rocketDAOProtocolSettingsNode", opts) - if err != nil { - return nil, err - } - contracts.RocketNetworkPrices, err = rp.GetContract("rocketNetworkPrices", opts) - if err != nil { - return nil, err - } - contracts.RocketNodeManager, err = rp.GetContract("rocketNodeManager", opts) - if err != nil { - return nil, err - } - contracts.RocketNodeStaking, err = rp.GetContract("rocketNodeStaking", opts) - if err != nil { - return nil, err - } - contracts.RocketMinipoolManager, err = rp.GetContract("rocketMinipoolManager", opts) - if err != nil { - return nil, err - } - contracts.RocketNodeDistributorFactory, err = rp.GetContract("rocketNodeDistributorFactory", opts) - if err != nil { - return nil, err - } - contracts.RocketTokenRETH, err = rp.GetContract("rocketTokenRETH", opts) - if err != nil { - return nil, err - } - contracts.RocketTokenRPL, err = rp.GetContract("rocketTokenRPL", opts) - if err != nil { - return nil, err - } - contracts.RocketTokenRPLFixedSupply, err = rp.GetContract("rocketTokenRPLFixedSupply", opts) - if err != nil { - return nil, err - } - contracts.RocketNodeDeposit, err = rp.GetContract("rocketNodeDeposit", opts) - if err != nil { - return nil, err - } - contracts.RocketDAONodeTrustedSettingsMinipool, err = rp.GetContract("rocketDAONodeTrustedSettingsMinipool", opts) - if err != nil { - return nil, err +func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { + // Create the contract binding + contracts := &NetworkContracts{ + RocketStorage: rp.RocketStorageContract, + ElBlockNumber: opts.BlockNumber, } - contracts.RocketSmoothingPool, err = rp.GetContract("rocketSmoothingPool", opts) - if err != nil { - return nil, err - } - contracts.RocketDepositPool, err = rp.GetContract("rocketDepositPool", opts) + + // Create the multicaller + var err error + contracts.Multicaller, err = multicall.NewMultiCaller(rp.Client, multicallerAddress) if err != nil { return nil, err } - contracts.RocketMinipoolQueue, err = rp.GetContract("rocketMinipoolQueue", opts) + + // Create the balance batcher + contracts.BalanceBatcher, err = multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) if err != nil { return nil, err } - contracts.RocketNetworkBalances, err = rp.GetContract("rocketNetworkBalances", opts) - if err != nil { - return nil, err + + // Create the contract wrappers for Redstone + wrappers := []contractArtifacts{ + { + name: "rocketDAOProtocolSettingsNode", + contract: &contracts.RocketDAOProtocolSettingsNode, + }, { + name: "rocketDAOProtocolSettingsNode", + contract: &contracts.RocketDAOProtocolSettingsNode, + }, { + name: "rocketRewardsPool", + contract: &contracts.RocketRewardsPool, + }, { + name: "rocketNetworkPrices", + contract: &contracts.RocketNetworkPrices, + }, { + name: "rocketNodeManager", + contract: &contracts.RocketNodeManager, + }, { + name: "rocketNodeStaking", + contract: &contracts.RocketNodeStaking, + }, { + name: "rocketMinipoolManager", + contract: &contracts.RocketMinipoolManager, + }, { + name: "rocketNodeDistributorFactory", + contract: &contracts.RocketNodeDistributorFactory, + }, { + name: "rocketTokenRETH", + contract: &contracts.RocketTokenRETH, + }, { + name: "rocketTokenRPL", + contract: &contracts.RocketTokenRPL, + }, { + name: "rocketTokenRPLFixedSupply", + contract: &contracts.RocketTokenRPLFixedSupply, + }, { + name: "rocketNodeDeposit", + contract: &contracts.RocketNodeDeposit, + }, { + name: "rocketDAONodeTrustedSettingsMinipool", + contract: &contracts.RocketDAONodeTrustedSettingsMinipool, + }, { + name: "rocketSmoothingPool", + contract: &contracts.RocketSmoothingPool, + }, { + name: "rocketDepositPool", + contract: &contracts.RocketDepositPool, + }, { + name: "rocketMinipoolQueue", + contract: &contracts.RocketMinipoolQueue, + }, { + name: "rocketNetworkBalances", + contract: &contracts.RocketNetworkBalances, + }, { + name: "rocketNetworkFees", + contract: &contracts.RocketNetworkFees, + }, { + name: "rocketDAOProtocolSettingsNetwork", + contract: &contracts.RocketDAOProtocolSettingsNetwork, + }, { + name: "rocketDAOProtocolSettingsMinipool", + contract: &contracts.RocketDAOProtocolSettingsMinipool, + }, } - contracts.RocketNetworkFees, err = rp.GetContract("rocketNetworkFees", opts) - if err != nil { - return nil, err + + // Atlas wrappers + if isAtlasDeployed { + wrappers = append(wrappers, contractArtifacts{ + name: "rocketMinipoolBondReducer", + contract: &contracts.RocketMinipoolBondReducer, + }) } - contracts.RocketDAOProtocolSettingsNetwork, err = rp.GetContract("rocketDAOProtocolSettingsNetwork", opts) - if err != nil { - return nil, err + + // Add the address and ABI getters to multicall + for _, wrapper := range wrappers { + // Add the address getter + contracts.Multicaller.AddCall(contracts.RocketStorage, &wrapper.address, "getAddress", crypto.Keccak256Hash([]byte("contract.address"), []byte(wrapper.name))) + + // Add the ABI getter + contracts.Multicaller.AddCall(contracts.RocketStorage, &wrapper.abiEncoded, "getString", crypto.Keccak256Hash([]byte("contract.abi"), []byte(wrapper.name))) } - contracts.RocketDAOProtocolSettingsMinipool, err = rp.GetContract("rocketDAOProtocolSettingsMinipool", opts) + + // Run the multi-getter + _, err = contracts.Multicaller.FlexibleCall(true, opts) if err != nil { - return nil, err + return nil, fmt.Errorf("error executing multicall for contract retrieval: %w", err) } - contracts.RocketStorage = rp.RocketStorageContract - - if isAtlasDeployed { - contracts.RocketMinipoolBondReducer, err = rp.GetContract("rocketMinipoolBondReducer", opts) + // Postprocess the contracts + for _, wrapper := range wrappers { + // Decode the ABI + abi, err := rocketpool.DecodeAbi(wrapper.abiEncoded) if err != nil { - return nil, err + return nil, fmt.Errorf("error decoding ABI for %s: %w", wrapper.name, err) + } + + // Create the contract binding + contract := &rocketpool.Contract{ + Contract: bind.NewBoundContract(wrapper.address, *abi, rp.Client, rp.Client, rp.Client), + Address: &wrapper.address, + ABI: abi, + Client: rp.Client, } + + // Set the contract in the main wrapper object + *wrapper.contract = contract } return contracts, nil diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 94f77577f..e3e396be4 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -69,22 +69,22 @@ type NativeMinipoolDetails struct { } // Gets the details for a minipool using the efficient multicall contract -func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (NativeMinipoolDetails, error) { +func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, minipoolAddress common.Address) (NativeMinipoolDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + details := NativeMinipoolDetails{} details.MinipoolAddress = minipoolAddress - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) - if err != nil { - return NativeMinipoolDetails{}, err - } version, err := rocketpool.GetContractVersion(rp, minipoolAddress, opts) if err != nil { return NativeMinipoolDetails{}, fmt.Errorf("error getting minipool version: %w", err) } details.Version = version - addMinipoolDetailsCalls(rp, contracts, mc, &details, opts) + addMinipoolDetailsCalls(rp, contracts, contracts.Multicaller, &details, opts) - _, err = mc.FlexibleCall(true, opts) + _, err = contracts.Multicaller.FlexibleCall(true, opts) if err != nil { return NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) } @@ -95,53 +95,55 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, minipoolAddress common. } // Gets the minpool details for a node using the efficient multicall contract -func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) - if err != nil { - return nil, err +func GetNodeNativeMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address) ([]NativeMinipoolDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, } // Get the list of minipool addresses for this node - addresses, err := getNodeMinipoolAddressesFast(rp, contracts, nodeAddress, multicallerAddress, opts) + addresses, err := getNodeMinipoolAddressesFast(rp, contracts, nodeAddress, opts) if err != nil { return nil, fmt.Errorf("error getting minipool addresses: %w", err) } // Get the list of minipool versions - versions, err := getMinipoolVersionsFast(rp, contracts, multicallerAddress, addresses, opts) + versions, err := getMinipoolVersionsFast(rp, contracts, addresses, opts) if err != nil { return nil, fmt.Errorf("error getting minipool versions: %w", err) } // Get the minipool details - return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, versions, balanceBatcher, opts) + return getBulkMinipoolDetails(rp, contracts, addresses, versions, opts) } // Gets all minpool details using the efficient multicall contract -func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { - balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) - if err != nil { - return nil, err +func GetAllNativeMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]NativeMinipoolDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, } // Get the list of all minipool addresses - addresses, err := getAllMinipoolAddressesFast(rp, contracts, multicallerAddress, opts) + addresses, err := getAllMinipoolAddressesFast(rp, contracts, opts) if err != nil { return nil, fmt.Errorf("error getting minipool addresses: %w", err) } // Get the list of minipool versions - versions, err := getMinipoolVersionsFast(rp, contracts, multicallerAddress, addresses, opts) + versions, err := getMinipoolVersionsFast(rp, contracts, addresses, opts) if err != nil { return nil, fmt.Errorf("error getting minipool versions: %w", err) } // Get the minipool details - return getBulkMinipoolDetails(rp, contracts, multicallerAddress, addresses, versions, balanceBatcher, opts) + return getBulkMinipoolDetails(rp, contracts, addresses, versions, opts) } // Calculate the node and user shares of the total minipool balance, including the portion on the Beacon chain -func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, minipoolDetails []*NativeMinipoolDetails, beaconBalances []*big.Int, opts *bind.CallOpts) error { +func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, minipoolDetails []*NativeMinipoolDetails, beaconBalances []*big.Int) error { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + var wg errgroup.Group wg.SetLimit(threadLimit) count := len(minipoolDetails) @@ -154,7 +156,7 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -199,7 +201,7 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo } // Get all minipool addresses using the multicaller -func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { +func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count minipoolCount, err := minipool.GetNodeMinipoolCount(rp, nodeAddress, opts) if err != nil { @@ -222,7 +224,7 @@ func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkC wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -245,7 +247,7 @@ func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkC } // Get all minipool addresses using the multicaller -func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { +func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count minipoolCount, err := minipool.GetMinipoolCount(rp, opts) if err != nil { @@ -268,7 +270,7 @@ func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkCo wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -291,7 +293,7 @@ func getAllMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkCo } // Get minipool versions using the multicaller -func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, opts *bind.CallOpts) ([]uint8, error) { +func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, addresses []common.Address, opts *bind.CallOpts) ([]uint8, error) { // Sync var wg errgroup.Group wg.SetLimit(threadLimit) @@ -308,7 +310,7 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -340,11 +342,11 @@ func getMinipoolVersionsFast(rp *rocketpool.RocketPool, contracts *NetworkContra } // Get multiple minipool details at once -func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, addresses []common.Address, versions []uint8, balanceBatcher *multicall.BalanceBatcher, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { +func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, addresses []common.Address, versions []uint8, opts *bind.CallOpts) ([]NativeMinipoolDetails, error) { minipoolDetails := make([]NativeMinipoolDetails, len(addresses)) // Get the balances of the minipools - balances, err := balanceBatcher.GetEthBalances(addresses, opts) + balances, err := contracts.BalanceBatcher.GetEthBalances(addresses, opts) if err != nil { return nil, fmt.Errorf("error getting minipool balances: %w", err) } @@ -365,7 +367,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -403,7 +405,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac wg2.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } diff --git a/utils/state/network.go b/utils/state/network.go index 9c42f5b90..61a6db8f3 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -61,24 +61,18 @@ type NetworkDetails struct { DepositPoolUserBalance *big.Int } -// TODO: Finish this, involves porting e.g. GetClaimIntervalTime() over -func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkDetails, error) { - // Create the multicaller - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) - if err != nil { - return nil, err - } - - // Create the balance batcher - balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) - if err != nil { - return nil, err +// Create a snapshot of all of the network's details +func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isAtlasDeployed bool) (*NetworkDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, } details := &NetworkDetails{} // Local vars for things that need to be converted var rewardIndex *big.Int + var intervalStart *big.Int + var intervalDuration *big.Int var scrubPeriodSeconds *big.Int var totalQueueCapacity *big.Int var effectiveQueueCapacity *big.Int @@ -95,49 +89,55 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common var windowLengthRaw *big.Int // Multicall getters - mc.AddCall(contracts.RocketNetworkPrices, &details.RplPrice, "getRPLPrice") - mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MinCollateralFraction, "getMinimumPerMinipoolStake") - mc.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MaxCollateralFraction, "getMaximumPerMinipoolStake") - mc.AddCall(contracts.RocketRewardsPool, &rewardIndex, "getRewardIndex") - - mc.AddCall(contracts.RocketRewardsPool, &details.IntervalStart, "getClaimIntervalTimeStart") - mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &scrubPeriodSeconds, "getScrubPeriod") - mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolBalance, "getBalance") - mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolExcess, "getExcessBalance") - mc.AddCall(contracts.RocketMinipoolQueue, &totalQueueCapacity, "getTotalCapacity") - mc.AddCall(contracts.RocketMinipoolQueue, &effectiveQueueCapacity, "getEffectiveCapacity") - mc.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") - mc.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") - mc.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") - mc.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") - mc.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") - mc.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") - mc.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") - mc.AddCall(contracts.RocketNetworkBalances, &details.TotalETHBalance, "getTotalETHBalance") - mc.AddCall(contracts.RocketTokenRETH, &details.TotalRETHSupply, "totalSupply") - mc.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") - mc.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") - mc.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") - mc.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") - mc.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") - mc.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") - mc.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") + contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &details.RplPrice, "getRPLPrice") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MinCollateralFraction, "getMinimumPerMinipoolStake") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNode, &details.MaxCollateralFraction, "getMaximumPerMinipoolStake") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &rewardIndex, "getRewardIndex") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &intervalStart, "getClaimIntervalTimeStart") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &intervalDuration, "getClaimIntervalTime") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &details.NodeOperatorRewardsPercent, "getClaimingContractPerc", "rocketClaimNode") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &details.TrustedNodeOperatorRewardsPercent, "getClaimingContractPerc", "rocketClaimTrustedNode") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &details.ProtocolDaoRewardsPercent, "getClaimingContractPerc", "rocketClaimDAO") + contracts.Multicaller.AddCall(contracts.RocketRewardsPool, &details.PendingRPLRewards, "getPendingRPLRewards") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &scrubPeriodSeconds, "getScrubPeriod") + contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolBalance, "getBalance") + contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolExcess, "getExcessBalance") + contracts.Multicaller.AddCall(contracts.RocketMinipoolQueue, &totalQueueCapacity, "getTotalCapacity") + contracts.Multicaller.AddCall(contracts.RocketMinipoolQueue, &effectiveQueueCapacity, "getEffectiveCapacity") + contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") + contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") + contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") + contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") + contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.TotalETHBalance, "getTotalETHBalance") + contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &details.TotalRETHSupply, "totalSupply") + contracts.Multicaller.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") + contracts.Multicaller.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") if isAtlasDeployed { - mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &promotionScrubPeriodSeconds, "getPromotionScrubPeriod") - mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") - mc.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") - mc.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &promotionScrubPeriodSeconds, "getPromotionScrubPeriod") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") + contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") } - _, err = mc.FlexibleCall(true, opts) + _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { return nil, fmt.Errorf("error executing multicall: %w", err) } // Conversion for raw parameters details.RewardIndex = rewardIndex.Uint64() - details.ScrubPeriod = time.Duration(scrubPeriodSeconds.Uint64()) * time.Second + details.IntervalStart = convertToTime(intervalStart) + details.IntervalDuration = convertToDuration(intervalDuration) + details.ScrubPeriod = convertToDuration(scrubPeriodSeconds) details.SmoothingPoolAddress = *contracts.RocketSmoothingPool.Address details.QueueCapacity = minipool.QueueCapacity{ Total: totalQueueCapacity, @@ -151,16 +151,16 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common details.BalancesBlock = balancesBlock details.LatestReportableBalancesBlock = latestReportableBalancesBlock details.MinipoolLaunchTimeout = minipoolLaunchTimeout - details.PromotionScrubPeriod = time.Duration(promotionScrubPeriodSeconds.Uint64()) * time.Second - details.BondReductionWindowStart = time.Duration(windowStartRaw.Uint64()) * time.Second - details.BondReductionWindowLength = time.Duration(windowLengthRaw.Uint64()) * time.Second + details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) + details.BondReductionWindowStart = convertToDuration(windowStartRaw) + details.BondReductionWindowLength = convertToDuration(windowLengthRaw) // Get various balances addresses := []common.Address{ *contracts.RocketSmoothingPool.Address, *contracts.RocketTokenRETH.Address, } - balances, err := balanceBatcher.GetEthBalances(addresses, opts) + balances, err := contracts.BalanceBatcher.GetEthBalances(addresses, opts) if err != nil { return nil, fmt.Errorf("error getting contract balances: %w", err) } @@ -169,42 +169,6 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common // PORT THIS /* - wg.Go(func() error { - var err error - state.NetworkDetails.IntervalDuration, err = GetClaimIntervalTime(cfg, state.NetworkDetails.RewardIndex, rp, opts) - if err != nil { - return fmt.Errorf("error getting interval duration: %w", err) - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.NodeOperatorRewardsPercent, err = GetNodeOperatorRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) - if err != nil { - return fmt.Errorf("error getting node operator rewards percent") - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.TrustedNodeOperatorRewardsPercent, err = GetTrustedNodeOperatorRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) - if err != nil { - return fmt.Errorf("error getting trusted node operator rewards percent") - } - return nil - }) - - wg.Go(func() error { - var err error - state.NetworkDetails.ProtocolDaoRewardsPercent, err = GetProtocolDaoRewardsPercent(cfg, state.NetworkDetails.RewardIndex, rp, opts) - if err != nil { - return fmt.Errorf("error getting protocol DAO rewards percent") - } - return nil - }) - wg.Go(func() error { var err error state.NetworkDetails.PendingRPLRewards, err = GetPendingRPLRewards(cfg, state.NetworkDetails.RewardIndex, rp, opts) @@ -219,9 +183,9 @@ func _getNetworkDetailsFast(rp *rocketpool.RocketPool, multicallerAddress common } // Gets the details for a node using the efficient multicall contract -func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, multicallerAddress common.Address, contracts *NetworkContracts, opts *bind.CallOpts) (*big.Int, error) { +func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) (*big.Int, error) { // Get the list of node addresses - addresses, err := getNodeAddressesFast(rp, contracts, multicallerAddress, opts) + addresses, err := getNodeAddressesFast(rp, contracts, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } @@ -243,7 +207,7 @@ func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, multicallerAddress com wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -275,3 +239,13 @@ func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, multicallerAddress com return totalEffectiveStake, nil } + +// Converts a time on the chain (as Unix time in seconds) to a time.Time struct +func convertToTime(value *big.Int) time.Time { + return time.Unix(value.Int64(), 0) +} + +// Converts a duration on the chain (as a number of seconds) to a time.Duration struct +func convertToDuration(value *big.Int) time.Duration { + return time.Duration(value.Uint64()) * time.Second +} diff --git a/utils/state/node.go b/utils/state/node.go index f05ed80d3..5312937b6 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -48,18 +48,17 @@ type NativeNodeDetails struct { } // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, multicallerAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) (NativeNodeDetails, error) { +func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, isAtlasDeployed bool) (NativeNodeDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } details := NativeNodeDetails{} details.NodeAddress = nodeAddress - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) - if err != nil { - return NativeNodeDetails{}, err - } avgFee := big.NewInt(0) - addNodeDetailsCalls(contracts, mc, &details, nodeAddress, &avgFee, isAtlasDeployed) + addNodeDetailsCalls(contracts, contracts.Multicaller, &details, nodeAddress, &avgFee, isAtlasDeployed) - _, err = mc.FlexibleCall(true, opts) + _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { return NativeNodeDetails{}, fmt.Errorf("error executing multicall: %w", err) } @@ -83,14 +82,13 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, contracts *NetworkContracts, isAtlasDeployed bool, opts *bind.CallOpts) ([]NativeNodeDetails, error) { - balanceBatcher, err := multicall.NewBalanceBatcher(rp.Client, balanceBatcherAddress) - if err != nil { - return nil, err +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isAtlasDeployed bool) ([]NativeNodeDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, } // Get the list of node addresses - addresses, err := getNodeAddressesFast(rp, contracts, multicallerAddress, opts) + addresses, err := getNodeAddressesFast(rp, contracts, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } @@ -112,7 +110,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } @@ -138,7 +136,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo // Get the balances of the nodes distributorAddresses := make([]common.Address, count) - balances, err := balanceBatcher.GetEthBalances(addresses, opts) + balances, err := contracts.BalanceBatcher.GetEthBalances(addresses, opts) if err != nil { return nil, fmt.Errorf("error getting node balances: %w", err) } @@ -148,7 +146,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo } // Get the balances of the distributors - balances, err = balanceBatcher.GetEthBalances(distributorAddresses, opts) + balances, err = contracts.BalanceBatcher.GetEthBalances(distributorAddresses, opts) if err != nil { return nil, fmt.Errorf("error getting distributor balances: %w", err) } @@ -162,7 +160,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, multicallerAddress commo } // Get all node addresses using the multicaller -func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, multicallerAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { +func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count nodeCount, err := node.GetNodeCount(rp, opts) if err != nil { @@ -185,7 +183,7 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts wg.Go(func() error { var err error - mc, err := multicall.NewMultiCaller(rp.Client, multicallerAddress) + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) if err != nil { return err } From 43130f2b7a8bbd389339aa113118137624af7547 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 17 Feb 2023 23:59:48 -0500 Subject: [PATCH 587/878] Some more refactoring and version check fixes --- node/node.go | 2 +- node/staking.go | 2 +- utils/state/contracts.go | 47 ++++++++++++++++++++++++++++++++++++++++ utils/state/network.go | 6 ++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/node/node.go b/node/node.go index 9bd603b99..858af2c77 100644 --- a/node/node.go +++ b/node/node.go @@ -62,7 +62,7 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint if err != nil { return 0, err } - return rocketpool.GetContractVersion(rp, *rocketNodeManager.Address, nil) + return rocketpool.GetContractVersion(rp, *rocketNodeManager.Address, opts) } // Get all node details diff --git a/node/staking.go b/node/staking.go index 9eecc07b3..24173282c 100644 --- a/node/staking.go +++ b/node/staking.go @@ -17,7 +17,7 @@ func GetNodeStakingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint if err != nil { return 0, err } - return rocketpool.GetContractVersion(rp, *rocketNodeStaking.Address, nil) + return rocketpool.GetContractVersion(rp, *rocketNodeStaking.Address, opts) } // Get the total RPL staked in the network diff --git a/utils/state/contracts.go b/utils/state/contracts.go index c61740d16..4c86fb639 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/hashicorp/go-version" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/multicall" ) @@ -18,6 +19,9 @@ type NetworkContracts struct { Multicaller *multicall.MultiCaller ElBlockNumber *big.Int + // Network version + Version *version.Version + // Redstone RocketDAOProtocolSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsNetwork *rocketpool.Contract @@ -180,5 +184,48 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad *wrapper.contract = contract } + err = contracts.getCurrentVersion(rp) + if err != nil { + return nil, fmt.Errorf("error getting network contract version: %w", err) + } + return contracts, nil } + +// Returns whether or not Atlas has been deployed +// TODO: refactor this so it comes first and we don't need to pass this check around everywhere +func (c *NetworkContracts) _isAtlasDeployed() bool { + constraint, _ := version.NewConstraint("== 1.2.0") + return constraint.Check(c.Version) +} + +// Get the current version of the network +func (c *NetworkContracts) getCurrentVersion(rp *rocketpool.RocketPool) error { + opts := &bind.CallOpts{ + BlockNumber: c.ElBlockNumber, + } + + // Check for v1.2 + nodeStakingVersion, err := rocketpool.GetContractVersion(rp, *c.RocketNodeStaking.Address, opts) + if err != nil { + return fmt.Errorf("error checking node staking version: %w", err) + } + if nodeStakingVersion > 3 { + c.Version, err = version.NewSemver("1.2.0") + return err + } + + // Check for v1.1 + nodeMgrVersion, err := rocketpool.GetContractVersion(rp, *c.RocketNodeManager.Address, opts) + if err != nil { + return fmt.Errorf("error checking node manager version: %w", err) + } + if nodeMgrVersion > 1 { + c.Version, err = version.NewSemver("1.1.0") + return err + } + + // v1.0 + c.Version, err = version.NewSemver("1.0.0") + return err +} diff --git a/utils/state/network.go b/utils/state/network.go index 61a6db8f3..15f1bca6e 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -183,7 +183,11 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i } // Gets the details for a node using the efficient multicall contract -func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) (*big.Int, error) { +func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkContracts) (*big.Int, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + // Get the list of node addresses addresses, err := getNodeAddressesFast(rp, contracts, opts) if err != nil { From 9b051d775c4c9bf6d4f7cbf222b4f4f0752218ae Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 18 Feb 2023 01:12:41 -0500 Subject: [PATCH 588/878] Fixed some incorrect pointers --- utils/state/contracts.go | 81 +++++++++++++++++++--------------------- utils/state/network.go | 12 ------ 2 files changed, 39 insertions(+), 54 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 4c86fb639..6a5c60b52 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -23,10 +23,10 @@ type NetworkContracts struct { Version *version.Version // Redstone + RocketDAONodeTrustedSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsNetwork *rocketpool.Contract RocketDAOProtocolSettingsNode *rocketpool.Contract - RocketDAONodeTrustedSettingsMinipool *rocketpool.Contract RocketDepositPool *rocketpool.Contract RocketMinipoolManager *rocketpool.Contract RocketMinipoolQueue *rocketpool.Contract @@ -79,17 +79,41 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad // Create the contract wrappers for Redstone wrappers := []contractArtifacts{ { - name: "rocketDAOProtocolSettingsNode", - contract: &contracts.RocketDAOProtocolSettingsNode, + name: "rocketDAONodeTrustedSettingsMinipool", + contract: &contracts.RocketDAONodeTrustedSettingsMinipool, + }, { + name: "rocketDAOProtocolSettingsMinipool", + contract: &contracts.RocketDAOProtocolSettingsMinipool, + }, { + name: "rocketDAOProtocolSettingsNetwork", + contract: &contracts.RocketDAOProtocolSettingsNetwork, }, { name: "rocketDAOProtocolSettingsNode", contract: &contracts.RocketDAOProtocolSettingsNode, }, { - name: "rocketRewardsPool", - contract: &contracts.RocketRewardsPool, + name: "rocketDepositPool", + contract: &contracts.RocketDepositPool, + }, { + name: "rocketMinipoolManager", + contract: &contracts.RocketMinipoolManager, + }, { + name: "rocketMinipoolQueue", + contract: &contracts.RocketMinipoolQueue, + }, { + name: "rocketNetworkBalances", + contract: &contracts.RocketNetworkBalances, + }, { + name: "rocketNetworkFees", + contract: &contracts.RocketNetworkFees, }, { name: "rocketNetworkPrices", contract: &contracts.RocketNetworkPrices, + }, { + name: "rocketNodeDeposit", + contract: &contracts.RocketNodeDeposit, + }, { + name: "rocketNodeDistributorFactory", + contract: &contracts.RocketNodeDistributorFactory, }, { name: "rocketNodeManager", contract: &contracts.RocketNodeManager, @@ -97,11 +121,11 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad name: "rocketNodeStaking", contract: &contracts.RocketNodeStaking, }, { - name: "rocketMinipoolManager", - contract: &contracts.RocketMinipoolManager, + name: "rocketRewardsPool", + contract: &contracts.RocketRewardsPool, }, { - name: "rocketNodeDistributorFactory", - contract: &contracts.RocketNodeDistributorFactory, + name: "rocketSmoothingPool", + contract: &contracts.RocketSmoothingPool, }, { name: "rocketTokenRETH", contract: &contracts.RocketTokenRETH, @@ -111,33 +135,6 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad }, { name: "rocketTokenRPLFixedSupply", contract: &contracts.RocketTokenRPLFixedSupply, - }, { - name: "rocketNodeDeposit", - contract: &contracts.RocketNodeDeposit, - }, { - name: "rocketDAONodeTrustedSettingsMinipool", - contract: &contracts.RocketDAONodeTrustedSettingsMinipool, - }, { - name: "rocketSmoothingPool", - contract: &contracts.RocketSmoothingPool, - }, { - name: "rocketDepositPool", - contract: &contracts.RocketDepositPool, - }, { - name: "rocketMinipoolQueue", - contract: &contracts.RocketMinipoolQueue, - }, { - name: "rocketNetworkBalances", - contract: &contracts.RocketNetworkBalances, - }, { - name: "rocketNetworkFees", - contract: &contracts.RocketNetworkFees, - }, { - name: "rocketDAOProtocolSettingsNetwork", - contract: &contracts.RocketDAOProtocolSettingsNetwork, - }, { - name: "rocketDAOProtocolSettingsMinipool", - contract: &contracts.RocketDAOProtocolSettingsMinipool, }, } @@ -150,12 +147,12 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad } // Add the address and ABI getters to multicall - for _, wrapper := range wrappers { + for i, wrapper := range wrappers { // Add the address getter - contracts.Multicaller.AddCall(contracts.RocketStorage, &wrapper.address, "getAddress", crypto.Keccak256Hash([]byte("contract.address"), []byte(wrapper.name))) + contracts.Multicaller.AddCall(contracts.RocketStorage, &wrappers[i].address, "getAddress", [32]byte(crypto.Keccak256Hash([]byte("contract.address"), []byte(wrapper.name)))) // Add the ABI getter - contracts.Multicaller.AddCall(contracts.RocketStorage, &wrapper.abiEncoded, "getString", crypto.Keccak256Hash([]byte("contract.abi"), []byte(wrapper.name))) + contracts.Multicaller.AddCall(contracts.RocketStorage, &wrappers[i].abiEncoded, "getString", [32]byte(crypto.Keccak256Hash([]byte("contract.abi"), []byte(wrapper.name)))) } // Run the multi-getter @@ -165,7 +162,7 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad } // Postprocess the contracts - for _, wrapper := range wrappers { + for i, wrapper := range wrappers { // Decode the ABI abi, err := rocketpool.DecodeAbi(wrapper.abiEncoded) if err != nil { @@ -175,13 +172,13 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad // Create the contract binding contract := &rocketpool.Contract{ Contract: bind.NewBoundContract(wrapper.address, *abi, rp.Client, rp.Client, rp.Client), - Address: &wrapper.address, + Address: &wrappers[i].address, ABI: abi, Client: rp.Client, } // Set the contract in the main wrapper object - *wrapper.contract = contract + *wrappers[i].contract = contract } err = contracts.getCurrentVersion(rp) diff --git a/utils/state/network.go b/utils/state/network.go index 15f1bca6e..3d10c2093 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -167,18 +167,6 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i details.SmoothingPoolBalance = balances[0] details.RETHBalance = balances[1] - // PORT THIS - /* - wg.Go(func() error { - var err error - state.NetworkDetails.PendingRPLRewards, err = GetPendingRPLRewards(cfg, state.NetworkDetails.RewardIndex, rp, opts) - if err != nil { - return fmt.Errorf("error getting pending RPL rewards") - } - return nil - }) - */ - return details, nil } From 5a0744fe224b00574b22c85eb2a08a92dfde53b6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 19 Feb 2023 15:13:55 -0500 Subject: [PATCH 589/878] Fixed some uninitialized fields in NewNetworkDetails --- utils/state/network.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/state/network.go b/utils/state/network.go index 3d10c2093..551a9cb91 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -126,6 +126,11 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") + } else { + promotionScrubPeriodSeconds = big.NewInt(0) + windowStartRaw = big.NewInt(0) + windowLengthRaw = big.NewInt(0) + details.DepositPoolUserBalance = big.NewInt(0) } _, err := contracts.Multicaller.FlexibleCall(true, opts) From d019f3c55e96035c165b2656e88dc06fbbbf49bd Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Feb 2023 00:01:45 -0500 Subject: [PATCH 590/878] Lowered some batch sizes for lower-power hardware --- utils/state/minipool.go | 4 ++-- utils/state/network.go | 2 +- utils/state/node.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index e3e396be4..d78da3a59 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -15,9 +15,9 @@ import ( ) const ( - minipoolBatchSize int = 200 + minipoolBatchSize int = 100 minipoolCompleteShareBatchSize int = 1000 - minipoolAddressBatchSize int = 2000 + minipoolAddressBatchSize int = 1000 minipoolVersionBatchSize int = 500 ) diff --git a/utils/state/network.go b/utils/state/network.go index 551a9cb91..bd3cab0fb 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -15,7 +15,7 @@ import ( ) const ( - networkEffectiveStakeBatchSize int = 2000 + networkEffectiveStakeBatchSize int = 1000 ) type NetworkDetails struct { diff --git a/utils/state/node.go b/utils/state/node.go index 5312937b6..7e0c07c33 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -14,8 +14,8 @@ import ( ) const ( - legacyNodeBatchSize int = 200 - nodeAddressBatchSize int = 2000 + legacyNodeBatchSize int = 100 + nodeAddressBatchSize int = 1000 ) // Complete details for a node From 2c01fe5d8c8eb05507b60e1c5155d57d261ec05c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Feb 2023 00:17:19 -0500 Subject: [PATCH 591/878] More batch size tuning --- utils/state/network.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/network.go b/utils/state/network.go index bd3cab0fb..d7b8fe1ff 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -15,7 +15,7 @@ import ( ) const ( - networkEffectiveStakeBatchSize int = 1000 + networkEffectiveStakeBatchSize int = 500 ) type NetworkDetails struct { From 6e15828d09c6abaad5045aa9bc0cacc233a301d9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Feb 2023 01:52:22 -0500 Subject: [PATCH 592/878] Added support for minipool v1's version checker to the minipool constructor --- minipool/minipool-constructor.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index 128175884..6cc671510 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -2,6 +2,7 @@ package minipool import ( "fmt" + "strings" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -15,7 +16,15 @@ func NewMinipool(rp *rocketpool.RocketPool, address common.Address, opts *bind.C // Get the contract version version, err := rocketpool.GetContractVersion(rp, address, opts) if err != nil { - return nil, fmt.Errorf("error getting minipool contract version: %w", err) + errMsg := err.Error() + errMsg = strings.ToLower(errMsg) + if strings.Contains(errMsg, "execution reverted") || + strings.Contains(errMsg, "vm execution error") { + // Reversions happen for minipool v1 on Prater which didn't have version() yet + version = 1 + } else { + return nil, fmt.Errorf("error getting minipool contract version: %w", err) + } } switch version { From 763b4e9d120386a7ff86ab6c723b21996179d88a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Feb 2023 22:18:23 -0500 Subject: [PATCH 593/878] Added the deposit type invariant getter --- utils/state/minipool.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index d78da3a59..86983f3e2 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -454,7 +454,6 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(mpContract, &details.StatusBlock, "getStatusBlock") mc.AddCall(mpContract, &details.StatusTime, "getStatusTime") mc.AddCall(mpContract, &details.Finalised, "getFinalised") - mc.AddCall(mpContract, &details.DepositTypeRaw, "getDepositType") mc.AddCall(mpContract, &details.NodeFee, "getNodeFee") mc.AddCall(mpContract, &details.NodeDepositBalance, "getNodeDepositBalance") mc.AddCall(mpContract, &details.NodeDepositAssigned, "getNodeDepositAssigned") @@ -497,6 +496,14 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) + if contracts._isAtlasDeployed() { + // Query the minipool manager using the delegate-invariant function + mc.AddCall(contracts.RocketMinipoolManager, &details.DepositTypeRaw, "getMinipoolDepositType", address) + } else { + // Fallback to querying the minipool + mc.AddCall(mpContract, &details.DepositTypeRaw, "getDepositType") + } + return nil } From 4b49c895b0fe1788248f210764c40c4d61e0c92b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 23 Feb 2023 00:34:25 -0500 Subject: [PATCH 594/878] Added GetMinipoolDepositType --- minipool/minipool.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/minipool/minipool.go b/minipool/minipool.go index dec97a1b7..da35e80e9 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -11,6 +11,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" rptypes "github.com/rocket-pool/rocketpool-go/types" ) @@ -589,6 +590,19 @@ func GetMinipoolRPLSlashed(rp *rocketpool.RocketPool, minipoolAddress common.Add return *value, nil } +// Get a minipool's deposit type invariant of its delegate version +func GetMinipoolDepositType(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (types.MinipoolDeposit, error) { + rocketMinipoolManager, err := getRocketMinipoolManager(rp, opts) + if err != nil { + return types.None, err + } + value := new(uint8) + if err := rocketMinipoolManager.Call(opts, value, "getMinipoolDepositType", minipoolAddress); err != nil { + return types.None, fmt.Errorf("Could not get minipool %s slashed status: %w", minipoolAddress.Hex(), err) + } + return types.MinipoolDeposit(*value), nil +} + // Get contracts var rocketMinipoolManagerLock sync.Mutex From a5d3cfb9c5ac8b7e5663c9ee6f362a52f0a4abc6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 23 Feb 2023 02:24:11 -0500 Subject: [PATCH 595/878] Updated Geth and the go version --- go.mod | 69 +++++- go.sum | 736 +++++---------------------------------------------------- 2 files changed, 116 insertions(+), 689 deletions(-) diff --git a/go.mod b/go.mod index 53814c742..b35f56cf7 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,71 @@ module github.com/rocket-pool/rocketpool-go -go 1.13 +go 1.19 require ( + github.com/ethereum/go-ethereum v1.11.2 + github.com/hashicorp/go-version v1.6.0 + github.com/princjef/gomarkdoc v0.4.1 + github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 + golang.org/x/sync v0.1.0 + gonum.org/v1/gonum v0.12.0 +) + +require ( + github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/VividCortex/ewma v1.2.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cheggaaa/pb/v3 v3.0.8 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/ethereum/go-ethereum v1.10.26 + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/fatih/color v1.11.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/hashicorp/go-version v1.6.0 + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/go-git/v5 v5.3.0 // indirect + github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.1.0 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.12 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/princjef/gomarkdoc v0.4.1 + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/nxadm/tail v1.4.8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/princjef/mageutil v1.0.0 // indirect github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect - golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 - gonum.org/v1/gonum v0.12.0 + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/tklauser/go-sysconf v0.3.5 // indirect + github.com/tklauser/numcpus v0.2.2 // indirect + github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect + github.com/xanzy/ssh-agent v0.3.0 // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/net v0.4.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.3.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + mvdan.cc/xurls/v2 v2.2.0 // indirect ) diff --git a/go.sum b/go.sum index 4d4ce3cd0..5f00b5f5e 100644 --- a/go.sum +++ b/go.sum @@ -1,152 +1,58 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v2.0.7+incompatible h1:gLKifR1UkZ/kLkda5gC0K6c8g+jU2sINPtBeOiNlMhU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/go-ethereum v1.11.2 h1:z/luyejbevDCAMUUiu0rc80dxJxOnpoG58k5o0tSawc= +github.com/ethereum/go-ethereum v1.11.2/go.mod h1:DuefStAgaxoaYGLR0FueVcVbehmn5n9QUcVrMCuOvuc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -154,32 +60,15 @@ github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= @@ -190,303 +79,98 @@ github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbK github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e h1:pIYdhNkDh+YENVNi3gto8n9hAmRxKxoar0iE6BLucjw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3PquxglBM= github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBPMVVDOOTLec= github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= @@ -494,378 +178,87 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= -github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 h1:cu5kTvlzcw1Q5S9f5ip1/cpiB4nXvw1XYzFPGgzLUOY= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -875,39 +268,20 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v2 v2.0.7/go.mod h1:0CiZ1p8pvtxBlQpLXkHuUTpdJ1shm3OqCF1QugkjHL4= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fatih/color.v1 v1.7.0/go.mod h1:P7yosIhqIl/sX8J8UypY5M+dDpD2KmyfP5IRs5v/fo0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mattn/go-colorable.v0 v0.1.0/go.mod h1:BVJlBXzARQxdi3nZo6f6bnl5yR20/tOL6p+V0KejgSY= gopkg.in/mattn/go-isatty.v0 v0.0.4/go.mod h1:wt691ab7g0X4ilKZNmMII3egK0bTxl37fEn/Fwbd8gc= gopkg.in/mattn/go-runewidth.v0 v0.0.4/go.mod h1:BmXejnxvhwdaATwiJbB1vZ2dtXkQKZGu9yLFCZb4msQ= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 42ad09c17d82ab0bf982bae25b8619e1b16566d1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 23 Feb 2023 23:35:04 -0500 Subject: [PATCH 596/878] Added getLastBondReductionPrevNodeFee --- minipool/bond-reducer.go | 13 +++++++ utils/state/minipool.go | 75 +++++++++++++++++++++------------------- utils/state/node.go | 50 +++++++++++++-------------- 3 files changed, 77 insertions(+), 61 deletions(-) diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index e2355b251..fbed5797b 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -98,6 +98,19 @@ func GetLastBondReductionPrevValue(rp *rocketpool.RocketPool, minipoolAddress co return *lastBondReductionPrevValue, nil } +// Gets the previous node fee (commission) of the minipool prior to its last reduction +func GetLastBondReductionPrevNodeFee(rp *rocketpool.RocketPool, minipoolAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) + if err != nil { + return nil, err + } + lastBondReductionPrevNodeFee := new(*big.Int) + if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionPrevNodeFee, "getLastBondReductionPrevNodeFee", minipoolAddress); err != nil { + return nil, fmt.Errorf("Could not get last bond reduction previous node fee for minipool %s: %w", minipoolAddress.Hex(), err) + } + return *lastBondReductionPrevNodeFee, nil +} + // Estimate the gas required to begin a minipool bond reduction func EstimateBeginReduceBondAmountGas(rp *rocketpool.RocketPool, minipoolAddress common.Address, newBondAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketMinipoolBondReducer, err := getRocketMinipoolBondReducer(rp, nil) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index 86983f3e2..fbde1e6d7 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -24,48 +24,49 @@ const ( // Complete details for a minipool type NativeMinipoolDetails struct { // Redstone - Exists bool `abi:"exists"` - MinipoolAddress common.Address `abi:"minipoolAddress"` - Pubkey types.ValidatorPubkey `abi:"pubkey"` - StatusRaw uint8 `abi:"status"` - StatusBlock *big.Int `abi:"statusBlock"` - StatusTime *big.Int `abi:"statusTime"` - Finalised bool `abi:"finalised"` - DepositTypeRaw uint8 `abi:"depositType"` - NodeFee *big.Int `abi:"nodeFee"` - NodeDepositBalance *big.Int `abi:"nodeDepositBalance"` - NodeDepositAssigned bool `abi:"nodeDepositAssigned"` - UserDepositBalance *big.Int `abi:"userDepositBalance"` - UserDepositAssigned bool `abi:"userDepositAssigned"` - UserDepositAssignedTime *big.Int `abi:"userDepositAssignedTime"` - UseLatestDelegate bool `abi:"useLatestDelegate"` - Delegate common.Address `abi:"delegate"` - PreviousDelegate common.Address `abi:"previousDelegate"` - EffectiveDelegate common.Address `abi:"effectiveDelegate"` - PenaltyCount *big.Int `abi:"penaltyCount"` - PenaltyRate *big.Int `abi:"penaltyRate"` - NodeAddress common.Address `abi:"nodeAddress"` - Version uint8 `abi:"delegateVersion"` - Balance *big.Int `abi:"balance"` // Contract balance - NodeShareOfBalance *big.Int `abi:"nodeShare"` // Result of calculateNodeShare(contract balance) - UserShareOfBalance *big.Int `abi:"userShare"` // Result of calculateUserShare(contract balance) - NodeRefundBalance *big.Int `abi:"nodeRefundBalance"` - WithdrawalCredentials common.Hash `abi:"withdrawalCredentials"` + Exists bool + MinipoolAddress common.Address + Pubkey types.ValidatorPubkey + StatusRaw uint8 + StatusBlock *big.Int + StatusTime *big.Int + Finalised bool + DepositTypeRaw uint8 + NodeFee *big.Int + NodeDepositBalance *big.Int + NodeDepositAssigned bool + UserDepositBalance *big.Int + UserDepositAssigned bool + UserDepositAssignedTime *big.Int + UseLatestDelegate bool + Delegate common.Address + PreviousDelegate common.Address + EffectiveDelegate common.Address + PenaltyCount *big.Int + PenaltyRate *big.Int + NodeAddress common.Address + Version uint8 + Balance *big.Int // Contract balance + NodeShareOfBalance *big.Int // Result of calculateNodeShare(contract balance) + UserShareOfBalance *big.Int // Result of calculateUserShare(contract balance) + NodeRefundBalance *big.Int + WithdrawalCredentials common.Hash Status types.MinipoolStatus DepositType types.MinipoolDeposit NodeShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this UserShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this // Atlas - UserDistributed bool `abi:"userDistributed"` - Slashed bool `abi:"slashed"` - IsVacant bool `abi:"vacant"` - LastBondReductionTime *big.Int `abi:"lastBondReductionTime"` - LastBondReductionPrevValue *big.Int `abi:"lastBondReductionPrevValue"` - ReduceBondTime *big.Int `abi:"reduceBondTime"` - ReduceBondCancelled bool `abi:"reduceBondCancelled"` - ReduceBondValue *big.Int `abi:"reduceBondValue"` - PreMigrationBalance *big.Int `abi:"preMigrationBalance"` + UserDistributed bool + Slashed bool + IsVacant bool + LastBondReductionTime *big.Int + LastBondReductionPrevValue *big.Int + LastBondReductionPrevNodeFee *big.Int + ReduceBondTime *big.Int + ReduceBondCancelled bool + ReduceBondValue *big.Int + PreMigrationBalance *big.Int } // Gets the details for a minipool using the efficient multicall contract @@ -472,6 +473,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra details.UserDistributed = false details.LastBondReductionTime = big.NewInt(0) details.LastBondReductionPrevValue = big.NewInt(0) + details.LastBondReductionPrevNodeFee = big.NewInt(0) details.IsVacant = false details.ReduceBondTime = big.NewInt(0) details.ReduceBondCancelled = false @@ -487,6 +489,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondCancelled, "getReduceBondCancelled", address) mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionTime, "getLastBondReductionTime", address) mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionPrevValue, "getLastBondReductionPrevValue", address) + mc.AddCall(contracts.RocketMinipoolBondReducer, &details.LastBondReductionPrevNodeFee, "getLastBondReductionPrevNodeFee", address) mc.AddCall(contracts.RocketMinipoolBondReducer, &details.ReduceBondValue, "getReduceBondValue", address) } diff --git a/utils/state/node.go b/utils/state/node.go index 7e0c07c33..003308f71 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -20,31 +20,31 @@ const ( // Complete details for a node type NativeNodeDetails struct { - Exists bool `abi:"exists"` - RegistrationTime *big.Int `abi:"registrationTime"` - TimezoneLocation string `abi:"timezoneLocation"` - FeeDistributorInitialised bool `abi:"feeDistributorInitialised"` - FeeDistributorAddress common.Address `abi:"feeDistributorAddress"` - RewardNetwork *big.Int `abi:"rewardNetwork"` - RplStake *big.Int `abi:"rplStake"` - EffectiveRPLStake *big.Int `abi:"effectiveRPLStake"` - MinimumRPLStake *big.Int `abi:"minimumRPLStake"` - MaximumRPLStake *big.Int `abi:"maximumRPLStake"` - EthMatched *big.Int `abi:"ethMatched"` - EthMatchedLimit *big.Int `abi:"ethMatchedLimit"` - MinipoolCount *big.Int `abi:"minipoolCount"` - BalanceETH *big.Int `abi:"balanceETH"` - BalanceRETH *big.Int `abi:"balanceRETH"` - BalanceRPL *big.Int `abi:"balanceRPL"` - BalanceOldRPL *big.Int `abi:"balanceOldRPL"` - DepositCreditBalance *big.Int `abi:"depositCreditBalance"` - DistributorBalanceUserETH *big.Int `abi:"distributorBalanceUserETH"` - DistributorBalanceNodeETH *big.Int `abi:"distributorBalanceNodeETH"` - WithdrawalAddress common.Address `abi:"withdrawalAddress"` - PendingWithdrawalAddress common.Address `abi:"pendingWithdrawalAddress"` - SmoothingPoolRegistrationState bool `abi:"smoothingPoolRegistrationState"` - SmoothingPoolRegistrationChanged *big.Int `abi:"smoothingPoolRegistrationChanged"` - NodeAddress common.Address `abi:"nodeAddress"` + Exists bool + RegistrationTime *big.Int + TimezoneLocation string + FeeDistributorInitialised bool + FeeDistributorAddress common.Address + RewardNetwork *big.Int + RplStake *big.Int + EffectiveRPLStake *big.Int + MinimumRPLStake *big.Int + MaximumRPLStake *big.Int + EthMatched *big.Int + EthMatchedLimit *big.Int + MinipoolCount *big.Int + BalanceETH *big.Int + BalanceRETH *big.Int + BalanceRPL *big.Int + BalanceOldRPL *big.Int + DepositCreditBalance *big.Int + DistributorBalanceUserETH *big.Int + DistributorBalanceNodeETH *big.Int + WithdrawalAddress common.Address + PendingWithdrawalAddress common.Address + SmoothingPoolRegistrationState bool + SmoothingPoolRegistrationChanged *big.Int + NodeAddress common.Address } // Gets the details for a node using the efficient multicall contract From 7f15cb4e155ff23da9f9618976ca6d0c1d3fb827 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 24 Feb 2023 00:29:23 -0500 Subject: [PATCH 597/878] Reverted Geth because Prysm doesn't work with v1.11 --- go.mod | 5 +++-- go.sum | 45 +++++++++++++++------------------------------ 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index b35f56cf7..29b3d991d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rocket-pool/rocketpool-go go 1.19 require ( - github.com/ethereum/go-ethereum v1.11.2 + github.com/ethereum/go-ethereum v1.10.26 github.com/hashicorp/go-version v1.6.0 github.com/princjef/gomarkdoc v0.4.1 github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 @@ -18,7 +18,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cheggaaa/pb/v3 v3.0.8 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect @@ -52,6 +52,7 @@ require ( github.com/protolambda/zssz v0.1.5 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rjeczalik/notify v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect diff --git a/go.sum b/go.sum index 5f00b5f5e..202a56470 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= @@ -15,7 +14,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -27,17 +25,13 @@ github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeD github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= @@ -51,8 +45,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/ethereum/go-ethereum v1.11.2 h1:z/luyejbevDCAMUUiu0rc80dxJxOnpoG58k5o0tSawc= -github.com/ethereum/go-ethereum v1.11.2/go.mod h1:DuefStAgaxoaYGLR0FueVcVbehmn5n9QUcVrMCuOvuc= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -66,7 +60,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= @@ -83,11 +76,9 @@ github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= @@ -98,7 +89,7 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e h1:pIYdhNkDh+YENVNi3gto8n9hAmRxKxoar0iE6BLucjw= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= @@ -111,14 +102,13 @@ github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -139,7 +129,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= @@ -166,10 +155,6 @@ github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3Pquxg github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBPMVVDOOTLec= github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= @@ -181,8 +166,9 @@ github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -195,19 +181,19 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= +github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= @@ -217,7 +203,7 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= @@ -251,13 +237,12 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 737923eacd78e2c1036de39f9cd743b84984f99f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 24 Feb 2023 22:15:31 -0500 Subject: [PATCH 598/878] Added support to NewNetworkContracts for nil opts --- utils/state/contracts.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 6a5c60b52..1aa2276a5 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -1,6 +1,7 @@ package state import ( + "context" "fmt" "math/big" @@ -57,6 +58,17 @@ type contractArtifacts struct { // Get a new network contracts container func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { + // Get the latest block number if it's not provided + if opts == nil { + latestElBlock, err := rp.Client.BlockNumber(context.Background()) + if err != nil { + return nil, fmt.Errorf("error getting latest block number: %w", err) + } + opts = &bind.CallOpts{ + BlockNumber: big.NewInt(0).SetUint64(latestElBlock), + } + } + // Create the contract binding contracts := &NetworkContracts{ RocketStorage: rp.RocketStorageContract, From 8320e8b6183fd195c335df78d001d8ab0eae8a70 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 27 Feb 2023 00:18:48 -0500 Subject: [PATCH 599/878] Fixed contract version checking for minipool deposit types pre-Atlas --- utils/state/contracts.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 1aa2276a5..a6f1e0368 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -204,7 +204,7 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad // Returns whether or not Atlas has been deployed // TODO: refactor this so it comes first and we don't need to pass this check around everywhere func (c *NetworkContracts) _isAtlasDeployed() bool { - constraint, _ := version.NewConstraint("== 1.2.0") + constraint, _ := version.NewConstraint(">= 1.2.0") return constraint.Check(c.Version) } From d5a680907dffea70eb871ddad01e8bb9e4f6df52 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 27 Feb 2023 21:01:37 -0500 Subject: [PATCH 600/878] Added CalculateAverageFeeAndDistributorShares --- utils/state/node.go | 123 +++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 46 deletions(-) diff --git a/utils/state/node.go b/utils/state/node.go index 003308f71..81ecd8a13 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/multicall" "golang.org/x/sync/errgroup" ) @@ -38,13 +39,15 @@ type NativeNodeDetails struct { BalanceRPL *big.Int BalanceOldRPL *big.Int DepositCreditBalance *big.Int - DistributorBalanceUserETH *big.Int - DistributorBalanceNodeETH *big.Int + DistributorBalanceUserETH *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this + DistributorBalanceNodeETH *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this WithdrawalAddress common.Address PendingWithdrawalAddress common.Address SmoothingPoolRegistrationState bool SmoothingPoolRegistrationChanged *big.Int NodeAddress common.Address + AverageNodeFee *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this + DistributorBalance *big.Int } // Gets the details for a node using the efficient multicall contract @@ -52,11 +55,14 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } - details := NativeNodeDetails{} - details.NodeAddress = nodeAddress + details := NativeNodeDetails{ + NodeAddress: nodeAddress, + AverageNodeFee: big.NewInt(0), + DistributorBalanceUserETH: big.NewInt(0), + DistributorBalanceNodeETH: big.NewInt(0), + } - avgFee := big.NewInt(0) - addNodeDetailsCalls(contracts, contracts.Multicaller, &details, nodeAddress, &avgFee, isAtlasDeployed) + addNodeDetailsCalls(contracts, contracts.Multicaller, &details, nodeAddress, isAtlasDeployed) _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { @@ -76,7 +82,12 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Do some postprocessing on the node data - fixupNodeDetails(rp, &details, avgFee, distributorBalance, opts) + details.DistributorBalance = distributorBalance + + // Fix the effective stake + if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { + details.EffectiveRPLStake.SetUint64(0) + } return details, nil } @@ -94,7 +105,6 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra } count := len(addresses) nodeDetails := make([]NativeNodeDetails, count) - avgFees := make([]*big.Int, count) // Sync var wg errgroup.Group @@ -118,9 +128,11 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra address := addresses[j] details := &nodeDetails[j] details.NodeAddress = address + details.AverageNodeFee = big.NewInt(0) + details.DistributorBalanceUserETH = big.NewInt(0) + details.DistributorBalanceNodeETH = big.NewInt(0) - avgFees[j] = big.NewInt(0) - addNodeDetailsCalls(contracts, mc, details, address, &avgFees[j], isAtlasDeployed) + addNodeDetailsCalls(contracts, mc, details, address, isAtlasDeployed) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -153,12 +165,65 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra // Do some postprocessing on the node data for i := range nodeDetails { - fixupNodeDetails(rp, &nodeDetails[i], avgFees[i], balances[i], opts) + details := &nodeDetails[i] + details.DistributorBalance = balances[i] + + // Fix the effective stake + if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { + details.EffectiveRPLStake.SetUint64(0) + } } return nodeDetails, nil } +// Calculate the average node fee and user/node shares of the distributor's balance +func CalculateAverageFeeAndDistributorShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { + + // Calculate the total of all fees for staking minipools that aren't finalized + totalFee := big.NewInt(0) + eligibleMinipools := int64(0) + for _, mpd := range minipoolDetails { + if mpd.Status == types.Staking && !mpd.Finalised { + totalFee.Add(totalFee, mpd.NodeFee) + eligibleMinipools++ + } + } + + // Get the average fee (0 if there aren't any minipools) + if eligibleMinipools > 0 { + node.AverageNodeFee.Div(totalFee, big.NewInt(eligibleMinipools)) + } + + // Get the user and node portions of the distributor balance + distributorBalance := big.NewInt(0).Set(node.DistributorBalance) + if distributorBalance.Cmp(big.NewInt(0)) > 0 { + halfBalance := big.NewInt(0) + halfBalance.Div(distributorBalance, two) + + if eligibleMinipools == 0 { + // Split it 50/50 if there are no minipools + node.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) + node.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) + } else { + // Amount of ETH given to the NO as a commission + commissionEth := big.NewInt(0) + commissionEth.Mul(halfBalance, node.AverageNodeFee) + commissionEth.Div(commissionEth, big.NewInt(1e18)) + + node.DistributorBalanceNodeETH.Add(halfBalance, commissionEth) // Node gets half + commission + node.DistributorBalanceUserETH.Sub(distributorBalance, node.DistributorBalanceNodeETH) // User gets balance - node share + } + + } else { + // No distributor balance + node.DistributorBalanceNodeETH = big.NewInt(0) + node.DistributorBalanceUserETH = big.NewInt(0) + } + + return nil +} + // Get all node addresses using the multicaller func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count @@ -206,13 +271,12 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Add all of the calls for the node details to the multicaller -func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, avgFee **big.Int, isAtlasDeployed bool) { +func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, isAtlasDeployed bool) { mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) mc.AddCall(contracts.RocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", address) mc.AddCall(contracts.RocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", address) mc.AddCall(contracts.RocketNodeManager, &details.FeeDistributorInitialised, "getFeeDistributorInitialised", address) mc.AddCall(contracts.RocketNodeDistributorFactory, &details.FeeDistributorAddress, "getProxyAddress", address) - mc.AddCall(contracts.RocketNodeManager, avgFee, "getAverageNodeFee", address) mc.AddCall(contracts.RocketNodeManager, &details.RewardNetwork, "getRewardNetwork", address) mc.AddCall(contracts.RocketNodeStaking, &details.RplStake, "getNodeRPLStake", address) mc.AddCall(contracts.RocketNodeStaking, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", address) @@ -231,36 +295,3 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) } } - -// Fixes a legacy node details struct with supplemental logic -func fixupNodeDetails(rp *rocketpool.RocketPool, details *NativeNodeDetails, avgFee *big.Int, distributorBalance *big.Int, opts *bind.CallOpts) error { - // Fix the effective stake - if details.EffectiveRPLStake.Cmp(details.MinimumRPLStake) == -1 { - details.EffectiveRPLStake.SetUint64(0) - } - - // Get the user and node portions of the distributor balance - if distributorBalance.Cmp(zero) > 0 { - halfBalance := big.NewInt(0) - halfBalance.Div(distributorBalance, two) - if details.MinipoolCount.Cmp(zero) == 0 { - // Split it 50/50 if there are no minipools - details.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) - details.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) - } else { - nodeShare := big.NewInt(0) - nodeShare.Mul(halfBalance, avgFee) - nodeShare.Div(nodeShare, oneInWei) - nodeShare.Add(nodeShare, halfBalance) - details.DistributorBalanceNodeETH = nodeShare - userShare := big.NewInt(0) - userShare.Sub(distributorBalance, nodeShare) - details.DistributorBalanceUserETH = userShare - } - } else { - details.DistributorBalanceNodeETH = big.NewInt(0) - details.DistributorBalanceUserETH = big.NewInt(0) - } - - return nil -} From 62d9893c1744a47b13c45928eab0c6641235f27b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Mar 2023 21:03:40 -0400 Subject: [PATCH 601/878] Reduced the batch size of effective stake calculation for Besu --- utils/state/network.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/network.go b/utils/state/network.go index d7b8fe1ff..d0278f382 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -15,7 +15,7 @@ import ( ) const ( - networkEffectiveStakeBatchSize int = 500 + networkEffectiveStakeBatchSize int = 250 ) type NetworkDetails struct { From 76c78009287b27d8f80b161b4c596432df147458 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 27 Mar 2023 00:53:19 -0400 Subject: [PATCH 602/878] Added DistributableBalance --- utils/state/minipool.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index fbde1e6d7..baba1df9e 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -47,6 +47,7 @@ type NativeMinipoolDetails struct { NodeAddress common.Address Version uint8 Balance *big.Int // Contract balance + DistributableBalance *big.Int // Contract balance minus node op refund NodeShareOfBalance *big.Int // Result of calculateNodeShare(contract balance) UserShareOfBalance *big.Int // Result of calculateUserShare(contract balance) NodeRefundBalance *big.Int @@ -520,10 +521,10 @@ func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContract } mpContract := mp.GetContract() - properBalance := big.NewInt(0).Sub(details.Balance, details.NodeRefundBalance) - if properBalance.Cmp(zero) >= 0 { - mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", properBalance) - mc.AddCall(mpContract, &details.UserShareOfBalance, "calculateUserShare", properBalance) + details.DistributableBalance = big.NewInt(0).Sub(details.Balance, details.NodeRefundBalance) + if details.DistributableBalance.Cmp(zero) >= 0 { + mc.AddCall(mpContract, &details.NodeShareOfBalance, "calculateNodeShare", details.DistributableBalance) + mc.AddCall(mpContract, &details.UserShareOfBalance, "calculateUserShare", details.DistributableBalance) } else { details.NodeShareOfBalance = big.NewInt(0) details.UserShareOfBalance = big.NewInt(0) @@ -532,7 +533,7 @@ func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContract return nil } -// Fixes a legacy minipool details struct with supplemental logic +// Fixes a minipool details struct with supplemental logic func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *NativeMinipoolDetails, opts *bind.CallOpts) error { details.Status = types.MinipoolStatus(details.StatusRaw) From 27a6bc0dfefab08143797d22536c69879c038886 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 28 Mar 2023 01:27:32 -0400 Subject: [PATCH 603/878] Updated the Distribute signature --- minipool/minipool-contract-v2.go | 2 ++ minipool/minipool-contract-v3.go | 10 ++++++---- minipool/minipool-interface.go | 2 -- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index c25f77f75..b33bf2b6b 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -26,6 +26,8 @@ type MinipoolV2 interface { Minipool EstimateDistributeBalanceAndFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) + EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) } // Minipool contract diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 8a26f6d6d..67d6a6755 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -26,6 +26,8 @@ type MinipoolV3 interface { Promote(opts *bind.TransactOpts) (common.Hash, error) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) GetUserDistributed(opts *bind.CallOpts) (bool, error) + EstimateDistributeBalanceGas(rewardsOnly bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DistributeBalance(rewardsOnly bool, opts *bind.TransactOpts) (common.Hash, error) } // Minipool contract @@ -357,13 +359,13 @@ func (mp *minipool_v3) GetUserDistributed(opts *bind.CallOpts) (bool, error) { } // Estimate the gas of DistributeBalance -func (mp *minipool_v3) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance") +func (mp *minipool_v3) EstimateDistributeBalanceGas(rewardsOnly bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distributeBalance", rewardsOnly) } // Distribute the minipool's ETH balance to the node operator and rETH staking pool. -func (mp *minipool_v3) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { - tx, err := mp.Contract.Transact(opts, "distributeBalance") +func (mp *minipool_v3) DistributeBalance(rewardsOnly bool, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "distributeBalance", rewardsOnly) if err != nil { return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) } diff --git a/minipool/minipool-interface.go b/minipool/minipool-interface.go index 39a4b77c9..d87722fbc 100644 --- a/minipool/minipool-interface.go +++ b/minipool/minipool-interface.go @@ -76,8 +76,6 @@ type Minipool interface { GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) Refund(opts *bind.TransactOpts) (common.Hash, error) - EstimateDistributeBalanceGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 748dd907c62fa31e893d941709672d808782bb33 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 28 Mar 2023 21:51:00 -0400 Subject: [PATCH 604/878] Added the new rewards event retrieval method --- rewards/rewards.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index 1fcaeb79f..346bc41bf 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -173,7 +173,89 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission return tx.Hash(), nil } +// Get the event info for a rewards snapshot using the Atlas getter +func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { + // Get contracts + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return false, RewardsEvent{}, err + } + + // Get the block that the event was emitted on + indexBig := big.NewInt(0).SetUint64(index) + blockWrapper := new(*big.Int) + if err := rocketRewardsPool.Call(opts, blockWrapper, "getClaimIntervalExecutionBlock", indexBig); err != nil { + return false, RewardsEvent{}, fmt.Errorf("error getting the event block for interval %d: %w", index, err) + } + block := *blockWrapper + + // Create the list of addresses to check + currentAddress := *rocketRewardsPool.Address + if rocketRewardsPoolAddresses == nil { + rocketRewardsPoolAddresses = []common.Address{currentAddress} + } else { + found := false + for _, address := range rocketRewardsPoolAddresses { + if address == currentAddress { + found = true + break + } + } + if !found { + rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, currentAddress) + } + } + + // Construct a filter query for relevant logs + indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) + addressFilter := rocketRewardsPoolAddresses + topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(1), block, block, nil) + if err != nil { + return false, RewardsEvent{}, err + } + + // Get the log info + values := make(map[string]interface{}) + if len(logs) == 0 { + return false, RewardsEvent{}, nil + } + err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + if err != nil { + return false, RewardsEvent{}, err + } + + // Get the decoded data + submissionPrototype := RewardSubmission{} + submissionType := reflect.TypeOf(submissionPrototype) + submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) + eventIntervalStartTime := values["intervalStartTime"].(*big.Int) + eventIntervalEndTime := values["intervalEndTime"].(*big.Int) + submissionTime := values["time"].(*big.Int) + eventData := RewardsEvent{ + Index: indexBig, + ExecutionBlock: submission.ExecutionBlock, + ConsensusBlock: submission.ConsensusBlock, + IntervalsPassed: submission.IntervalsPassed, + TreasuryRPL: submission.TreasuryRPL, + TrustedNodeRPL: submission.TrustedNodeRPL, + NodeRPL: submission.NodeRPL, + NodeETH: submission.NodeETH, + MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleTreeCID: submission.MerkleTreeCID, + IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(submissionTime.Int64(), 0), + } + + return true, eventData, nil +} + // Get the event info for a rewards snapshot +// NOTE: Deprecated, remove after Atlas func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp, opts) @@ -233,6 +315,7 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz } // Get the event info for a rewards snapshot +// NOTE: Deprecated, remove after Atlas func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp, opts) From 40940499bd2552f7f18cabf4f44184c7deb38a8e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 30 Mar 2023 17:11:26 -0400 Subject: [PATCH 605/878] Removed duplicates of the latest rocketRewardsPool address in the event getter --- rewards/rewards.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 346bc41bf..aca65a161 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -323,13 +323,20 @@ func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, return false, RewardsEvent{}, err } - rocketRewardsPoolAddresses = append(rocketRewardsPoolAddresses, *rocketRewardsPool.Address) + latestAddress := *rocketRewardsPool.Address + cleanedAddresses := []common.Address{latestAddress} + for _, address := range rocketRewardsPoolAddresses { + if address != latestAddress { + // Remove duplicates of the latest address, necessary for pre-Atlas support + cleanedAddresses = append(cleanedAddresses, address) + } + } // Construct a filter query for relevant logs indexBig := big.NewInt(0).SetUint64(index) indexBytes := [32]byte{} indexBig.FillBytes(indexBytes[:]) - addressFilter := rocketRewardsPoolAddresses + addressFilter := cleanedAddresses topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} // Get the event logs From 9bc6699c227d3ff3e07bc0c9fd78ba91e9e2f308 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Fri, 28 Apr 2023 14:43:02 +1000 Subject: [PATCH 606/878] Use collateralisation ratio in distributor balance calculation --- utils/state/node.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/utils/state/node.go b/utils/state/node.go index 81ecd8a13..0662225f2 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -3,6 +3,7 @@ package state import ( "context" "fmt" + "github.com/rocket-pool/rocketpool-go/utils/eth" "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -47,6 +48,7 @@ type NativeNodeDetails struct { SmoothingPoolRegistrationChanged *big.Int NodeAddress common.Address AverageNodeFee *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this + CollateralisationRatio *big.Int DistributorBalance *big.Int } @@ -58,6 +60,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts details := NativeNodeDetails{ NodeAddress: nodeAddress, AverageNodeFee: big.NewInt(0), + CollateralisationRatio: big.NewInt(0), DistributorBalanceUserETH: big.NewInt(0), DistributorBalanceNodeETH: big.NewInt(0), } @@ -132,6 +135,13 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra details.DistributorBalanceUserETH = big.NewInt(0) details.DistributorBalanceNodeETH = big.NewInt(0) + if !isAtlasDeployed { + // Before Atlas, all node's had a 1:1 collateralisation ratio + details.CollateralisationRatio = eth.EthToWei(2) + } else { + details.CollateralisationRatio = big.NewInt(0) + } + addNodeDetailsCalls(contracts, mc, details, address, isAtlasDeployed) } _, err = mc.FlexibleCall(true, opts) @@ -198,20 +208,24 @@ func CalculateAverageFeeAndDistributorShares(rp *rocketpool.RocketPool, contract // Get the user and node portions of the distributor balance distributorBalance := big.NewInt(0).Set(node.DistributorBalance) if distributorBalance.Cmp(big.NewInt(0)) > 0 { - halfBalance := big.NewInt(0) - halfBalance.Div(distributorBalance, two) + nodeBalance := big.NewInt(0) + nodeBalance.Mul(distributorBalance, big.NewInt(1e18)) + nodeBalance.Div(nodeBalance, node.CollateralisationRatio) + + userBalance := big.NewInt(0) + userBalance.Sub(distributorBalance, nodeBalance) if eligibleMinipools == 0 { - // Split it 50/50 if there are no minipools - node.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) - node.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) + // Split it based solely on the collateralisation ratio if there are no minipools (and hence no average fee) + node.DistributorBalanceNodeETH = big.NewInt(0).Set(nodeBalance) + node.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, nodeBalance) } else { // Amount of ETH given to the NO as a commission commissionEth := big.NewInt(0) - commissionEth.Mul(halfBalance, node.AverageNodeFee) + commissionEth.Mul(userBalance, node.AverageNodeFee) commissionEth.Div(commissionEth, big.NewInt(1e18)) - node.DistributorBalanceNodeETH.Add(halfBalance, commissionEth) // Node gets half + commission + node.DistributorBalanceNodeETH.Add(nodeBalance, commissionEth) // Node gets their portion + commission on user portion node.DistributorBalanceUserETH.Sub(distributorBalance, node.DistributorBalanceNodeETH) // User gets balance - node share } @@ -293,5 +307,6 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, if isAtlasDeployed { mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) + mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) } } From 2e5bd9a8afc64f3ff4ad5eb0c1fee207212bdb93 Mon Sep 17 00:00:00 2001 From: Kane Wallmann Date: Tue, 2 May 2023 13:11:30 +1000 Subject: [PATCH 607/878] Add stake RPL on behalf of --- node/staking.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/node/staking.go b/node/staking.go index 24173282c..3b43cbf13 100644 --- a/node/staking.go +++ b/node/staking.go @@ -158,6 +158,28 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact return tx.Hash(), nil } +// Estimate the gas of set stake RPL for allowed +func EstimateSetStakeRPLForAllowedGas(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "setStakeRPLForAllowed", caller, allowed) +} + +// Set stake RPL for allowed +func SetStakeRPLForAllowed(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeStaking.Transact(opts, "setStakeRPLForAllowed", caller, allowed) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not set stake RPL for allowed: %w", err) + } + return tx.Hash(), nil +} + // Estimate the gas of WithdrawRPL func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, nil) From d05456cb5284027a7df099a2c1a0c8815981ede1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 1 May 2023 23:50:04 -0400 Subject: [PATCH 608/878] Added legacy and new fee distributor calculation methods --- utils/state/node.go | 52 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/utils/state/node.go b/utils/state/node.go index 0662225f2..62954e01d 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -3,9 +3,10 @@ package state import ( "context" "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" "math/big" + "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/node" @@ -188,7 +189,54 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra } // Calculate the average node fee and user/node shares of the distributor's balance -func CalculateAverageFeeAndDistributorShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { +func CalculateAverageFeeAndDistributorShares_Legacy(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { + + // Calculate the total of all fees for staking minipools that aren't finalized + totalFee := big.NewInt(0) + eligibleMinipools := int64(0) + for _, mpd := range minipoolDetails { + if mpd.Status == types.Staking && !mpd.Finalised { + totalFee.Add(totalFee, mpd.NodeFee) + eligibleMinipools++ + } + } + + // Get the average fee (0 if there aren't any minipools) + if eligibleMinipools > 0 { + node.AverageNodeFee.Div(totalFee, big.NewInt(eligibleMinipools)) + } + + // Get the user and node portions of the distributor balance + distributorBalance := big.NewInt(0).Set(node.DistributorBalance) + if distributorBalance.Cmp(big.NewInt(0)) > 0 { + halfBalance := big.NewInt(0) + halfBalance.Div(distributorBalance, two) + + if eligibleMinipools == 0 { + // Split it 50/50 if there are no minipools + node.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) + node.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) + } else { + // Amount of ETH given to the NO as a commission + commissionEth := big.NewInt(0) + commissionEth.Mul(halfBalance, node.AverageNodeFee) + commissionEth.Div(commissionEth, big.NewInt(1e18)) + + node.DistributorBalanceNodeETH.Add(halfBalance, commissionEth) // Node gets half + commission + node.DistributorBalanceUserETH.Sub(distributorBalance, node.DistributorBalanceNodeETH) // User gets balance - node share + } + + } else { + // No distributor balance + node.DistributorBalanceNodeETH = big.NewInt(0) + node.DistributorBalanceUserETH = big.NewInt(0) + } + + return nil +} + +// Calculate the average node fee and user/node shares of the distributor's balance +func CalculateAverageFeeAndDistributorShares_New(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { // Calculate the total of all fees for staking minipools that aren't finalized totalFee := big.NewInt(0) From b8077dac317634bbdadc4380509797df00ee1c58 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 4 May 2023 23:29:35 -0400 Subject: [PATCH 609/878] Added EthMatched and EthMatchedLimit to node details --- utils/state/node.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/state/node.go b/utils/state/node.go index 62954e01d..3ad8da43a 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -344,6 +344,8 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeStaking, &details.EffectiveRPLStake, "getNodeEffectiveRPLStake", address) mc.AddCall(contracts.RocketNodeStaking, &details.MinimumRPLStake, "getNodeMinimumRPLStake", address) mc.AddCall(contracts.RocketNodeStaking, &details.MaximumRPLStake, "getNodeMaximumRPLStake", address) + mc.AddCall(contracts.RocketNodeStaking, &details.EthMatched, "getNodeETHMatched", address) + mc.AddCall(contracts.RocketNodeStaking, &details.EthMatchedLimit, "getNodeETHMatchedLimit", address) mc.AddCall(contracts.RocketMinipoolManager, &details.MinipoolCount, "getNodeMinipoolCount", address) mc.AddCall(contracts.RocketTokenRETH, &details.BalanceRETH, "balanceOf", address) mc.AddCall(contracts.RocketTokenRPL, &details.BalanceRPL, "balanceOf", address) From bfb886d77bc3188f09f14c7a27efcb1762fa4750 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 9 May 2023 02:45:03 -0400 Subject: [PATCH 610/878] Added revert message normalization for Nethermind --- rocketpool/contract.go | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 53fb73cef..6f8e53e59 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -3,10 +3,12 @@ package rocketpool import ( "bytes" "context" + "encoding/hex" "errors" "fmt" "math/big" "reflect" + "regexp" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -17,8 +19,9 @@ import ( // Transaction settings const ( - GasLimitMultiplier float64 = 1.5 - MaxGasLimit uint64 = 30000000 + GasLimitMultiplier float64 = 1.5 + MaxGasLimit uint64 = 30000000 + NethermindRevertRegex string = "Reverted 0x(?P[0-9a-fA-F]+).*" ) // Contract type wraps go-ethereum bound contract @@ -84,7 +87,7 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in // Send transaction tx, err := c.Contract.Transact(opts, method, params...) if err != nil { - return nil, err + return nil, c.normalizeErrorMessage(err) } return tx, nil @@ -122,7 +125,7 @@ func (c *Contract) Transfer(opts *bind.TransactOpts) (common.Hash, error) { // Send transaction tx, err := c.Contract.Transfer(opts) if err != nil { - return common.Hash{}, err + return common.Hash{}, c.normalizeErrorMessage(err) } return tx.Hash(), nil @@ -142,7 +145,7 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint }) if err != nil { - return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", err) + return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", c.normalizeErrorMessage(err)) } // Pad and return gas limit @@ -220,3 +223,30 @@ func (c *Contract) GetTransactionEvents(txReceipt *types.Receipt, eventName stri return events, nil } + +// Normalize error messages so they're all in ASCII format +func (c *Contract) normalizeErrorMessage(err error) error { + if err == nil { + return err + } + + // Get the message in hex format, if it exists + reg := regexp.MustCompile(NethermindRevertRegex) + matches := reg.FindStringSubmatch(err.Error()) + if matches == nil { + return err + } + messageIndex := reg.SubexpIndex("message") + if messageIndex == -1 { + return err + } + message := matches[messageIndex] + + // Convert the hex message to ASCII + bytes, err2 := hex.DecodeString(message) + if err2 != nil { + return err // Return the original error if decoding failed somehow + } + + return errors.New(string(bytes)) +} From c137e2c0a01e395fa7d1720d61e33ee903e69ca4 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 10 May 2023 14:58:37 -0400 Subject: [PATCH 611/878] Add more error checking to balances multicall --- utils/multicall/balances.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/utils/multicall/balances.go b/utils/multicall/balances.go index 40adb3de2..a2aa4cf56 100644 --- a/utils/multicall/balances.go +++ b/utils/multicall/balances.go @@ -74,7 +74,14 @@ func (b *BalanceBatcher) GetEthBalances(addresses []common.Address, opts *bind.C if err != nil { return fmt.Errorf("error unpacking balances response: %w", err) } + + if len(subBalances) != len(subAddresses) { + return fmt.Errorf("received %d balances which mismatches query batch size %d", len(subBalances), len(subAddresses)) + } for j, balance := range subBalances { + if balance == nil { + return fmt.Errorf("received nil balance for address %s", subAddresses[j].String()) + } balances[i+j] = balance } From a85be7a4bfd512abb2b7b1a8f281245445ec8db2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 11 May 2023 01:25:39 -0400 Subject: [PATCH 612/878] Reduced the batch size for balance multicalls --- utils/multicall/balances.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/multicall/balances.go b/utils/multicall/balances.go index 40adb3de2..e9ff253a4 100644 --- a/utils/multicall/balances.go +++ b/utils/multicall/balances.go @@ -15,7 +15,7 @@ import ( ) const ( - balanceBatchSize int = 2000 + balanceBatchSize int = 1000 threadLimit int = 6 ) From 31ce0adbcff689d24ac98cf3efc398a9a425bbfe Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Thu, 11 May 2023 18:51:58 +0000 Subject: [PATCH 613/878] Cache decoded abis --- rocketpool/abi.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rocketpool/abi.go b/rocketpool/abi.go index e8d8340fa..59bdeef97 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -5,12 +5,20 @@ import ( "compress/zlib" "encoding/base64" "fmt" + "sync" + "github.com/ethereum/go-ethereum/accounts/abi" ) +var decoderCache sync.Map + // Decode, decompress and parse a zlib-compressed, base64-encoded ABI func DecodeAbi(abiEncoded string) (*abi.ABI, error) { + if cached, ok := decoderCache.Load(abiEncoded); ok { + return cached.(*abi.ABI), nil + } + // base64 decode abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) if err != nil { @@ -33,6 +41,8 @@ func DecodeAbi(abiEncoded string) (*abi.ABI, error) { return nil, fmt.Errorf("Could not parse JSON: %w", err) } + decoderCache.Store(abiEncoded, &abiParsed) + // Return return &abiParsed, nil From 8ae5d50aef0c91bc0e08cbdf47ed83162381dc87 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 12 May 2023 00:41:34 -0400 Subject: [PATCH 614/878] Added a prefix to converted Nethermind errors --- rocketpool/contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 6f8e53e59..70b101e64 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -248,5 +248,5 @@ func (c *Contract) normalizeErrorMessage(err error) error { return err // Return the original error if decoding failed somehow } - return errors.New(string(bytes)) + return fmt.Errorf("Reverted: %s", string(bytes)) } From df05ced48a1018679fafd13380aebb71ccfc02ad Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 15 May 2023 02:29:08 -0400 Subject: [PATCH 615/878] Added beacon balance shares to minipool details --- utils/state/minipool.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index baba1df9e..db3229d55 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -16,7 +16,7 @@ import ( const ( minipoolBatchSize int = 100 - minipoolCompleteShareBatchSize int = 1000 + minipoolCompleteShareBatchSize int = 500 minipoolAddressBatchSize int = 1000 minipoolVersionBatchSize int = 500 ) @@ -56,6 +56,8 @@ type NativeMinipoolDetails struct { DepositType types.MinipoolDeposit NodeShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this UserShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this + NodeShareOfBeaconBalance *big.Int // Must call CalculateCompleteMinipoolShares to get this + UserShareOfBeaconBalance *big.Int // Must call CalculateCompleteMinipoolShares to get this // Atlas UserDistributed bool @@ -172,13 +174,23 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo } mpContract := mp.GetContract() + // Calculate the Beacon shares + beaconBalance := big.NewInt(0).Set(beaconBalances[j]) + if beaconBalance.Cmp(zero) > 0 { + mc.AddCall(mpContract, &details.NodeShareOfBeaconBalance, "calculateNodeShare", beaconBalance) + mc.AddCall(mpContract, &details.UserShareOfBeaconBalance, "calculateUserShare", beaconBalance) + } else { + details.NodeShareOfBeaconBalance = big.NewInt(0) + details.UserShareOfBeaconBalance = big.NewInt(0) + } + // Calculate the total balance totalBalance := big.NewInt(0).Set(beaconBalances[j]) // Total balance = beacon balance totalBalance.Add(totalBalance, details.Balance) // Add contract balance totalBalance.Sub(totalBalance, details.NodeRefundBalance) // Remove node refund // Calculate the node and user shares - if totalBalance.Cmp(zero) >= 0 { + if totalBalance.Cmp(zero) > 0 { mc.AddCall(mpContract, &details.NodeShareOfBalanceIncludingBeacon, "calculateNodeShare", totalBalance) mc.AddCall(mpContract, &details.UserShareOfBalanceIncludingBeacon, "calculateUserShare", totalBalance) } else { From 8229ad2b834e394126b465b89522ff0a7151a249 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 15 May 2023 17:58:28 -0400 Subject: [PATCH 616/878] Cached the minipool ABI objects to trim rocketStorage calls and decodes during state snapshotting --- minipool/minipool-constructor.go | 16 ++++++++++++++-- minipool/minipool-contract-v2.go | 17 ++++++++++++++--- minipool/minipool-contract-v3.go | 19 +++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index 6cc671510..89d83653b 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -5,6 +5,7 @@ import ( "strings" "sync" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -49,8 +50,8 @@ func NewMinipoolFromVersion(rp *rocketpool.RocketPool, address common.Address, v } } -// Create a minipool contract directly from its ABI - used for legacy minipools -func createMinipoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { +// Create a minipool contract directly from its ABI, encoded in string form +func createMinipoolContractFromEncodedAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { // Decode ABI abi, err := rocketpool.DecodeAbi(encodedAbi) if err != nil { @@ -66,6 +67,17 @@ func createMinipoolContractFromAbi(rp *rocketpool.RocketPool, address common.Add }, nil } +// Create a minipool contract directly from its ABI +func createMinipoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} + // Get a minipool contract var rocketMinipoolLock sync.Mutex diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index b33bf2b6b..ec8d0a280 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -19,7 +20,7 @@ import ( ) const ( - minipoolV2ABI string = "eJzdWd1v2jAQ/1cqnvvUaVPVt3ZdpUnrVEG7PVQVcpIDLIyN7HMYqva/7xwgHyRAKHGT7qkNXO5+97vzfZjn1x6TSi5nypre1YgJA+c9LucW6fH5lf6N4A9EvSvUNvkGQUsmHpdz6F31WBRpMKZ33pNs5j4YaTWjJyx+/fc8pyi1UdBk6fni85dMEyNEEjNdG4G36EJOf8qaXlKBbzgBfQtzZTiS3lQUYiAMzmSTJJFsaAt2TiFKqgiuGyTLGtBN6kOFTNwwwWRYFQRv4fzNcRJptmDiQauQ2PUfWFQfNfc3ZMm3U1SNJ1gi5BiKmeARQ6UfbDCFZWZtJVfDwV0KB3wsGVoNb9X56SLTGq1KwS1D1lcKt1SS5DtHdcvpRZraXzVEFCZOb73B7+OT5Z5LPleKjhQYZNNTjlTTkAahtkHg/5DPYBaAbuagH3QuceqXar4pOVuXGRAKJlpThHLpyaXE1NOcTm21V6kP2TsxaMOVK07KYs7DfS6VnCF1zk24t8gCLjgunWYOi0xyZGWIztAOHGPAwYapPUhA2tlZmpebF/ziuuNkn6+a3B5oASGqwpJ83ihFN0KF08MRKyRPdeI0BulxlZttISpZK9WW4c7iUvQmXxVaDvZ6ak4s1j8U67e8n4qfbjhOWd6DrhSK6hg0BOkO2szDEpx1NLIhvTPI+kCCUQeBrSm7Nobmzi6cwyeTbrAdoyuHrJN0bUC13B0K8B7d0pyW+QO1q+2mJQtFtnIsPqITDKNCRyl1hbUYve7WHpp4CuRU+klj8pwtWSDgaG+3Nq9hrQW2noYDG+v+DXV4eEXNuJJZwTpMVk2mMu02O0oetOukAzQZ40y3EcxM/KgercdxP9pDJgdu/W6ljnYxw02JjeaSBDC9Sly96MFIxA1qHliEdfO+ltGd1xQqWfRaRkstahjsvBHOp7kIrSAYbuIaTJju1PZ2ok9uAmnbp0I6GCViX/VKKF95HNN8lAxKXvM3VBI1C/Gsr8Kpu05Qmo3huxMasSTimxzQeYFjpqK256p6fBERVDdsSP6dfNdb8liJ6BYEjAnILoePUyhhcZLC4283N+b6SgigxTW5Amv0hvx/Zu1pPtYs8n+H/5F/pu5DCDyu5qjOvM2ECFxa1pTXK3M7+0Yxcp5mldyhCtjWrXLjG19hah7S+Idcjium52w+pFb+gxAYzB0bDzSMD1lq6QK4DpL3u1990BBzKhNdw/VtNAKSiaElYC//AGQZTdM=" + minipoolV2EncodedAbi string = "eJzdWd1v2jAQ/1cqnvvUaVPVt3ZdpUnrVEG7PVQVcpIDLIyN7HMYqva/7xwgHyRAKHGT7qkNXO5+97vzfZjn1x6TSi5nypre1YgJA+c9LucW6fH5lf6N4A9EvSvUNvkGQUsmHpdz6F31WBRpMKZ33pNs5j4YaTWjJyx+/fc8pyi1UdBk6fni85dMEyNEEjNdG4G36EJOf8qaXlKBbzgBfQtzZTiS3lQUYiAMzmSTJJFsaAt2TiFKqgiuGyTLGtBN6kOFTNwwwWRYFQRv4fzNcRJptmDiQauQ2PUfWFQfNfc3ZMm3U1SNJ1gi5BiKmeARQ6UfbDCFZWZtJVfDwV0KB3wsGVoNb9X56SLTGq1KwS1D1lcKt1SS5DtHdcvpRZraXzVEFCZOb73B7+OT5Z5LPleKjhQYZNNTjlTTkAahtkHg/5DPYBaAbuagH3QuceqXar4pOVuXGRAKJlpThHLpyaXE1NOcTm21V6kP2TsxaMOVK07KYs7DfS6VnCF1zk24t8gCLjgunWYOi0xyZGWIztAOHGPAwYapPUhA2tlZmpebF/ziuuNkn6+a3B5oASGqwpJ83ihFN0KF08MRKyRPdeI0BulxlZttISpZK9WW4c7iUvQmXxVaDvZ6ak4s1j8U67e8n4qfbjhOWd6DrhSK6hg0BOkO2szDEpx1NLIhvTPI+kCCUQeBrSm7Nobmzi6cwyeTbrAdoyuHrJN0bUC13B0K8B7d0pyW+QO1q+2mJQtFtnIsPqITDKNCRyl1hbUYve7WHpp4CuRU+klj8pwtWSDgaG+3Nq9hrQW2noYDG+v+DXV4eEXNuJJZwTpMVk2mMu02O0oetOukAzQZ40y3EcxM/KgercdxP9pDJgdu/W6ljnYxw02JjeaSBDC9Sly96MFIxA1qHliEdfO+ltGd1xQqWfRaRkstahjsvBHOp7kIrSAYbuIaTJju1PZ2ok9uAmnbp0I6GCViX/VKKF95HNN8lAxKXvM3VBI1C/Gsr8Kpu05Qmo3huxMasSTimxzQeYFjpqK256p6fBERVDdsSP6dfNdb8liJ6BYEjAnILoePUyhhcZLC4283N+b6SgigxTW5Amv0hvx/Zu1pPtYs8n+H/5F/pu5DCDyu5qjOvM2ECFxa1pTXK3M7+0Yxcp5mldyhCtjWrXLjG19hah7S+Idcjium52w+pFb+gxAYzB0bDzSMD1lq6QK4DpL3u1990BBzKhNdw/VtNAKSiaElYC//AGQZTdM=" ) type MinipoolV2 interface { @@ -38,11 +39,21 @@ type minipool_v2 struct { RocketPool *rocketpool.RocketPool } +// The decoded ABI for v2 minipools +var minipoolV2Abi *abi.ABI + // Create new minipool contract func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address) (Minipool, error) { - // Get contract - contract, err := createMinipoolContractFromAbi(rp, address, minipoolV2ABI) + var contract *rocketpool.Contract + var err error + if minipoolV2Abi == nil { + // Get contract + contract, err = createMinipoolContractFromEncodedAbi(rp, address, minipoolV2EncodedAbi) + minipoolV2Abi = contract.ABI + } else { + contract, err = createMinipoolContractFromAbi(rp, address, minipoolV2Abi) + } if err != nil { return nil, err } diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 67d6a6755..afcdf5c62 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -18,6 +19,10 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +const ( + minipoolV3EncodedAbi string = "eJztWltv2koQ/isVz3lq1SrqW3Jon5qeCJKch6pCY+8Aqyy71l7MQdH57x0bY2Mw2MAau0d9SsDjmW8uO7flx9sApJKrhXJm8HkKwuDNgMvIWfr4443+Zfgvsq1HFrUE8bSKcPB54Ojz+4+fBjcDCYvki0hjzInXvZLsjphKS89smfi/m9P5Slz6Zmk5/dnn9DMnSASOkLmQmOZ0GCMBSOQ1s5vVbh8LMKbRmALLVKtFIWPz+Byt4JoW+mLnqIcYKcNt+0Yi2tCV5FxiKKkY+gwnZ1B7DU9lQdyDABlWOaE1d/7D7ZxpWIJ41Cok67bvWKt+19jfGEueb6JqPMHK4paFYhCcgVX60QWvuCqkrekaKHiI4ZjPJFin8VyeH94XXNk6FQzBwkgpu8OSKK/s1R2ll3lo/6WRkZs4vXWG3qcHywOXPFKKjhQaC6+XHCn/kNRCXZS9fSMah9oFwRUQBZ47itBpTUCvm7Q3VnuBkKSuKMIi0O3n7AUuAtR+8natjmlEvFwWpZVqJbJuCyB0Nq0zZSi3LamUinqOKAlXa5XrULwT4IzLZ+ozhtxYzQNqhuhN5WxBmWiAD85CwAW3q7TPkRGsIBBbeKZOhpYrWRb0VqvVJDgY2gXKEEToBMH4Th3WeA66DLJeSjX3fc1ijstr65RYv2udtmHJLH0fhxNQfqjCkn7vCcg4qWtdwxDKeD0SP3dbm3rmp3PmxigRt3uUy6afaFyCZuZvKVYVbiiAZVmmqGgtWHbKCSZvy28ztNmAmlriaHyidIt3m3o6zB1eeYRvvQQsofuaqc86PjsEJUnYd3mhPwJmrxuo6AP8Qco8cWcMzSp9sVMGqupkdFUNMmRfsVdwRkiErId2elLRc/QCwvUGFfXu34DI5n1D9cBnGhKy7t1Yn4smB0eTklqlmaLjhDLezB1Ni1P+Qru1aS3mXqjwtS/RuIb0tB6veoHoKVnU5tFU48XrwUrnxL5VzgpQfXLlFrzuM90+srwf74En03WT7QRHgxIgS53s4TpA6TRZAnuePposHZRkmypfuSU8tseeNLoOaMahZv9/fN8/qV/4F7aONA49D9ENDX18x1vDoHapW9Iw2b1mm9h25tmoYt/jjblOb7tLF+2tSEkmgnZ4GwFm3u4mpfuTZPZWbd7s54oK2MKqy5Wq2J0Qatl5LYtRm+RxbaG/rYLhr92O6VSnXaRnxzZ7PVSS3OJCiuOL79n2yrESbIgCZ2C3JJ5wYbTHUOLyIoanX9dsxI2UEMjuIR2IMnI/t5P/Z6s9RzMN7M/PqA6YKf0pyQhD5HHju0C2FZAB7MznHm89Sg5sR0i6os/jshdr5y/TKRJNjH0D9pj9vrJvuGg+/UZMTENPdjcZahW+JlskpWF2MA3+XtPlzt2eQWu5nFUYddM+1rnrPIBN+kPIklVDer3OiQT+F40AQik=" +) + type MinipoolV3 interface { Minipool EstimateReduceBondAmountGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) @@ -38,11 +43,21 @@ type minipool_v3 struct { RocketPool *rocketpool.RocketPool } +// The decoded ABI for v2 minipools +var minipoolV3Abi *abi.ABI + // Create new minipool contract func newMinipool_v3(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Minipool, error) { - // Get contract - contract, err := getMinipoolContract(rp, address, opts) + var contract *rocketpool.Contract + var err error + if minipoolV2Abi == nil { + // Get contract + contract, err = createMinipoolContractFromEncodedAbi(rp, address, minipoolV3EncodedAbi) + minipoolV3Abi = contract.ABI + } else { + contract, err = createMinipoolContractFromAbi(rp, address, minipoolV3Abi) + } if err != nil { return nil, err } From f9368964e8cbc8986803e32bf55eddd9ff49e50c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 15 May 2023 19:59:55 -0400 Subject: [PATCH 617/878] Fixed an out-of-place error check --- minipool/minipool-contract-v2.go | 3 ++- minipool/minipool-contract-v3.go | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index ec8d0a280..895080341 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -50,12 +50,13 @@ func newMinipool_v2(rp *rocketpool.RocketPool, address common.Address) (Minipool if minipoolV2Abi == nil { // Get contract contract, err = createMinipoolContractFromEncodedAbi(rp, address, minipoolV2EncodedAbi) - minipoolV2Abi = contract.ABI } else { contract, err = createMinipoolContractFromAbi(rp, address, minipoolV2Abi) } if err != nil { return nil, err + } else if minipoolV2Abi == nil { + minipoolV2Abi = contract.ABI } // Create and return diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index afcdf5c62..3e71115fa 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -51,15 +51,16 @@ func newMinipool_v3(rp *rocketpool.RocketPool, address common.Address, opts *bin var contract *rocketpool.Contract var err error - if minipoolV2Abi == nil { + if minipoolV3Abi == nil { // Get contract contract, err = createMinipoolContractFromEncodedAbi(rp, address, minipoolV3EncodedAbi) - minipoolV3Abi = contract.ABI } else { contract, err = createMinipoolContractFromAbi(rp, address, minipoolV3Abi) } if err != nil { return nil, err + } else if minipoolV3Abi == nil { + minipoolV3Abi = contract.ABI } // Create and return From d6338faacba2b432fdb1cbb68b1cf0348d256061 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 16 May 2023 01:06:16 -0400 Subject: [PATCH 618/878] Increased thread count, removed extra ABI parsing from rocketVersionInterface --- rocketpool/version-interface.go | 40 ++++++++++++++++----------------- utils/state/common.go | 5 +---- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/rocketpool/version-interface.go b/rocketpool/version-interface.go index 6bfc883af..99d41bc50 100644 --- a/rocketpool/version-interface.go +++ b/rocketpool/version-interface.go @@ -10,7 +10,7 @@ import ( ) const ( - rocketVersionInterfaceABI string = `[ + rocketVersionInterfaceAbiString string = `[ { "inputs": [], "name": "version", @@ -27,28 +27,24 @@ const ( ]` ) +var versionAbi *abi.ABI + // Get the version of the given contract func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bind.CallOpts) (uint8, error) { - - // Get the version interface ABI - /* - abi, err := rp.GetABI("rocketVersionInterface", opts) + if versionAbi == nil { + // Parse ABI using the hardcoded string until the contract is deployed + abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceAbiString)) if err != nil { - return 0, fmt.Errorf("error loading version interface ABI: %w", err) + return 0, fmt.Errorf("Could not parse version interface JSON: %w", err) } - */ - - // Parse ABI using the hardcoded string until the contract is deployed - abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceABI)) - if err != nil { - return 0, fmt.Errorf("Could not parse version interface JSON: %w", err) + versionAbi = &abiParsed } // Create contract contract := &Contract{ - Contract: bind.NewBoundContract(contractAddress, abiParsed, rp.Client, rp.Client, rp.Client), + Contract: bind.NewBoundContract(contractAddress, *versionAbi, rp.Client, rp.Client, rp.Client), Address: &contractAddress, - ABI: &abiParsed, + ABI: versionAbi, Client: rp.Client, } @@ -61,17 +57,21 @@ func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bi return *version, nil } +// Get the rocketVersion contract binding at the given address func GetRocketVersionContractForAddress(rp *RocketPool, address common.Address) (*Contract, error) { - // Parse ABI using the hardcoded string until the contract is deployed - abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceABI)) - if err != nil { - return nil, fmt.Errorf("Could not parse version interface JSON: %w", err) + if versionAbi == nil { + // Parse ABI using the hardcoded string until the contract is deployed + abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceAbiString)) + if err != nil { + return nil, fmt.Errorf("Could not parse version interface JSON: %w", err) + } + versionAbi = &abiParsed } return &Contract{ - Contract: bind.NewBoundContract(address, abiParsed, rp.Client, rp.Client, rp.Client), + Contract: bind.NewBoundContract(address, *versionAbi, rp.Client, rp.Client, rp.Client), Address: &address, - ABI: &abiParsed, + ABI: versionAbi, Client: rp.Client, }, nil } diff --git a/utils/state/common.go b/utils/state/common.go index cc54680a0..2db135ba1 100644 --- a/utils/state/common.go +++ b/utils/state/common.go @@ -2,15 +2,12 @@ package state import ( "math/big" - - "github.com/rocket-pool/rocketpool-go/utils/eth" ) const ( - threadLimit int = 6 + threadLimit int = 10 ) // Global constants var zero = big.NewInt(0) var two = big.NewInt(2) -var oneInWei = eth.EthToWei(1) From d5b0b67dda76b9dba2d2cd7a42c76ca91602bc30 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 16 May 2023 01:34:51 -0400 Subject: [PATCH 619/878] Added minipool queue length to NetworkDetails --- utils/state/network.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utils/state/network.go b/utils/state/network.go index d0278f382..c1f958d96 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -35,6 +35,7 @@ type NetworkDetails struct { DepositPoolBalance *big.Int DepositPoolExcess *big.Int QueueCapacity minipool.QueueCapacity + QueueLength *big.Int RPLInflationIntervalRate *big.Int RPLTotalSupply *big.Int PricesBlock uint64 @@ -76,6 +77,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i var scrubPeriodSeconds *big.Int var totalQueueCapacity *big.Int var effectiveQueueCapacity *big.Int + var totalQueueLength *big.Int var pricesBlock *big.Int var latestReportablePricesBlock *big.Int var ethUtilizationRate *big.Int @@ -104,6 +106,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolExcess, "getExcessBalance") contracts.Multicaller.AddCall(contracts.RocketMinipoolQueue, &totalQueueCapacity, "getTotalCapacity") contracts.Multicaller.AddCall(contracts.RocketMinipoolQueue, &effectiveQueueCapacity, "getEffectiveCapacity") + contracts.Multicaller.AddCall(contracts.RocketMinipoolQueue, &totalQueueLength, "getTotalLength") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") @@ -148,6 +151,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i Total: totalQueueCapacity, Effective: effectiveQueueCapacity, } + details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) From fb6011d25ff2a04762aacba8e3f42da1264cf088 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 17 May 2023 03:41:49 -0400 Subject: [PATCH 620/878] Removed Atlas checks --- utils/state/contracts.go | 19 +++++-------------- utils/state/minipool.go | 9 ++------- utils/state/network.go | 18 ++++++------------ utils/state/node.go | 27 +++++++++------------------ 4 files changed, 22 insertions(+), 51 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index a6f1e0368..48fa0783a 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -57,7 +57,7 @@ type contractArtifacts struct { } // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isAtlasDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { +func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) (*NetworkContracts, error) { // Get the latest block number if it's not provided if opts == nil { latestElBlock, err := rp.Client.BlockNumber(context.Background()) @@ -151,12 +151,10 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad } // Atlas wrappers - if isAtlasDeployed { - wrappers = append(wrappers, contractArtifacts{ - name: "rocketMinipoolBondReducer", - contract: &contracts.RocketMinipoolBondReducer, - }) - } + wrappers = append(wrappers, contractArtifacts{ + name: "rocketMinipoolBondReducer", + contract: &contracts.RocketMinipoolBondReducer, + }) // Add the address and ABI getters to multicall for i, wrapper := range wrappers { @@ -201,13 +199,6 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad return contracts, nil } -// Returns whether or not Atlas has been deployed -// TODO: refactor this so it comes first and we don't need to pass this check around everywhere -func (c *NetworkContracts) _isAtlasDeployed() bool { - constraint, _ := version.NewConstraint(">= 1.2.0") - return constraint.Check(c.Version) -} - // Get the current version of the network func (c *NetworkContracts) getCurrentVersion(rp *rocketpool.RocketPool) error { opts := &bind.CallOpts{ diff --git a/utils/state/minipool.go b/utils/state/minipool.go index db3229d55..a189da5ab 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -512,13 +512,8 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra penaltyRatekey := crypto.Keccak256Hash([]byte("minipool.penalty.rate"), address.Bytes()) mc.AddCall(contracts.RocketStorage, &details.PenaltyRate, "getUint", penaltyRatekey) - if contracts._isAtlasDeployed() { - // Query the minipool manager using the delegate-invariant function - mc.AddCall(contracts.RocketMinipoolManager, &details.DepositTypeRaw, "getMinipoolDepositType", address) - } else { - // Fallback to querying the minipool - mc.AddCall(mpContract, &details.DepositTypeRaw, "getDepositType") - } + // Query the minipool manager using the delegate-invariant function + mc.AddCall(contracts.RocketMinipoolManager, &details.DepositTypeRaw, "getMinipoolDepositType", address) return nil } diff --git a/utils/state/network.go b/utils/state/network.go index c1f958d96..22a5e4f30 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -63,7 +63,7 @@ type NetworkDetails struct { } // Create a snapshot of all of the network's details -func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isAtlasDeployed bool) (*NetworkDetails, error) { +func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) (*NetworkDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } @@ -124,17 +124,11 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") - if isAtlasDeployed { - contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &promotionScrubPeriodSeconds, "getPromotionScrubPeriod") - contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") - contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") - contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") - } else { - promotionScrubPeriodSeconds = big.NewInt(0) - windowStartRaw = big.NewInt(0) - windowLengthRaw = big.NewInt(0) - details.DepositPoolUserBalance = big.NewInt(0) - } + // Atlas things + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &promotionScrubPeriodSeconds, "getPromotionScrubPeriod") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowStartRaw, "getBondReductionWindowStart") + contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") + contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { diff --git a/utils/state/node.go b/utils/state/node.go index 3ad8da43a..9debf44e3 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -5,8 +5,6 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/node" @@ -54,7 +52,7 @@ type NativeNodeDetails struct { } // Gets the details for a node using the efficient multicall contract -func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, isAtlasDeployed bool) (NativeNodeDetails, error) { +func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address) (NativeNodeDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } @@ -66,7 +64,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts DistributorBalanceNodeETH: big.NewInt(0), } - addNodeDetailsCalls(contracts, contracts.Multicaller, &details, nodeAddress, isAtlasDeployed) + addNodeDetailsCalls(contracts, contracts.Multicaller, &details, nodeAddress) _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { @@ -97,7 +95,7 @@ func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Gets the details for all nodes using the efficient multicall contract -func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isAtlasDeployed bool) ([]NativeNodeDetails, error) { +func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]NativeNodeDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } @@ -135,15 +133,9 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra details.AverageNodeFee = big.NewInt(0) details.DistributorBalanceUserETH = big.NewInt(0) details.DistributorBalanceNodeETH = big.NewInt(0) + details.CollateralisationRatio = big.NewInt(0) - if !isAtlasDeployed { - // Before Atlas, all node's had a 1:1 collateralisation ratio - details.CollateralisationRatio = eth.EthToWei(2) - } else { - details.CollateralisationRatio = big.NewInt(0) - } - - addNodeDetailsCalls(contracts, mc, details, address, isAtlasDeployed) + addNodeDetailsCalls(contracts, mc, details, address) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -333,7 +325,7 @@ func getNodeAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts } // Add all of the calls for the node details to the multicaller -func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address, isAtlasDeployed bool) { +func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeNodeDetails, address common.Address) { mc.AddCall(contracts.RocketNodeManager, &details.Exists, "getNodeExists", address) mc.AddCall(contracts.RocketNodeManager, &details.RegistrationTime, "getNodeRegistrationTime", address) mc.AddCall(contracts.RocketNodeManager, &details.TimezoneLocation, "getNodeTimezoneLocation", address) @@ -355,8 +347,7 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationState, "getSmoothingPoolRegistrationState", address) mc.AddCall(contracts.RocketNodeManager, &details.SmoothingPoolRegistrationChanged, "getSmoothingPoolRegistrationChanged", address) - if isAtlasDeployed { - mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) - mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) - } + // Atlas + mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) + mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) } From 7b1ffb56e0f67c0e35f69ba8509e7404d00fb1d3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 17 May 2023 22:34:36 -0400 Subject: [PATCH 621/878] Finished GetRewardsEvent --- rewards/rewards.go | 128 ++------------------------------------------- 1 file changed, 3 insertions(+), 125 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index aca65a161..e87a3212a 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -228,64 +228,6 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA return false, RewardsEvent{}, err } - // Get the decoded data - submissionPrototype := RewardSubmission{} - submissionType := reflect.TypeOf(submissionPrototype) - submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) - eventIntervalStartTime := values["intervalStartTime"].(*big.Int) - eventIntervalEndTime := values["intervalEndTime"].(*big.Int) - submissionTime := values["time"].(*big.Int) - eventData := RewardsEvent{ - Index: indexBig, - ExecutionBlock: submission.ExecutionBlock, - ConsensusBlock: submission.ConsensusBlock, - IntervalsPassed: submission.IntervalsPassed, - TreasuryRPL: submission.TreasuryRPL, - TrustedNodeRPL: submission.TrustedNodeRPL, - NodeRPL: submission.NodeRPL, - NodeETH: submission.NodeETH, - MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), - MerkleTreeCID: submission.MerkleTreeCID, - IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), - IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), - SubmissionTime: time.Unix(submissionTime.Int64(), 0), - } - - return true, eventData, nil -} - -// Get the event info for a rewards snapshot -// NOTE: Deprecated, remove after Atlas -func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (RewardsEvent, error) { - // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return RewardsEvent{}, err - } - - // Construct a filter query for relevant logs - indexBig := big.NewInt(0).SetUint64(index) - indexBytes := [32]byte{} - indexBig.FillBytes(indexBytes[:]) - addressFilter := []common.Address{*rocketRewardsPool.Address} - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) - if err != nil { - return RewardsEvent{}, err - } - - // Get the log info - values := make(map[string]interface{}) - if len(logs) == 0 { - return RewardsEvent{}, fmt.Errorf("reward snapshot for interval %d not found", index) - } - err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) - if err != nil { - return RewardsEvent{}, err - } - // Get the decoded data submissionPrototype := RewardSubmission{} submissionType := reflect.TypeOf(submissionPrototype) @@ -310,76 +252,12 @@ func GetRewardSnapshotEvent(rp *rocketpool.RocketPool, index uint64, intervalSiz SubmissionTime: time.Unix(submissionTime.Int64(), 0), } - return eventData, nil - -} - -// Get the event info for a rewards snapshot -// NOTE: Deprecated, remove after Atlas -func GetRewardSnapshotEventWithUpgrades(rp *rocketpool.RocketPool, index uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { - // Get contracts - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return false, RewardsEvent{}, err - } - - latestAddress := *rocketRewardsPool.Address - cleanedAddresses := []common.Address{latestAddress} - for _, address := range rocketRewardsPoolAddresses { - if address != latestAddress { - // Remove duplicates of the latest address, necessary for pre-Atlas support - cleanedAddresses = append(cleanedAddresses, address) - } - } - - // Construct a filter query for relevant logs - indexBig := big.NewInt(0).SetUint64(index) - indexBytes := [32]byte{} - indexBig.FillBytes(indexBytes[:]) - addressFilter := cleanedAddresses - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) - if err != nil { - return false, RewardsEvent{}, err - } - - // Get the log info - values := make(map[string]interface{}) - if len(logs) == 0 { - return false, RewardsEvent{}, nil - } - err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) - if err != nil { - return false, RewardsEvent{}, err - } - - // Get the decoded data - submissionPrototype := RewardSubmission{} - submissionType := reflect.TypeOf(submissionPrototype) - submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) - eventIntervalStartTime := values["intervalStartTime"].(*big.Int) - eventIntervalEndTime := values["intervalEndTime"].(*big.Int) - submissionTime := values["time"].(*big.Int) - eventData := RewardsEvent{ - Index: indexBig, - ExecutionBlock: submission.ExecutionBlock, - ConsensusBlock: submission.ConsensusBlock, - IntervalsPassed: submission.IntervalsPassed, - TreasuryRPL: submission.TreasuryRPL, - TrustedNodeRPL: submission.TrustedNodeRPL, - NodeRPL: submission.NodeRPL, - NodeETH: submission.NodeETH, - MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), - MerkleTreeCID: submission.MerkleTreeCID, - IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), - IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), - SubmissionTime: time.Unix(submissionTime.Int64(), 0), + // Convert v1.1.0-rc1 events to modern ones + if eventData.UserETH == nil { + eventData.UserETH = big.NewInt(0) } return true, eventData, nil - } // Get contracts From 23e1a11cf351c61df2d53249fdc9839971b67427 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 6 Jun 2023 23:14:06 -0400 Subject: [PATCH 622/878] Added GetNodeShare and GetUserShare to the distributor --- node/distributor.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/node/distributor.go b/node/distributor.go index 8f048b7db..0706874c1 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -2,6 +2,7 @@ package node import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -61,6 +62,24 @@ func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Gets the node share of the distributor's current balance +func (d *Distributor) GetNodeShare(opts *bind.CallOpts) (*big.Int, error) { + nodeShare := new(*big.Int) + if err := d.Contract.Call(opts, nodeShare, "getNodeShare"); err != nil { + return nil, fmt.Errorf("Could not get distributor %s node share: %w", d.Address.Hex(), err) + } + return *nodeShare, nil +} + +// Gets the user share of the distributor's current balance +func (d *Distributor) GetUserShare(opts *bind.CallOpts) (*big.Int, error) { + userShare := new(*big.Int) + if err := d.Contract.Call(opts, userShare, "getUserShare"); err != nil { + return nil, fmt.Errorf("Could not get distributor %s user share: %w", d.Address.Hex(), err) + } + return *userShare, nil +} + // Get contracts var rocketNodeDistributorFactoryLock sync.Mutex From 3cc32640687800904fbbff3fe40539bdaf84c260 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Jun 2023 21:35:17 -0400 Subject: [PATCH 623/878] SendTransaction now accepts a data payload --- utils/eth/transactions.go | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index f74d80e7c..ad6fc53fb 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -12,7 +12,7 @@ import ( ) // Estimate the gas of SendTransaction -func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress common.Address, data []byte, useSafeGasLimit bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { // User-defined settings response := rocketpool.GasInfo{} @@ -23,24 +23,36 @@ func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress com value = big.NewInt(0) } + // Set default data + if data == nil { + data = []byte{} + } + // Estimate gas limit gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, To: &toAddress, GasPrice: big.NewInt(0), // set to 0 for simulation + Data: data, Value: value, }) if err != nil { return rocketpool.GasInfo{}, err } response.EstGasLimit = gasLimit - response.SafeGasLimit = gasLimit + + if useSafeGasLimit { + response.SafeGasLimit = uint64(float64(gasLimit) * rocketpool.GasLimitMultiplier) + } else { + response.SafeGasLimit = gasLimit + } return response, err } // Send a transaction to an address -func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +// useSafeGasLimit will amplify the estimated gas limit to by 50% for safety (no effect if the gas limit in opts is already set). +func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address, chainID *big.Int, data []byte, useSafeGasLimit bool, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce @@ -60,6 +72,11 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address value = big.NewInt(0) } + // Set default data + if data == nil { + data = []byte{} + } + // Estimate gas limit gasLimit := opts.GasLimit if gasLimit == 0 { @@ -67,11 +84,16 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address From: opts.From, To: &toAddress, GasPrice: big.NewInt(0), // use 0 gwei for simulation + Data: data, Value: value, }) if err != nil { return common.Hash{}, err } + + if useSafeGasLimit { + gasLimit = uint64(float64(gasLimit) * rocketpool.GasLimitMultiplier) + } } // Initialize transaction @@ -83,7 +105,7 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address Gas: gasLimit, To: &toAddress, Value: value, - Data: []byte{}, + Data: data, AccessList: []types.AccessTuple{}, }) From b186868ae9233bce39d07633ab5be02d68ebae23 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 12 Jun 2023 21:35:17 -0400 Subject: [PATCH 624/878] SendTransaction now accepts a data payload --- utils/eth/transactions.go | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/utils/eth/transactions.go b/utils/eth/transactions.go index f74d80e7c..ad6fc53fb 100644 --- a/utils/eth/transactions.go +++ b/utils/eth/transactions.go @@ -12,7 +12,7 @@ import ( ) // Estimate the gas of SendTransaction -func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress common.Address, data []byte, useSafeGasLimit bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { // User-defined settings response := rocketpool.GasInfo{} @@ -23,24 +23,36 @@ func EstimateSendTransactionGas(client rocketpool.ExecutionClient, toAddress com value = big.NewInt(0) } + // Set default data + if data == nil { + data = []byte{} + } + // Estimate gas limit gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ From: opts.From, To: &toAddress, GasPrice: big.NewInt(0), // set to 0 for simulation + Data: data, Value: value, }) if err != nil { return rocketpool.GasInfo{}, err } response.EstGasLimit = gasLimit - response.SafeGasLimit = gasLimit + + if useSafeGasLimit { + response.SafeGasLimit = uint64(float64(gasLimit) * rocketpool.GasLimitMultiplier) + } else { + response.SafeGasLimit = gasLimit + } return response, err } // Send a transaction to an address -func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address, chainID *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +// useSafeGasLimit will amplify the estimated gas limit to by 50% for safety (no effect if the gas limit in opts is already set). +func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address, chainID *big.Int, data []byte, useSafeGasLimit bool, opts *bind.TransactOpts) (common.Hash, error) { var err error // Get from address nonce @@ -60,6 +72,11 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address value = big.NewInt(0) } + // Set default data + if data == nil { + data = []byte{} + } + // Estimate gas limit gasLimit := opts.GasLimit if gasLimit == 0 { @@ -67,11 +84,16 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address From: opts.From, To: &toAddress, GasPrice: big.NewInt(0), // use 0 gwei for simulation + Data: data, Value: value, }) if err != nil { return common.Hash{}, err } + + if useSafeGasLimit { + gasLimit = uint64(float64(gasLimit) * rocketpool.GasLimitMultiplier) + } } // Initialize transaction @@ -83,7 +105,7 @@ func SendTransaction(client rocketpool.ExecutionClient, toAddress common.Address Gas: gasLimit, To: &toAddress, Value: value, - Data: []byte{}, + Data: data, AccessList: []types.AccessTuple{}, }) From c07b42ad49cb87b60068b7921dc4aff5b3614c4b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Jun 2023 00:21:50 -0400 Subject: [PATCH 625/878] Added GetTrustedNodeSubmitted --- rewards/rewards.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index aca65a161..bd77cadb9 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -151,6 +151,21 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. return *rewards, nil } +// Check whether or not the given address has submitted for the given rewards interval +func GetTrustedNodeSubmitted(rp *rocketpool.RocketPool, nodeAddress common.Address, rewardsIndex uint64, opts *bind.CallOpts) (bool, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return false, err + } + + indexBig := big.NewInt(0).SetUint64(rewardsIndex) + hasSubmitted := new(bool) + if err := rocketRewardsPool.Call(opts, hasSubmitted, "getTrustedNodeSubmitted", nodeAddress, indexBig); err != nil { + return false, fmt.Errorf("Could not get trusted node submission status: %w", err) + } + return *hasSubmitted, nil +} + // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, nil) From f60ff031f12ab9d9d3d09b03d1fac34d885efc40 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 15 Jun 2023 03:28:38 -0400 Subject: [PATCH 626/878] Removed CalculateAverageFeeAndDistributorShares_Legacy --- utils/state/node.go | 49 +-------------------------------------------- 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/utils/state/node.go b/utils/state/node.go index 3ad8da43a..ccd9d1c3a 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -189,54 +189,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra } // Calculate the average node fee and user/node shares of the distributor's balance -func CalculateAverageFeeAndDistributorShares_Legacy(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { - - // Calculate the total of all fees for staking minipools that aren't finalized - totalFee := big.NewInt(0) - eligibleMinipools := int64(0) - for _, mpd := range minipoolDetails { - if mpd.Status == types.Staking && !mpd.Finalised { - totalFee.Add(totalFee, mpd.NodeFee) - eligibleMinipools++ - } - } - - // Get the average fee (0 if there aren't any minipools) - if eligibleMinipools > 0 { - node.AverageNodeFee.Div(totalFee, big.NewInt(eligibleMinipools)) - } - - // Get the user and node portions of the distributor balance - distributorBalance := big.NewInt(0).Set(node.DistributorBalance) - if distributorBalance.Cmp(big.NewInt(0)) > 0 { - halfBalance := big.NewInt(0) - halfBalance.Div(distributorBalance, two) - - if eligibleMinipools == 0 { - // Split it 50/50 if there are no minipools - node.DistributorBalanceNodeETH = big.NewInt(0).Set(halfBalance) - node.DistributorBalanceUserETH = big.NewInt(0).Sub(distributorBalance, halfBalance) - } else { - // Amount of ETH given to the NO as a commission - commissionEth := big.NewInt(0) - commissionEth.Mul(halfBalance, node.AverageNodeFee) - commissionEth.Div(commissionEth, big.NewInt(1e18)) - - node.DistributorBalanceNodeETH.Add(halfBalance, commissionEth) // Node gets half + commission - node.DistributorBalanceUserETH.Sub(distributorBalance, node.DistributorBalanceNodeETH) // User gets balance - node share - } - - } else { - // No distributor balance - node.DistributorBalanceNodeETH = big.NewInt(0) - node.DistributorBalanceUserETH = big.NewInt(0) - } - - return nil -} - -// Calculate the average node fee and user/node shares of the distributor's balance -func CalculateAverageFeeAndDistributorShares_New(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { +func CalculateAverageFeeAndDistributorShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { // Calculate the total of all fees for staking minipools that aren't finalized totalFee := big.NewInt(0) From 9573ff47a7b0abd90cdd0d661a6213d12256de03 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 26 Jun 2023 00:36:25 -0400 Subject: [PATCH 627/878] Added oDAO state snapshot functions --- utils/state/common.go | 11 +++ utils/state/contracts.go | 4 + utils/state/network.go | 10 --- utils/state/odao.go | 187 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 202 insertions(+), 10 deletions(-) create mode 100644 utils/state/odao.go diff --git a/utils/state/common.go b/utils/state/common.go index 2db135ba1..f25461cee 100644 --- a/utils/state/common.go +++ b/utils/state/common.go @@ -2,6 +2,7 @@ package state import ( "math/big" + "time" ) const ( @@ -11,3 +12,13 @@ const ( // Global constants var zero = big.NewInt(0) var two = big.NewInt(2) + +// Converts a time on the chain (as Unix time in seconds) to a time.Time struct +func convertToTime(value *big.Int) time.Time { + return time.Unix(value.Int64(), 0) +} + +// Converts a duration on the chain (as a number of seconds) to a time.Duration struct +func convertToDuration(value *big.Int) time.Duration { + return time.Duration(value.Uint64()) * time.Second +} diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 48fa0783a..7470d1634 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -24,6 +24,7 @@ type NetworkContracts struct { Version *version.Version // Redstone + RocketDAONodeTrusted *rocketpool.Contract RocketDAONodeTrustedSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsMinipool *rocketpool.Contract RocketDAOProtocolSettingsNetwork *rocketpool.Contract @@ -91,6 +92,9 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad // Create the contract wrappers for Redstone wrappers := []contractArtifacts{ { + name: "rocketDAONodeTrusted", + contract: &contracts.RocketDAONodeTrusted, + }, { name: "rocketDAONodeTrustedSettingsMinipool", contract: &contracts.RocketDAONodeTrustedSettingsMinipool, }, { diff --git a/utils/state/network.go b/utils/state/network.go index 22a5e4f30..868b7d3fb 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -234,13 +234,3 @@ func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkCont return totalEffectiveStake, nil } - -// Converts a time on the chain (as Unix time in seconds) to a time.Time struct -func convertToTime(value *big.Int) time.Time { - return time.Unix(value.Int64(), 0) -} - -// Converts a duration on the chain (as a number of seconds) to a time.Duration struct -func convertToDuration(value *big.Int) time.Duration { - return time.Duration(value.Uint64()) * time.Second -} diff --git a/utils/state/odao.go b/utils/state/odao.go new file mode 100644 index 000000000..2f6421914 --- /dev/null +++ b/utils/state/odao.go @@ -0,0 +1,187 @@ +package state + +import ( + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + oDaoAddressBatchSize int = 1000 + oDaoDetailsBatchSize int = 50 +) + +type OracleDaoMemberDetails struct { + Address common.Address `json:"address"` + Exists bool `json:"exists"` + ID string `json:"id"` + Url string `json:"url"` + JoinedTime time.Time `json:"joinedTime"` + LastProposalTime time.Time `json:"lastProposalTime"` + RPLBondAmount *big.Int `json:"rplBondAmount"` + ReplacementAddress common.Address `json:"replacementAddress"` + IsChallenged bool `json:"isChallenged"` + joinedTimeRaw *big.Int `json:"-"` + lastProposalTimeRaw *big.Int `json:"-"` +} + +// Gets the details for an Oracle DAO member using the efficient multicall contract +func GetOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, memberAddress common.Address) (OracleDaoMemberDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + + details := OracleDaoMemberDetails{} + details.Address = memberAddress + + addOracleDaoMemberDetailsCalls(rp, contracts, contracts.Multicaller, &details, opts) + + _, err := contracts.Multicaller.FlexibleCall(true, opts) + if err != nil { + return OracleDaoMemberDetails{}, fmt.Errorf("error executing multicall: %w", err) + } + + fixupOracleDaoMemberDetails(rp, &details, opts) + + return details, nil +} + +// Gets all Oracle DAO member details using the efficient multicall contract +func GetAllOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, memberAddress common.Address) ([]OracleDaoMemberDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + + // Get the list of all minipool addresses + addresses, err := getOdaoAddresses(rp, contracts, opts) + if err != nil { + return nil, fmt.Errorf("error getting Oracle DAO addresses: %w", err) + } + + // Get the minipool details + return getOracleDaoDetails(rp, contracts, addresses, opts) +} + +// Get all Oracle DAO addresses +func getOdaoAddresses(rp *rocketpool.RocketPool, contracts *NetworkContracts, opts *bind.CallOpts) ([]common.Address, error) { + // Get minipool count + memberCount, err := trustednode.GetMemberCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + addresses := make([]common.Address, memberCount) + + // Run the getters in batches + count := int(memberCount) + for i := 0; i < count; i += minipoolAddressBatchSize { + i := i + max := i + oDaoAddressBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(contracts.RocketDAONodeTrusted, &addresses[j], "getMemberAt", big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting Oracle DAO addresses: %w", err) + } + + return addresses, nil +} + +// Get the details of the Oracle DAO members +func getOracleDaoDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, addresses []common.Address, opts *bind.CallOpts) ([]OracleDaoMemberDetails, error) { + memberDetails := make([]OracleDaoMemberDetails, len(addresses)) + + // Get the details in batches + var wg errgroup.Group + wg.SetLimit(threadLimit) + count := len(addresses) + for i := 0; i < count; i += minipoolBatchSize { + i := i + max := i + minipoolBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + + address := addresses[j] + details := &memberDetails[j] + details.Address = address + + addOracleDaoMemberDetailsCalls(rp, contracts, mc, details, opts) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting Oracle DAO details: %w", err) + } + + // Postprocessing + for i := range memberDetails { + details := &memberDetails[i] + fixupOracleDaoMemberDetails(rp, details, opts) + } + + return memberDetails, nil +} + +// Add the Oracle DAO details getters to the multicaller +func addOracleDaoMemberDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Url, "getMemberUrl") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.joinedTimeRaw, "getMemberJoinedTime") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.lastProposalTimeRaw, "getMemberLastProposalTime") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.RPLBondAmount, "getMemberRPLBondAmount") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ReplacementAddress, "getMemberReplacedAddress") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.IsChallenged, "getMemberIsChallenged") + return nil +} + +// Fixes a member details struct with supplemental logic +func fixupOracleDaoMemberDetails(rp *rocketpool.RocketPool, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { + details.JoinedTime = convertToTime(details.joinedTimeRaw) + details.LastProposalTime = convertToTime(details.lastProposalTimeRaw) + return nil +} From 58beebf983a6147c5c04a7da3a864fd77a9f65fa Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 26 Jun 2023 00:41:12 -0400 Subject: [PATCH 628/878] Removed an unnecessary argument --- utils/state/odao.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/odao.go b/utils/state/odao.go index 2f6421914..7d7569710 100644 --- a/utils/state/odao.go +++ b/utils/state/odao.go @@ -54,7 +54,7 @@ func GetOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkCont } // Gets all Oracle DAO member details using the efficient multicall contract -func GetAllOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, memberAddress common.Address) ([]OracleDaoMemberDetails, error) { +func GetAllOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]OracleDaoMemberDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } From da0762dfe203bb3891b325b7d69278b3b45ab063 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 26 Jun 2023 01:59:35 -0400 Subject: [PATCH 629/878] Added a missing parameter --- utils/state/odao.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utils/state/odao.go b/utils/state/odao.go index 7d7569710..1caf3594c 100644 --- a/utils/state/odao.go +++ b/utils/state/odao.go @@ -168,14 +168,14 @@ func getOracleDaoDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, // Add the Oracle DAO details getters to the multicaller func addOracleDaoMemberDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { - mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.Url, "getMemberUrl") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.joinedTimeRaw, "getMemberJoinedTime") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.lastProposalTimeRaw, "getMemberLastProposalTime") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.RPLBondAmount, "getMemberRPLBondAmount") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.ReplacementAddress, "getMemberReplacedAddress") - mc.AddCall(contracts.RocketDAONodeTrusted, &details.IsChallenged, "getMemberIsChallenged") + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Url, "getMemberUrl", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.joinedTimeRaw, "getMemberJoinedTime", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.lastProposalTimeRaw, "getMemberLastProposalTime", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.RPLBondAmount, "getMemberRPLBondAmount", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ReplacementAddress, "getMemberReplacedAddress", details.Address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.IsChallenged, "getMemberIsChallenged", details.Address) return nil } From 32f7a68f93adf1637bed59de20bb5e3dae61d32d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 13 Jul 2023 04:00:49 -0400 Subject: [PATCH 630/878] Added GetTrustedNodeSubmittedSpecificRewards() --- rewards/rewards.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ utils/state/odao.go | 17 +++++++++-------- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 5d6139478..49a1d0cc8 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -7,13 +7,19 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) +const ( + rewardsSnapshotSubmittedNodeKey string = "rewards.snapshot.submitted.node.key" +) + // Info for a rewards snapshot event type RewardsEvent struct { Index *big.Int @@ -166,6 +172,45 @@ func GetTrustedNodeSubmitted(rp *rocketpool.RocketPool, nodeAddress common.Addre return *hasSubmitted, nil } +// Check whether or not the given address has submitted specific rewards info +func GetTrustedNodeSubmittedSpecificRewards(rp *rocketpool.RocketPool, nodeAddress common.Address, submission RewardSubmission, opts *bind.CallOpts) (bool, error) { + // NOTE: this doesn't have a view yet so we have to construct it manually, and RLP + stringTy, _ := abi.NewType("string", "string", nil) + addressTy, _ := abi.NewType("address", "address", nil) + + submissionTy, _ := abi.NewType("tuple", "struct RewardSubmission", []abi.ArgumentMarshaling{ + {Name: "rewardIndex", Type: "uint256"}, + {Name: "executionBlock", Type: "uint256"}, + {Name: "consensusBlock", Type: "uint256"}, + {Name: "merkleRoot", Type: "bytes32"}, + {Name: "merkleTreeCID", Type: "string"}, + {Name: "intervalsPassed", Type: "uint256"}, + {Name: "treasuryRPL", Type: "uint256"}, + {Name: "trustedNodeRPL", Type: "uint256[]"}, + {Name: "nodeRPL", Type: "uint256[]"}, + {Name: "nodeETH", Type: "uint256[]"}, + {Name: "userETH", Type: "uint256"}, + }) + + args := abi.Arguments{ + {Type: stringTy, Name: "key"}, + {Type: addressTy, Name: "trustedNodeAddress"}, + {Type: submissionTy, Name: "submission"}, + } + + bytes, err := args.Pack(rewardsSnapshotSubmittedNodeKey, nodeAddress, &submission) + if err != nil { + return false, fmt.Errorf("error encoding submission data into ABI format: %w", err) + } + + key := crypto.Keccak256Hash(bytes) + result, err := rp.RocketStorage.GetBool(opts, key) + if err != nil { + return false, fmt.Errorf("error checking if trusted node submitted specific rewards: %w", err) + } + return result, nil +} + // Estimate the gas for submiting a Merkle Tree-based snapshot for a rewards interval func EstimateSubmitRewardSnapshotGas(rp *rocketpool.RocketPool, submission RewardSubmission, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, nil) diff --git a/utils/state/odao.go b/utils/state/odao.go index 1caf3594c..7e82dd3cd 100644 --- a/utils/state/odao.go +++ b/utils/state/odao.go @@ -168,14 +168,15 @@ func getOracleDaoDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, // Add the Oracle DAO details getters to the multicaller func addOracleDaoMemberDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { - mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.Url, "getMemberUrl", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.joinedTimeRaw, "getMemberJoinedTime", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.lastProposalTimeRaw, "getMemberLastProposalTime", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.RPLBondAmount, "getMemberRPLBondAmount", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.ReplacementAddress, "getMemberReplacedAddress", details.Address) - mc.AddCall(contracts.RocketDAONodeTrusted, &details.IsChallenged, "getMemberIsChallenged", details.Address) + address := details.Address + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.Url, "getMemberUrl", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.joinedTimeRaw, "getMemberJoinedTime", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.lastProposalTimeRaw, "getMemberLastProposalTime", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.RPLBondAmount, "getMemberRPLBondAmount", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.ReplacementAddress, "getMemberReplacedAddress", address) + mc.AddCall(contracts.RocketDAONodeTrusted, &details.IsChallenged, "getMemberIsChallenged", address) return nil } From 2f21751e9ae7ac52abd1725ff70f54a89c733899 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 24 Jul 2023 22:42:56 -0400 Subject: [PATCH 631/878] Added a simple ERC20 binding --- utils/eth/erc20.go | 204 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 utils/eth/erc20.go diff --git a/utils/eth/erc20.go b/utils/eth/erc20.go new file mode 100644 index 000000000..accc60a7e --- /dev/null +++ b/utils/eth/erc20.go @@ -0,0 +1,204 @@ +package eth + +import ( + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +const ( + Erc20AbiString string = `[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + ]` +) + +// Global container for the parsed ABI above +var erc20Abi *abi.ABI + +type Erc20Contract struct { + Name string + Symbol string + Decimals uint64 + contract *rocketpool.Contract +} + +// Creates a contract wrapper for the ERC20 at the given address +func NewErc20Contract(address common.Address, client rocketpool.ExecutionClient, opts *bind.CallOpts) (*Erc20Contract, error) { + // Parse the ABI + if erc20Abi == nil { + abiParsed, err := abi.JSON(strings.NewReader(Erc20AbiString)) + if err != nil { + return nil, fmt.Errorf("error parsing ERC20 ABI: %w", err) + } + erc20Abi = &abiParsed + } + + // Create contract + contract := &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *erc20Abi, client, client, client), + Address: &address, + ABI: erc20Abi, + Client: client, + } + + // Create the wrapper + wrapper := &Erc20Contract{ + contract: contract, + } + + // Get the details + name, err := wrapper.GetName(opts) + if err != nil { + return nil, err + } + wrapper.Name = name + symbol, err := wrapper.GetSymbol(opts) + if err != nil { + return nil, err + } + wrapper.Symbol = symbol + decimals, err := wrapper.GetDecimals(opts) + if err != nil { + return nil, err + } + wrapper.Decimals = decimals + + return wrapper, nil +} + +// Get the token name +func (c *Erc20Contract) GetName(opts *bind.CallOpts) (string, error) { + name := new(string) + err := c.contract.Call(opts, name, "name") + if err != nil { + return "", fmt.Errorf("could not get ERC20 name: %w", err) + } + return *name, nil +} + +// Get the token symbol +func (c *Erc20Contract) GetSymbol(opts *bind.CallOpts) (string, error) { + symbol := new(string) + err := c.contract.Call(opts, symbol, "symbol") + if err != nil { + return "", fmt.Errorf("could not get ERC20 symbol: %w", err) + } + return *symbol, nil +} + +// Get the token decimals +func (c *Erc20Contract) GetDecimals(opts *bind.CallOpts) (uint64, error) { + decimals := new(*big.Int) + err := c.contract.Call(opts, decimals, "decimals") + if err != nil { + return 0, fmt.Errorf("could not get ERC20 decimals: %w", err) + } + return (*decimals).Uint64(), nil +} + +// Get the token balance for an address +func (c *Erc20Contract) BalanceOf(address common.Address, opts *bind.CallOpts) (*big.Int, error) { + balance := new(*big.Int) + err := c.contract.Call(opts, balance, "balanceOf", address) + if err != nil { + return nil, fmt.Errorf("could not get ERC20 balance for address %s: %w", address.Hex(), err) + } + return *balance, nil +} + +// Transfer an ERC20 from one address to another +func (c *Erc20Contract) TransferFrom(from common.Address, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { + tx, err := c.contract.Transact(opts, "transferFrom", from, to, amount) + if err != nil { + return nil, fmt.Errorf("could not transfer ERC20 from %s to %s: %w", from.Hex(), to.Hex(), err) + } + return tx, nil +} From bd6e1b93f860ff6983d6b8362517de1f3a3674bd Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 24 Jul 2023 22:59:25 -0400 Subject: [PATCH 632/878] Added a gas estimator for TransferFrom --- utils/eth/erc20.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/eth/erc20.go b/utils/eth/erc20.go index accc60a7e..9492b7658 100644 --- a/utils/eth/erc20.go +++ b/utils/eth/erc20.go @@ -194,6 +194,11 @@ func (c *Erc20Contract) BalanceOf(address common.Address, opts *bind.CallOpts) ( return *balance, nil } +// Estimate the gas for transferring an ERC20 from one address to another +func (c *Erc20Contract) EstimateTransferFromGas(from common.Address, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return c.contract.GetTransactionGasInfo(opts, "transferFrom", from, to, amount) +} + // Transfer an ERC20 from one address to another func (c *Erc20Contract) TransferFrom(from common.Address, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { tx, err := c.contract.Transact(opts, "transferFrom", from, to, amount) From c5292f76183438b20fd1447fc7e2cd6a766230d3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 24 Jul 2023 23:11:53 -0400 Subject: [PATCH 633/878] Switched to transfer() --- utils/eth/erc20.go | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/utils/eth/erc20.go b/utils/eth/erc20.go index 9492b7658..8302d2984 100644 --- a/utils/eth/erc20.go +++ b/utils/eth/erc20.go @@ -74,10 +74,6 @@ const ( { "constant": false, "inputs": [ - { - "name": "_from", - "type": "address" - }, { "name": "_to", "type": "address" @@ -87,7 +83,7 @@ const ( "type": "uint256" } ], - "name": "transferFrom", + "name": "transfer", "outputs": [ { "name": "success", @@ -96,7 +92,7 @@ const ( ], "payable": false, "type": "function" - }, + }, ]` ) @@ -194,16 +190,16 @@ func (c *Erc20Contract) BalanceOf(address common.Address, opts *bind.CallOpts) ( return *balance, nil } -// Estimate the gas for transferring an ERC20 from one address to another -func (c *Erc20Contract) EstimateTransferFromGas(from common.Address, to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return c.contract.GetTransactionGasInfo(opts, "transferFrom", from, to, amount) +// Estimate the gas for transferring an ERC20 to another address +func (c *Erc20Contract) EstimateTransferGas(to common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return c.contract.GetTransactionGasInfo(opts, "transfer", to, amount) } -// Transfer an ERC20 from one address to another -func (c *Erc20Contract) TransferFrom(from common.Address, to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { - tx, err := c.contract.Transact(opts, "transferFrom", from, to, amount) +// Transfer an ERC20 to another address +func (c *Erc20Contract) Transfer(to common.Address, amount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { + tx, err := c.contract.Transact(opts, "transfer", to, amount) if err != nil { - return nil, fmt.Errorf("could not transfer ERC20 from %s to %s: %w", from.Hex(), to.Hex(), err) + return nil, fmt.Errorf("could not transfer ERC20 to %s: %w", to.Hex(), err) } return tx, nil } From ffe1c71a552162d133f2b8f16b74b99854c50153 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 25 Jul 2023 00:56:32 -0400 Subject: [PATCH 634/878] Fixed the ERC20 ABI --- utils/eth/erc20.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/eth/erc20.go b/utils/eth/erc20.go index 8302d2984..24d9d6045 100644 --- a/utils/eth/erc20.go +++ b/utils/eth/erc20.go @@ -92,7 +92,7 @@ const ( ], "payable": false, "type": "function" - }, + } ]` ) From 95760eb06524b2cad4b47c198a60c17848aa56be Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 25 Jul 2023 01:02:35 -0400 Subject: [PATCH 635/878] Changed decimals to a uint8 --- utils/eth/erc20.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/eth/erc20.go b/utils/eth/erc20.go index 24d9d6045..fb85ac69c 100644 --- a/utils/eth/erc20.go +++ b/utils/eth/erc20.go @@ -102,7 +102,7 @@ var erc20Abi *abi.ABI type Erc20Contract struct { Name string Symbol string - Decimals uint64 + Decimals uint8 contract *rocketpool.Contract } @@ -171,13 +171,13 @@ func (c *Erc20Contract) GetSymbol(opts *bind.CallOpts) (string, error) { } // Get the token decimals -func (c *Erc20Contract) GetDecimals(opts *bind.CallOpts) (uint64, error) { - decimals := new(*big.Int) +func (c *Erc20Contract) GetDecimals(opts *bind.CallOpts) (uint8, error) { + decimals := new(uint8) err := c.contract.Call(opts, decimals, "decimals") if err != nil { return 0, fmt.Errorf("could not get ERC20 decimals: %w", err) } - return (*decimals).Uint64(), nil + return *decimals, nil } // Get the token balance for an address From 0a4cba4c052d860354c79d0f7dc86e7c67984803 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 18 Sep 2023 22:30:48 -0400 Subject: [PATCH 636/878] Added RocketNetworkVoting --- dao/protocol/vote-power-tree.go | 10 +++ network/voting.go | 129 ++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 dao/protocol/vote-power-tree.go create mode 100644 network/voting.go diff --git a/dao/protocol/vote-power-tree.go b/dao/protocol/vote-power-tree.go new file mode 100644 index 000000000..078082a71 --- /dev/null +++ b/dao/protocol/vote-power-tree.go @@ -0,0 +1,10 @@ +package protocol + +import "math/big" + +type VotingTreeGenerator struct { +} + +func (g *VotingTreeGenerator) createValidProposal(blockNumber *big.Int) { + // Get the latest block numberS +} diff --git a/network/voting.go b/network/voting.go new file mode 100644 index 000000000..9bf9dde21 --- /dev/null +++ b/network/voting.go @@ -0,0 +1,129 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Check whether or not on-chain voting has been initialized for the given node +func GetVotingInitialized(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (bool, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketNetworkVoting.Call(opts, value, "getVotingInitialised", address); err != nil { + return false, fmt.Errorf("error getting voting initialized status: %w", err) + } + return *value, nil +} + +// Estimate the gas of InitializeVoting +func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVoting") +} + +// Initialize on-chain voting for the node +func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkVoting.Transact(opts, "initialiseVoting") + if err != nil { + return common.Hash{}, fmt.Errorf("error initializing voting: %w", err) + } + return tx.Hash(), nil +} + +// Get the number of nodes with voting power registered in the provided block +func GetNodeCount(rp *rocketpool.RocketPool, blockNumber uint32, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketNetworkVoting.Call(opts, value, "getNodeCount", blockNumber); err != nil { + return nil, fmt.Errorf("error getting node count for block %d: %w", blockNumber, err) + } + return *value, nil +} + +// Get the voting power of the given node on the provided block +func GetVotingPower(rp *rocketpool.RocketPool, address common.Address, blockNumber uint32, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketNetworkVoting.Call(opts, value, "getVotingPower", address, blockNumber); err != nil { + return nil, fmt.Errorf("error getting voting power for node %s on block %d: %w", address.Hex(), blockNumber, err) + } + return *value, nil +} + +// Get the address that the provided node has delegated voting power to on the given block +func GetDelegate(rp *rocketpool.RocketPool, address common.Address, blockNumber uint32, opts *bind.CallOpts) (common.Address, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketNetworkVoting.Call(opts, value, "getDelegate", address, blockNumber); err != nil { + return common.Address{}, fmt.Errorf("error getting delegate for node %s on block %d: %w", address.Hex(), blockNumber, err) + } + return *value, nil +} + +// Get the address that the provided node has currently delegated voting power to +func GetCurrentDelegate(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketNetworkVoting.Call(opts, value, "getCurrentDelegate", address); err != nil { + return common.Address{}, fmt.Errorf("error getting current delegate for node %s: %w", address.Hex(), err) + } + return *value, nil +} + +// Estimate the gas of SetDelegate +func EstimateSetDelegateGas(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkVoting.GetTransactionGasInfo(opts, "setDelegate", newDelegate) +} + +// Set the voting delegate for the node +func SetDelegate(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkVoting.Transact(opts, "setDelegate", newDelegate) + if err != nil { + return common.Hash{}, fmt.Errorf("error setting voting delegate: %w", err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketNetworkVotingLock sync.Mutex + +func getRocketNetworkVoting(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNetworkVotingLock.Lock() + defer rocketNetworkVotingLock.Unlock() + return rp.GetContract("rocketNetworkVoting", opts) +} From a93133bfa283edc2dc32b9e01812ada46ece7cd8 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Sep 2023 01:29:57 -0400 Subject: [PATCH 637/878] Finished Pollard generation --- dao/protocol/vote-power-tree.go | 275 +++++++++++++++++++++++++++++++- network/voting.go | 14 +- 2 files changed, 279 insertions(+), 10 deletions(-) diff --git a/dao/protocol/vote-power-tree.go b/dao/protocol/vote-power-tree.go index 078082a71..0cebd26f1 100644 --- a/dao/protocol/vote-power-tree.go +++ b/dao/protocol/vote-power-tree.go @@ -1,10 +1,279 @@ package protocol -import "math/big" +import ( + "fmt" + "math" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "golang.org/x/sync/errgroup" +) + +const ( + NodeVotingDetailsBatchSize uint64 = 20 + DepthPerRound uint64 = 5 +) + +type NodeVotingInfo struct { + NodeAddress common.Address + VotingPower *big.Int + Delegate common.Address +} + +type VotingTreeNode struct { + Hash common.Hash + Sum *big.Int +} type VotingTreeGenerator struct { + rp *rocketpool.RocketPool +} + +func NewVotingTreeGenerator(rp *rocketpool.RocketPool) (*VotingTreeGenerator, error) { + g := &VotingTreeGenerator{ + rp: rp, + } + return g, nil +} + +// Gets a complete Pollard row for a new proposal based on the target block number. +func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, opts *bind.CallOpts) ([]VotingTreeNode, error) { + // Get an nxn array of each node's voting power and delegating status + votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) + if err != nil { + return nil, fmt.Errorf("error getting voting power details: %w", err) + } + + // Get the leaf nodes of the tree + leaves := g.constructLeaves(votingPowers) + + // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal + _, nodes := g.generatePollard(leaves, 1) + return nodes, nil +} + +// Gets a complete proof and corresponding Pollard row to challenge an existing proposal. +func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, opts *bind.CallOpts) ([]VotingTreeNode, []VotingTreeNode, error) { + // Get an nxn array of each node's voting power and delegating status + votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) + if err != nil { + return nil, nil, fmt.Errorf("error getting voting power details: %w", err) + } + + // Get the leaf nodes of the tree + leaves := g.constructLeaves(votingPowers) + + // Create the proof and Pollard row from the leaf nodes + proof, nodes := g.generatePollard(leaves, targetIndex) + return proof, nodes, nil +} + +func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts *bind.CallOpts) ([][]*big.Int, error) { + // Get the number of voting nodes + nodeCountBig, err := network.GetVotingNodeCount(g.rp, blockNumber, opts) + if err != nil { + return nil, fmt.Errorf("error getting voting node count: %w", err) + } + nodeCount := nodeCountBig.Uint64() + + // Get the node addresses + nodeAddresses, err := node.GetNodeAddresses(g.rp, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + + // Load node voting details in batches + votingInfos := make([]NodeVotingInfo, nodeCount) + delegateIndices := map[common.Address]uint64{} + for bsi := uint64(0); bsi < nodeCount; bsi += NodeVotingDetailsBatchSize { + + // Get batch start & end index + nsi := bsi + nei := bsi + NodeVotingDetailsBatchSize + if nei > nodeCount { + nei = nodeCount + } + + // Load details + var wg errgroup.Group + for ni := nsi; ni < nei; ni++ { + ni := ni + wg.Go(func() error { + nodeAddress := nodeAddresses[ni] + votingPower, err := network.GetVotingPower(g.rp, nodeAddress, blockNumber, opts) + if err != nil { + return err + } + delegate, err := network.GetVotingDelegate(g.rp, nodeAddress, blockNumber, opts) + if err != nil { + return err + } + votingInfos[ni] = NodeVotingInfo{ + NodeAddress: nodeAddress, + VotingPower: votingPower, + Delegate: delegate, + } + delegateIndices[nodeAddress] = ni + return nil + }) + } + if err := wg.Wait(); err != nil { + return nil, err + } + + } + + // For each node, create an array of nodes that have delegated to it + votingPowers := make([][]*big.Int, nodeCount) + for i := uint64(0); i < nodeCount; i++ { + nodeAddress := nodeAddresses[i] + + votingPower := make([]*big.Int, nodeCount) + for j := uint64(0); j < nodeCount; j++ { + votingInfo := votingInfos[j] + if votingInfo.Delegate == nodeAddress { + votingPower[j] = votingInfo.VotingPower + } else { + votingPower[j] = big.NewInt(0) + } + } + votingPowers[i] = votingPower + } + + // Return + return votingPowers, nil +} + +// Create the complete set of subtree leaf nodes +func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []VotingTreeNode { + nodeCount := uint64(len(votingPowers)) + if nodeCount == 0 { + return []VotingTreeNode{} + } + + // Create the slice of leaf nodes for the subtree + subTreeDepth := uint64(math.Ceil(math.Log2(float64(nodeCount)))) // First power of 2 greater than nodeCount + subTreeLeafCountPerMainTreeNode := uint64(math.Pow(2, float64(subTreeDepth))) // Number of leaf nodes in the sub-tree that correspond to a single leaf of the main tree + totalSubTreeLeafNodes := subTreeLeafCountPerMainTreeNode * subTreeLeafCountPerMainTreeNode + + // Create the leaf nodes + leafNodes := make([]VotingTreeNode, totalSubTreeLeafNodes) + for i := uint64(0); i < subTreeLeafCountPerMainTreeNode; i++ { + for j := uint64(0); j < subTreeLeafCountPerMainTreeNode; j++ { + index := i*subTreeLeafCountPerMainTreeNode + j + var balance *big.Int + + // Get the balance if i and j are both in-bounds + if i < nodeCount && j < nodeCount { + balance = votingPowers[i][j] + } else { + balance = big.NewInt(0) + } + + leafNode := VotingTreeNode{ + Sum: balance, + Hash: getHashForBalance(balance), + } + leafNodes[index] = leafNode + } + } + return leafNodes +} + +// Generates a complete Pollard, either for a new proposal or for a challenge. +// For new proposals use index = 1. +// For challenges, the index is the index of the node being challenged. +// Returns the aggregated proof, and the list of nodes in the pollard row. +func (g *VotingTreeGenerator) generatePollard(originalLeafNodes []VotingTreeNode, index uint64) ([]VotingTreeNode, []VotingTreeNode) { + // Create a copy of leafNodes, since it will be modified during execution + leafNodes := make([]VotingTreeNode, len(originalLeafNodes)) + copy(leafNodes, originalLeafNodes) + + order := DepthPerRound + offset := uint64(math.Floor(math.Log2(float64(index)))) // Depth of the node being challenged, if not building a proposal + depth := uint64(math.Log2(float64(len(leafNodes)))) // Total depth of the tree + + // If the target is out of bounds, bring the order up enough levels to make the target a leaf node + if order+offset > depth { + order = depth - offset + } + + // Get the pollard parameters + pollardSize := uint64(math.Pow(2, float64(order))) + pollardDepth := offset + order + pollardOffset := index*uint64(math.Pow(2, float64(order))) - uint64(math.Pow(2, float64(order+offset))) + + // Get the list of nodes corresponding to the pollard row + var nodes []VotingTreeNode + if depth == pollardDepth { + // The pollard row is the last one so just grab the final row from the leaf nodes + nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] + } + // The pollard row is above the last one, so crawl up the tree calculating the values of each node until getting to it + for level := depth; level > offset; level-- { + n := uint64(math.Pow(2, float64(level))) + + for i := uint64(0); i < n/2; i++ { + a := i * 2 // Index of the first node + b := a + 1 // Index of the second node, directly to the right of it + node := getParentNodeFromChildren(leafNodes[a], leafNodes[b]) + leafNodes[i] = node + } + + // Slice out the nodes for the pollard once we've reached the right level + if level-1 == offset+order { + nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] + } + } + + // Build a proof from the offset up to the root node + proof := []VotingTreeNode{} + for level := offset; level > 0; level-- { + indexOffset := uint64(math.Pow(2, float64(level))) + + for i := uint64(0); i < indexOffset/2; i++ { + a := i * 2 // Index of the first node + b := a + 1 // Index of the second node, directly to the right of it + + if indexOffset+a == index { + proof = append(proof, leafNodes[b]) + } else if indexOffset+b == index { + proof = append(proof, leafNodes[a]) + } + + leafNodes[i] = getParentNodeFromChildren(leafNodes[a], leafNodes[b]) + } + + index = uint64(math.Floor(float64(index / 2))) + } + + return proof, nodes +} + +// Get the keccak hash of a parent node with two children +func getParentNodeFromChildren(leftChild VotingTreeNode, rightChild VotingTreeNode) VotingTreeNode { + leftBuffer := [32]byte{} + rightBuffer := [32]byte{} + leftChild.Sum.FillBytes(leftBuffer[:]) + rightChild.Sum.FillBytes(rightBuffer[:]) + hash := crypto.Keccak256Hash(leftChild.Hash[:], leftBuffer[:], rightChild.Hash[:], rightBuffer[:]) + + sum := big.NewInt(0).Add(leftChild.Sum, rightChild.Sum) + return VotingTreeNode{ + Hash: hash, + Sum: sum, + } } -func (g *VotingTreeGenerator) createValidProposal(blockNumber *big.Int) { - // Get the latest block numberS +// Get the keccak hash of a balance as a uint256 +func getHashForBalance(balance *big.Int) common.Hash { + buffer := [32]byte{} + balance.FillBytes(buffer[:]) + hash := crypto.Keccak256Hash(buffer[:]) + return hash } diff --git a/network/voting.go b/network/voting.go index 9bf9dde21..033db6916 100644 --- a/network/voting.go +++ b/network/voting.go @@ -45,8 +45,8 @@ func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo return tx.Hash(), nil } -// Get the number of nodes with voting power registered in the provided block -func GetNodeCount(rp *rocketpool.RocketPool, blockNumber uint32, opts *bind.CallOpts) (*big.Int, error) { +// Get the number of nodes that were present in the network at the provided block +func GetVotingNodeCount(rp *rocketpool.RocketPool, blockNumber uint32, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return nil, err @@ -72,7 +72,7 @@ func GetVotingPower(rp *rocketpool.RocketPool, address common.Address, blockNumb } // Get the address that the provided node has delegated voting power to on the given block -func GetDelegate(rp *rocketpool.RocketPool, address common.Address, blockNumber uint32, opts *bind.CallOpts) (common.Address, error) { +func GetVotingDelegate(rp *rocketpool.RocketPool, address common.Address, blockNumber uint32, opts *bind.CallOpts) (common.Address, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Address{}, err @@ -85,7 +85,7 @@ func GetDelegate(rp *rocketpool.RocketPool, address common.Address, blockNumber } // Get the address that the provided node has currently delegated voting power to -func GetCurrentDelegate(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (common.Address, error) { +func GetCurrentVotingDelegate(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (common.Address, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Address{}, err @@ -97,8 +97,8 @@ func GetCurrentDelegate(rp *rocketpool.RocketPool, address common.Address, opts return *value, nil } -// Estimate the gas of SetDelegate -func EstimateSetDelegateGas(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +// Estimate the gas of SetVotingDelegate +func EstimateSetVotingDelegateGas(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -107,7 +107,7 @@ func EstimateSetDelegateGas(rp *rocketpool.RocketPool, newDelegate common.Addres } // Set the voting delegate for the node -func SetDelegate(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func SetVotingDelegate(rp *rocketpool.RocketPool, newDelegate common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Hash{}, err From dc743ef1c955dd16bca2fbd7833c0a1b085715bb Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Sep 2023 04:47:36 -0400 Subject: [PATCH 638/878] Some voting tree fixes --- dao/protocol/voting/propose.go | 24 +++++++++++++++++ .../voting-tree-generator.go} | 26 +++++++++---------- 2 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 dao/protocol/voting/propose.go rename dao/protocol/{vote-power-tree.go => voting/voting-tree-generator.go} (92%) diff --git a/dao/protocol/voting/propose.go b/dao/protocol/voting/propose.go new file mode 100644 index 000000000..5f07d64a0 --- /dev/null +++ b/dao/protocol/voting/propose.go @@ -0,0 +1,24 @@ +package voting + +import ( + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +/* +func Propose(rp *rocketpool.RocketPool, message string, blockNumber uint32, treeNodes []VotingTreeNode) (common.Hash, error) { + getRocketDAOProtocolProposals +} + +func ProposeSettingUint() +*/ +// Get contracts +var rocketDAOProtocolProposalsInterface sync.Mutex + +func getRocketDAOProtocolProposalsInterface(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProtocolProposalsInterface.Lock() + defer rocketDAOProtocolProposalsInterface.Unlock() + return rp.GetContract("rocketDAOProtocolProposalsInterface", opts) +} diff --git a/dao/protocol/vote-power-tree.go b/dao/protocol/voting/voting-tree-generator.go similarity index 92% rename from dao/protocol/vote-power-tree.go rename to dao/protocol/voting/voting-tree-generator.go index 0cebd26f1..44e4fa097 100644 --- a/dao/protocol/vote-power-tree.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -1,4 +1,4 @@ -package protocol +package voting import ( "fmt" @@ -26,8 +26,8 @@ type NodeVotingInfo struct { } type VotingTreeNode struct { - Hash common.Hash - Sum *big.Int + Sum *big.Int `abi:"sum" json:"sum"` + Hash common.Hash `abi:"hash" json:"hash"` } type VotingTreeGenerator struct { @@ -89,7 +89,7 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts * // Load node voting details in batches votingInfos := make([]NodeVotingInfo, nodeCount) - delegateIndices := map[common.Address]uint64{} + //delegateIndices := map[common.Address]uint64{} for bsi := uint64(0); bsi < nodeCount; bsi += NodeVotingDetailsBatchSize { // Get batch start & end index @@ -118,7 +118,7 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts * VotingPower: votingPower, Delegate: delegate, } - delegateIndices[nodeAddress] = ni + //delegateIndices[nodeAddress] = ni return nil }) } @@ -189,11 +189,7 @@ func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []Votin // For new proposals use index = 1. // For challenges, the index is the index of the node being challenged. // Returns the aggregated proof, and the list of nodes in the pollard row. -func (g *VotingTreeGenerator) generatePollard(originalLeafNodes []VotingTreeNode, index uint64) ([]VotingTreeNode, []VotingTreeNode) { - // Create a copy of leafNodes, since it will be modified during execution - leafNodes := make([]VotingTreeNode, len(originalLeafNodes)) - copy(leafNodes, originalLeafNodes) - +func (g *VotingTreeGenerator) generatePollard(leafNodes []VotingTreeNode, index uint64) ([]VotingTreeNode, []VotingTreeNode) { order := DepthPerRound offset := uint64(math.Floor(math.Log2(float64(index)))) // Depth of the node being challenged, if not building a proposal depth := uint64(math.Log2(float64(len(leafNodes)))) // Total depth of the tree @@ -212,7 +208,9 @@ func (g *VotingTreeGenerator) generatePollard(originalLeafNodes []VotingTreeNode var nodes []VotingTreeNode if depth == pollardDepth { // The pollard row is the last one so just grab the final row from the leaf nodes - nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] + nodes = make([]VotingTreeNode, pollardSize) + copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) + //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] } // The pollard row is above the last one, so crawl up the tree calculating the values of each node until getting to it for level := depth; level > offset; level-- { @@ -227,7 +225,9 @@ func (g *VotingTreeGenerator) generatePollard(originalLeafNodes []VotingTreeNode // Slice out the nodes for the pollard once we've reached the right level if level-1 == offset+order { - nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] + nodes = make([]VotingTreeNode, pollardSize) + copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) + //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] } } @@ -249,7 +249,7 @@ func (g *VotingTreeGenerator) generatePollard(originalLeafNodes []VotingTreeNode leafNodes[i] = getParentNodeFromChildren(leafNodes[a], leafNodes[b]) } - index = uint64(math.Floor(float64(index / 2))) + index = index / 2 } return proof, nodes From 003f3d4303d12b4b469bb643262d377017cda77e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 19 Sep 2023 22:52:23 -0400 Subject: [PATCH 639/878] Finished rocketDAOProtocolProposals --- dao/protocol/voting/propose.go | 326 ++++++++++++++++++++++++++++++++- types/dao.go | 9 + 2 files changed, 325 insertions(+), 10 deletions(-) diff --git a/dao/protocol/voting/propose.go b/dao/protocol/voting/propose.go index 5f07d64a0..ff5a7f7b5 100644 --- a/dao/protocol/voting/propose.go +++ b/dao/protocol/voting/propose.go @@ -1,24 +1,330 @@ package voting import ( + "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" ) -/* -func Propose(rp *rocketpool.RocketPool, message string, blockNumber uint32, treeNodes []VotingTreeNode) (common.Hash, error) { - getRocketDAOProtocolProposals +// Estimate the gas of a proposal submission +func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "propose", message, payload) +} + +// Submit a trusted node DAO proposal +// Returns the ID of the new proposal +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + proposalCount, err := dao.GetProposalCount(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + tx, err := rocketDAOProtocolProposals.Transact(opts, "propose", message, payload) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error submitting Protocol DAO proposal: %w", err) + } + return proposalCount + 1, tx.Hash(), nil +} + +// Estimate the gas of ProposeSetMulti +func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + encodedValues, err := abiEncodeMultiValues(settingTypes, values) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error ABI encoding values: %w", err) + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingMulti", contractNames, settingPaths, settingTypes, encodedValues) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update multiple Protocol DAO settings at once +func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + encodedValues, err := abiEncodeMultiValues(settingTypes, values) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error ABI encoding values: %w", err) + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingMulti", contractNames, settingPaths, settingTypes, encodedValues) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSetBool +func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update a bool Protocol DAO setting +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSetUint +func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update a uint Protocol DAO setting +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSetAddress +func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingAddress", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update an address Protocol DAO setting +func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingAddress", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSetAddress +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimer", contractName, percentage) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update one of percentage allocations of RPL rewards +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimer", contractName, percentage) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSpendTreasury +func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSpendTreasury", invoiceID, recipient, amount) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to spend a portion of the Rocket Pool treasury +func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSpendTreasury", invoiceID, recipient, amount) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of CancelProposal +func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) +} + +// Cancel a submitted proposal +func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error cancelling Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of VoteOnProposal +func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) +} + +// Vote on a submitted proposal +func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + if err != nil { + return common.Hash{}, fmt.Errorf("error voting on Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of ExecuteProposal +func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) +} + +// Execute a submitted proposal +func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error executing Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Get the ABI encoding of multiple values for a ProposeSettingMulti call +func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any) ([][]byte, error) { + // Sanity check the lengths + settingCount := len(settingTypes) + if settingCount != len(values) { + return nil, fmt.Errorf("settingTypes and values must be the same length") + } + if settingCount == 0 { + return [][]byte{}, nil + } + + // ABI encode each value + results := make([][]byte, settingCount) + for i, settingType := range settingTypes { + var encodedArg []byte + switch settingType { + case types.ProposalSettingType_Uint256: + arg, success := values[i].(*big.Int) + if !success { + return nil, fmt.Errorf("value %d is not a *big.Int, but the setting type is Uint256", i) + } + encodedArg = math.U256Bytes(big.NewInt(0).Set(arg)) + + case types.ProposalSettingType_Bool: + arg, success := values[i].(bool) + if !success { + return nil, fmt.Errorf("value %d is not a bool, but the setting type is Bool", i) + } + if arg { + encodedArg = math.PaddedBigBytes(common.Big1, 32) + } else { + encodedArg = math.PaddedBigBytes(common.Big0, 32) + } + + case types.ProposalSettingType_Address: + arg, success := values[i].(common.Address) + if !success { + return nil, fmt.Errorf("value %d is not an address, but the setting type is Address", i) + } + encodedArg = common.LeftPadBytes(arg.Bytes(), 32) + + default: + return nil, fmt.Errorf("unknown proposal setting type [%v]", settingType) + } + results[i] = encodedArg + } + + return results, nil } -func ProposeSettingUint() -*/ // Get contracts -var rocketDAOProtocolProposalsInterface sync.Mutex +var rocketDAOProtocolProposals sync.Mutex -func getRocketDAOProtocolProposalsInterface(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketDAOProtocolProposalsInterface.Lock() - defer rocketDAOProtocolProposalsInterface.Unlock() - return rp.GetContract("rocketDAOProtocolProposalsInterface", opts) +func getRocketDAOProtocolProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProtocolProposals.Lock() + defer rocketDAOProtocolProposals.Unlock() + return rp.GetContract("rocketDAOProtocolProposals", opts) } diff --git a/types/dao.go b/types/dao.go index 8026275f5..e5d7b370d 100644 --- a/types/dao.go +++ b/types/dao.go @@ -21,6 +21,15 @@ const ( var ProposalStates = []string{"Pending", "Active", "Cancelled", "Defeated", "Succeeded", "Expired", "Executed"} +// DAO setting types +type ProposalSettingType uint8 + +const ( + ProposalSettingType_Uint256 ProposalSettingType = iota + ProposalSettingType_Bool + ProposalSettingType_Address +) + // String conversion func (s ProposalState) String() string { if int(s) >= len(ProposalStates) { From 5cb1647c9fb123516a9649e710e12527d5f7c416 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Sep 2023 00:44:27 -0400 Subject: [PATCH 640/878] Cleaned up RewardsSnapshot deserialization --- rewards/rewards.go | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/rewards/rewards.go b/rewards/rewards.go index 49a1d0cc8..2e4961a1b 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -3,7 +3,6 @@ package rewards import ( "fmt" "math/big" - "reflect" "sync" "time" @@ -53,6 +52,15 @@ type RewardSubmission struct { UserETH *big.Int `json:"userETH"` } +// Internal struct - this is the structure of what gets returned by the RewardSnapshot event +type rewardSnapshot struct { + RewardIndex *big.Int `json:"rewardIndex"` + Submission RewardSubmission `json:"submission"` + IntervalStartTime *big.Int `json:"intervalStartTime"` + IntervalEndTime *big.Int `json:"intervalEndTime"` + Time *big.Int `json:"time"` +} + // Get the index of the active rewards period func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, opts) @@ -267,34 +275,39 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA } // Construct a filter query for relevant logs + rewardsSnapshotEvent := rocketRewardsPool.ABI.Events["RewardSnapshot"] indexBytes := [32]byte{} indexBig.FillBytes(indexBytes[:]) addressFilter := rocketRewardsPoolAddresses - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RewardSnapshot"].ID}, {indexBytes}} + topicFilter := [][]common.Hash{{rewardsSnapshotEvent.ID}, {indexBytes}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(1), block, block, nil) if err != nil { return false, RewardsEvent{}, err } - - // Get the log info - values := make(map[string]interface{}) if len(logs) == 0 { return false, RewardsEvent{}, nil } - err = rocketRewardsPool.ABI.Events["RewardSnapshot"].Inputs.UnpackIntoMap(values, logs[0].Data) + + // Get the log info values + values, err := rewardsSnapshotEvent.Inputs.Unpack(logs[0].Data) + if err != nil { + return false, RewardsEvent{}, fmt.Errorf("error unpacking rewards snapshot event data: %w", err) + } + + // Convert to a native struct + var snapshot rewardSnapshot + err = rewardsSnapshotEvent.Inputs.Copy(&snapshot, values) if err != nil { - return false, RewardsEvent{}, err + return false, RewardsEvent{}, fmt.Errorf("error converting rewards snapshot event data to struct: %w", err) } // Get the decoded data - submissionPrototype := RewardSubmission{} - submissionType := reflect.TypeOf(submissionPrototype) - submission := reflect.ValueOf(values["submission"]).Convert(submissionType).Interface().(RewardSubmission) - eventIntervalStartTime := values["intervalStartTime"].(*big.Int) - eventIntervalEndTime := values["intervalEndTime"].(*big.Int) - submissionTime := values["time"].(*big.Int) + eventIntervalStartTime := snapshot.IntervalStartTime + eventIntervalEndTime := snapshot.IntervalEndTime + submissionTime := snapshot.Time + submission := snapshot.Submission eventData := RewardsEvent{ Index: indexBig, ExecutionBlock: submission.ExecutionBlock, From 55e72f40db433339ef9bbac3f0399494225dbef2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Sep 2023 02:11:51 -0400 Subject: [PATCH 641/878] Implemented rocketDAOProtocolVerifier --- dao/protocol/voting/propose.go | 62 +++++----- dao/protocol/voting/verify.go | 208 +++++++++++++++++++++++++++++++++ rewards/rewards.go | 11 +- 3 files changed, 243 insertions(+), 38 deletions(-) create mode 100644 dao/protocol/voting/verify.go diff --git a/dao/protocol/voting/propose.go b/dao/protocol/voting/propose.go index ff5a7f7b5..a742bb7d3 100644 --- a/dao/protocol/voting/propose.go +++ b/dao/protocol/voting/propose.go @@ -14,17 +14,17 @@ import ( ) // Estimate the gas of a proposal submission -func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "propose", message, payload) + return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "propose", message, payload, blockNumber, treeNodes) } // Submit a trusted node DAO proposal // Returns the ID of the new proposal -func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -33,7 +33,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o if err != nil { return 0, common.Hash{}, err } - tx, err := rocketDAOProtocolProposals.Transact(opts, "propose", message, payload) + tx, err := rocketDAOProtocolProposals.Transact(opts, "propose", message, payload, blockNumber, treeNodes) if err != nil { return 0, common.Hash{}, fmt.Errorf("error submitting Protocol DAO proposal: %w", err) } @@ -41,7 +41,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o } // Estimate the gas of ProposeSetMulti -func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -54,11 +54,11 @@ func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contr if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update multiple Protocol DAO settings at once -func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -71,11 +71,11 @@ func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames [] if err != nil { return 0, common.Hash{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetBool -func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -84,11 +84,11 @@ func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update a bool Protocol DAO setting -func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -97,11 +97,11 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat if err != nil { return 0, common.Hash{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetUint -func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -110,11 +110,11 @@ func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update a uint Protocol DAO setting -func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -123,11 +123,11 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetAddress -func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -136,11 +136,11 @@ func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractNa if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update an address Protocol DAO setting -func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -149,11 +149,11 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetAddress -func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -162,11 +162,11 @@ func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update one of percentage allocations of RPL rewards -func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -175,11 +175,11 @@ func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractNam if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSpendTreasury -func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -188,11 +188,11 @@ func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoice if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, opts) + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to spend a portion of the Rocket Pool treasury -func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -201,7 +201,7 @@ func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, opts) + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of CancelProposal @@ -321,10 +321,10 @@ func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any } // Get contracts -var rocketDAOProtocolProposals sync.Mutex +var rocketDAOProtocolProposalsLock sync.Mutex func getRocketDAOProtocolProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketDAOProtocolProposals.Lock() - defer rocketDAOProtocolProposals.Unlock() + rocketDAOProtocolProposalsLock.Lock() + defer rocketDAOProtocolProposalsLock.Unlock() return rp.GetContract("rocketDAOProtocolProposals", opts) } diff --git a/dao/protocol/voting/verify.go b/dao/protocol/voting/verify.go new file mode 100644 index 000000000..21280c9bf --- /dev/null +++ b/dao/protocol/voting/verify.go @@ -0,0 +1,208 @@ +package voting + +import ( + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Structure of the RootSubmitted event +type RootSubmitted struct { + ProposalID *big.Int `json:"proposalId"` + Proposer common.Address `json:"proposer"` + BlockNumber uint32 `json:"blockNumber"` + Index *big.Int `json:"index"` + RootHash common.Hash `json:"rootHash"` + Sum *big.Int `json:"sum"` + TreeNodes []VotingTreeNode `json:"treeNodes"` + Timestamp time.Time `json:"timestamp"` +} + +// Internal struct - returned by the RootSubmitted event +type rootSubmittedRaw struct { + ProposalID *big.Int `json:"proposalId"` + Proposer common.Address `json:"proposer"` + BlockNumber uint32 `json:"blockNumber"` + Index *big.Int `json:"index"` + RootHash common.Hash `json:"rootHash"` + Sum *big.Int `json:"sum"` + TreeNodes []VotingTreeNode `json:"treeNodes"` + Timestamp *big.Int `json:"timestamp"` +} + +// Structure of the ChallengeSubmitted event +type ChallengeSubmitted struct { + ProposalID *big.Int `json:"proposalId"` + Challenger common.Address `json:"challenger"` + Index *big.Int `json:"index"` + Timestamp time.Time `json:"timestamp"` +} + +// Internal struct - returned by the ChallengeSubmitted event +type challengeSubmittedRaw struct { + ProposalID *big.Int `json:"proposalId"` + Challenger common.Address `json:"challenger"` + Index *big.Int `json:"index"` + Timestamp *big.Int `json:"timestamp"` +} + +// Estimate the gas of CreateChallenge +func EstimateCreateChallengeGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index)))) +} + +// Submit the Merkle root for a proposal at the specific index in response to a challenge +func CreateChallenge(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolVerifier.Transact(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index)))) + if err != nil { + return common.Hash{}, fmt.Errorf("error creating challenge: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas of SubmitRoot +func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []VotingTreeNode, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), witness, treeNodes) +} + +// Submit the Merkle root for a proposal at the specific index in response to a challenge +func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []VotingTreeNode, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolVerifier.Transact(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), witness, treeNodes) + if err != nil { + return common.Hash{}, fmt.Errorf("error submitting proposal root: %w", err) + } + return tx.Hash(), nil +} + +// Get RootSubmitted event info +func GetRootSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (bool, RootSubmitted, error) { + // Get the contract + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return false, RootSubmitted{}, err + } + + // Construct a filter query for relevant logs + proposalIdBig := big.NewInt(0).SetUint64(proposalID) + rootSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["RootSubmitted"] + proposalIdBytes := [32]byte{} + proposalIdBig.FillBytes(proposalIdBytes[:]) + addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} + topicFilter := [][]common.Hash{{rootSubmittedEvent.ID}, {proposalIdBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) + if err != nil { + return false, RootSubmitted{}, err + } + if len(logs) == 0 { + return false, RootSubmitted{}, nil + } + + // Get the log info values + values, err := rootSubmittedEvent.Inputs.Unpack(logs[0].Data) + if err != nil { + return false, RootSubmitted{}, fmt.Errorf("error unpacking RootSubmitted event data: %w", err) + } + + // Convert to a native struct + var raw rootSubmittedRaw + err = rootSubmittedEvent.Inputs.Copy(&raw, values) + if err != nil { + return false, RootSubmitted{}, fmt.Errorf("error converting RootSubmitted event data to struct: %w", err) + } + + // Get the decoded data + eventData := RootSubmitted{ + ProposalID: raw.ProposalID, + Proposer: raw.Proposer, + BlockNumber: raw.BlockNumber, + Index: raw.Index, + RootHash: raw.RootHash, + Sum: raw.Sum, + TreeNodes: raw.TreeNodes, + Timestamp: time.Unix(raw.Timestamp.Int64(), 0), + } + + return true, eventData, nil +} + +// Get ChallengeSubmitted event info +func GetChallengeSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (bool, ChallengeSubmitted, error) { + // Get the contract + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return false, ChallengeSubmitted{}, err + } + + // Construct a filter query for relevant logs + proposalIdBig := big.NewInt(0).SetUint64(proposalID) + challengeSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["ChallengeSubmitted"] + proposalIdBytes := [32]byte{} + proposalIdBig.FillBytes(proposalIdBytes[:]) + addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} + topicFilter := [][]common.Hash{{challengeSubmittedEvent.ID}, {proposalIdBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) + if err != nil { + return false, ChallengeSubmitted{}, err + } + if len(logs) == 0 { + return false, ChallengeSubmitted{}, nil + } + + // Get the log info values + values, err := challengeSubmittedEvent.Inputs.Unpack(logs[0].Data) + if err != nil { + return false, ChallengeSubmitted{}, fmt.Errorf("error unpacking ChallengeSubmitted event data: %w", err) + } + + // Convert to a native struct + var raw challengeSubmittedRaw + err = challengeSubmittedEvent.Inputs.Copy(&raw, values) + if err != nil { + return false, ChallengeSubmitted{}, fmt.Errorf("error converting ChallengeSubmitted event data to struct: %w", err) + } + + // Get the decoded data + eventData := ChallengeSubmitted{ + ProposalID: raw.ProposalID, + Challenger: raw.Challenger, + Index: raw.Index, + Timestamp: time.Unix(raw.Timestamp.Int64(), 0), + } + + return true, eventData, nil +} + +// Get contracts +var rocketDAOProtocolVerifierLock sync.Mutex + +func getRocketDAOProtocolVerifier(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProtocolVerifierLock.Lock() + defer rocketDAOProtocolVerifierLock.Unlock() + return rp.GetContract("rocketDAOProtocolVerifier", opts) +} diff --git a/rewards/rewards.go b/rewards/rewards.go index 2e4961a1b..50d711ae4 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -304,9 +304,6 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA } // Get the decoded data - eventIntervalStartTime := snapshot.IntervalStartTime - eventIntervalEndTime := snapshot.IntervalEndTime - submissionTime := snapshot.Time submission := snapshot.Submission eventData := RewardsEvent{ Index: indexBig, @@ -318,11 +315,11 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA NodeRPL: submission.NodeRPL, NodeETH: submission.NodeETH, UserETH: submission.UserETH, - MerkleRoot: common.BytesToHash(submission.MerkleRoot[:]), + MerkleRoot: submission.MerkleRoot, MerkleTreeCID: submission.MerkleTreeCID, - IntervalStartTime: time.Unix(eventIntervalStartTime.Int64(), 0), - IntervalEndTime: time.Unix(eventIntervalEndTime.Int64(), 0), - SubmissionTime: time.Unix(submissionTime.Int64(), 0), + IntervalStartTime: time.Unix(snapshot.IntervalStartTime.Int64(), 0), + IntervalEndTime: time.Unix(snapshot.IntervalEndTime.Int64(), 0), + SubmissionTime: time.Unix(snapshot.Time.Int64(), 0), } // Convert v1.1.0-rc1 events to modern ones From e3553ab768f337764ec515db8dfa27905a925765 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Sep 2023 21:38:57 -0400 Subject: [PATCH 642/878] Refactored the Prices / Balances utilities, removed bootstrapping --- dao/protocol/dao.go | 92 ---- .../{voting/propose.go => proposals.go} | 30 +- dao/protocol/voting/verify.go | 37 +- dao/protocol/voting/voting-tree-generator.go | 32 +- dao/trustednode/actions.go | 37 ++ dao/trustednode/dao.go | 98 ----- network/balances.go | 183 ++++++++ network/prices.go | 183 ++++++++ node/node.go | 393 ------------------ settings/protocol/auction.go | 23 - settings/protocol/deposit.go | 21 +- settings/protocol/inflation.go | 8 - settings/protocol/minipool.go | 11 - settings/protocol/network.go | 32 -- settings/protocol/node.go | 17 - settings/protocol/rewards.go | 5 - settings/trustednode/members.go | 21 - settings/trustednode/minipool.go | 15 - settings/trustednode/proposals.go | 15 - types/dao.go | 7 + 20 files changed, 461 insertions(+), 799 deletions(-) rename dao/protocol/{voting/propose.go => proposals.go} (90%) diff --git a/dao/protocol/dao.go b/dao/protocol/dao.go index 00f3aeeeb..541bccb66 100644 --- a/dao/protocol/dao.go +++ b/dao/protocol/dao.go @@ -1,105 +1,13 @@ package protocol import ( - "fmt" - "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) -// Estimate the gas of BootstrapBool -func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) -} - -// Bootstrap a bool setting -func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapUint -func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) -} - -// Bootstrap a uint256 setting -func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapAddress -func EstimateBootstrapAddressGas(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingAddress", contractName, settingPath, value) -} - -// Bootstrap an address setting -func BootstrapAddress(rp *rocketpool.RocketPool, contractName, settingPath string, value common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingAddress", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol setting %s.%s: %w", contractName, settingPath, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapClaimer -func EstimateBootstrapClaimerGas(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocol.GetTransactionGasInfo(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) -} - -// Bootstrap a rewards claimer -func BootstrapClaimer(rp *rocketpool.RocketPool, contractName string, amount float64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocol, err := getRocketDAOProtocol(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocol.Transact(opts, "bootstrapSettingClaimer", contractName, eth.EthToWei(amount)) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap protocol rewards claimer %s: %w", contractName, err) - } - return tx.Hash(), nil -} - // Get contracts var rocketDAOProtocolLock sync.Mutex diff --git a/dao/protocol/voting/propose.go b/dao/protocol/proposals.go similarity index 90% rename from dao/protocol/voting/propose.go rename to dao/protocol/proposals.go index a742bb7d3..393bd507e 100644 --- a/dao/protocol/voting/propose.go +++ b/dao/protocol/proposals.go @@ -1,4 +1,4 @@ -package voting +package protocol import ( "fmt" @@ -14,7 +14,7 @@ import ( ) // Estimate the gas of a proposal submission -func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -24,7 +24,7 @@ func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []by // Submit a trusted node DAO proposal // Returns the ID of the new proposal -func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -41,7 +41,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, b } // Estimate the gas of ProposeSetMulti -func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -58,7 +58,7 @@ func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contr } // Submit a proposal to update multiple Protocol DAO settings at once -func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -75,7 +75,7 @@ func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames [] } // Estimate the gas of ProposeSetBool -func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -88,7 +88,7 @@ func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, } // Submit a proposal to update a bool Protocol DAO setting -func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -101,7 +101,7 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat } // Estimate the gas of ProposeSetUint -func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -114,7 +114,7 @@ func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, } // Submit a proposal to update a uint Protocol DAO setting -func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -127,7 +127,7 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat } // Estimate the gas of ProposeSetAddress -func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -140,7 +140,7 @@ func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractNa } // Submit a proposal to update an address Protocol DAO setting -func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, settingPath string, value common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -153,7 +153,7 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting } // Estimate the gas of ProposeSetAddress -func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -166,7 +166,7 @@ func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, } // Submit a proposal to update one of percentage allocations of RPL rewards -func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err @@ -179,7 +179,7 @@ func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractNam } // Estimate the gas of ProposeSpendTreasury -func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -192,7 +192,7 @@ func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoice } // Submit a proposal to spend a portion of the Rocket Pool treasury -func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err diff --git a/dao/protocol/voting/verify.go b/dao/protocol/voting/verify.go index 21280c9bf..a45dc7f0a 100644 --- a/dao/protocol/voting/verify.go +++ b/dao/protocol/voting/verify.go @@ -9,31 +9,32 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Structure of the RootSubmitted event type RootSubmitted struct { - ProposalID *big.Int `json:"proposalId"` - Proposer common.Address `json:"proposer"` - BlockNumber uint32 `json:"blockNumber"` - Index *big.Int `json:"index"` - RootHash common.Hash `json:"rootHash"` - Sum *big.Int `json:"sum"` - TreeNodes []VotingTreeNode `json:"treeNodes"` - Timestamp time.Time `json:"timestamp"` + ProposalID *big.Int `json:"proposalId"` + Proposer common.Address `json:"proposer"` + BlockNumber uint32 `json:"blockNumber"` + Index *big.Int `json:"index"` + RootHash common.Hash `json:"rootHash"` + Sum *big.Int `json:"sum"` + TreeNodes []types.VotingTreeNode `json:"treeNodes"` + Timestamp time.Time `json:"timestamp"` } // Internal struct - returned by the RootSubmitted event type rootSubmittedRaw struct { - ProposalID *big.Int `json:"proposalId"` - Proposer common.Address `json:"proposer"` - BlockNumber uint32 `json:"blockNumber"` - Index *big.Int `json:"index"` - RootHash common.Hash `json:"rootHash"` - Sum *big.Int `json:"sum"` - TreeNodes []VotingTreeNode `json:"treeNodes"` - Timestamp *big.Int `json:"timestamp"` + ProposalID *big.Int `json:"proposalId"` + Proposer common.Address `json:"proposer"` + BlockNumber uint32 `json:"blockNumber"` + Index *big.Int `json:"index"` + RootHash common.Hash `json:"rootHash"` + Sum *big.Int `json:"sum"` + TreeNodes []types.VotingTreeNode `json:"treeNodes"` + Timestamp *big.Int `json:"timestamp"` } // Structure of the ChallengeSubmitted event @@ -75,7 +76,7 @@ func CreateChallenge(rp *rocketpool.RocketPool, proposalId uint64, index uint64, } // Estimate the gas of SubmitRoot -func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []VotingTreeNode, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []types.VotingTreeNode, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -84,7 +85,7 @@ func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index u } // Submit the Merkle root for a proposal at the specific index in response to a challenge -func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []VotingTreeNode, treeNodes []VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []types.VotingTreeNode, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return common.Hash{}, err diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/voting-tree-generator.go index 44e4fa097..f0423dd56 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "golang.org/x/sync/errgroup" ) @@ -25,11 +26,6 @@ type NodeVotingInfo struct { Delegate common.Address } -type VotingTreeNode struct { - Sum *big.Int `abi:"sum" json:"sum"` - Hash common.Hash `abi:"hash" json:"hash"` -} - type VotingTreeGenerator struct { rp *rocketpool.RocketPool } @@ -42,7 +38,7 @@ func NewVotingTreeGenerator(rp *rocketpool.RocketPool) (*VotingTreeGenerator, er } // Gets a complete Pollard row for a new proposal based on the target block number. -func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, opts *bind.CallOpts) ([]VotingTreeNode, error) { +func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { // Get an nxn array of each node's voting power and delegating status votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) if err != nil { @@ -58,7 +54,7 @@ func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, op } // Gets a complete proof and corresponding Pollard row to challenge an existing proposal. -func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, opts *bind.CallOpts) ([]VotingTreeNode, []VotingTreeNode, error) { +func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, opts *bind.CallOpts) ([]types.VotingTreeNode, []types.VotingTreeNode, error) { // Get an nxn array of each node's voting power and delegating status votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) if err != nil { @@ -150,10 +146,10 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts * } // Create the complete set of subtree leaf nodes -func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []VotingTreeNode { +func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []types.VotingTreeNode { nodeCount := uint64(len(votingPowers)) if nodeCount == 0 { - return []VotingTreeNode{} + return []types.VotingTreeNode{} } // Create the slice of leaf nodes for the subtree @@ -162,7 +158,7 @@ func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []Votin totalSubTreeLeafNodes := subTreeLeafCountPerMainTreeNode * subTreeLeafCountPerMainTreeNode // Create the leaf nodes - leafNodes := make([]VotingTreeNode, totalSubTreeLeafNodes) + leafNodes := make([]types.VotingTreeNode, totalSubTreeLeafNodes) for i := uint64(0); i < subTreeLeafCountPerMainTreeNode; i++ { for j := uint64(0); j < subTreeLeafCountPerMainTreeNode; j++ { index := i*subTreeLeafCountPerMainTreeNode + j @@ -175,7 +171,7 @@ func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []Votin balance = big.NewInt(0) } - leafNode := VotingTreeNode{ + leafNode := types.VotingTreeNode{ Sum: balance, Hash: getHashForBalance(balance), } @@ -189,7 +185,7 @@ func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []Votin // For new proposals use index = 1. // For challenges, the index is the index of the node being challenged. // Returns the aggregated proof, and the list of nodes in the pollard row. -func (g *VotingTreeGenerator) generatePollard(leafNodes []VotingTreeNode, index uint64) ([]VotingTreeNode, []VotingTreeNode) { +func (g *VotingTreeGenerator) generatePollard(leafNodes []types.VotingTreeNode, index uint64) ([]types.VotingTreeNode, []types.VotingTreeNode) { order := DepthPerRound offset := uint64(math.Floor(math.Log2(float64(index)))) // Depth of the node being challenged, if not building a proposal depth := uint64(math.Log2(float64(len(leafNodes)))) // Total depth of the tree @@ -205,10 +201,10 @@ func (g *VotingTreeGenerator) generatePollard(leafNodes []VotingTreeNode, index pollardOffset := index*uint64(math.Pow(2, float64(order))) - uint64(math.Pow(2, float64(order+offset))) // Get the list of nodes corresponding to the pollard row - var nodes []VotingTreeNode + var nodes []types.VotingTreeNode if depth == pollardDepth { // The pollard row is the last one so just grab the final row from the leaf nodes - nodes = make([]VotingTreeNode, pollardSize) + nodes = make([]types.VotingTreeNode, pollardSize) copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] } @@ -225,14 +221,14 @@ func (g *VotingTreeGenerator) generatePollard(leafNodes []VotingTreeNode, index // Slice out the nodes for the pollard once we've reached the right level if level-1 == offset+order { - nodes = make([]VotingTreeNode, pollardSize) + nodes = make([]types.VotingTreeNode, pollardSize) copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] } } // Build a proof from the offset up to the root node - proof := []VotingTreeNode{} + proof := []types.VotingTreeNode{} for level := offset; level > 0; level-- { indexOffset := uint64(math.Pow(2, float64(level))) @@ -256,7 +252,7 @@ func (g *VotingTreeGenerator) generatePollard(leafNodes []VotingTreeNode, index } // Get the keccak hash of a parent node with two children -func getParentNodeFromChildren(leftChild VotingTreeNode, rightChild VotingTreeNode) VotingTreeNode { +func getParentNodeFromChildren(leftChild types.VotingTreeNode, rightChild types.VotingTreeNode) types.VotingTreeNode { leftBuffer := [32]byte{} rightBuffer := [32]byte{} leftChild.Sum.FillBytes(leftBuffer[:]) @@ -264,7 +260,7 @@ func getParentNodeFromChildren(leftChild VotingTreeNode, rightChild VotingTreeNo hash := crypto.Keccak256Hash(leftChild.Hash[:], leftBuffer[:], rightChild.Hash[:], rightBuffer[:]) sum := big.NewInt(0).Add(leftChild.Sum, rightChild.Sum) - return VotingTreeNode{ + return types.VotingTreeNode{ Hash: hash, Sum: sum, } diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index fb8dfb014..f07f042a5 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -2,12 +2,14 @@ package trustednode import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Estimate the gas of Join @@ -100,6 +102,41 @@ func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, op return tx.Hash(), nil } +// Returns the most recent block number that the number of trusted nodes changed since fromBlock +func GetLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (uint64, error) { + // Get contracts + rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, opts) + if err != nil { + return 0, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} + topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return 0, err + } + + for i := range logs { + log := logs[len(logs)-i-1] + if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { + values := make(map[string]interface{}) + // Decode the event + if rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return 0, err + } + if values["success"].(bool) { + return log.BlockNumber, nil + } + } else { + return log.BlockNumber, nil + } + } + return fromBlock, nil +} + // Get contracts var rocketDAONodeTrustedActionsLock sync.Mutex diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 4816f25b0..6876791fe 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -353,104 +353,6 @@ func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Addre return *isChallenged, nil } -// Estimate the gas of BootstrapBool -func EstimateBootstrapBoolGas(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingBool", contractName, settingPath, value) -} - -// Bootstrap a bool setting -func BootstrapBool(rp *rocketpool.RocketPool, contractName, settingPath string, value bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingBool", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapUint -func EstimateBootstrapUintGas(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapSettingUint", contractName, settingPath, value) -} - -// Bootstrap a uint256 setting -func BootstrapUint(rp *rocketpool.RocketPool, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapSettingUint", contractName, settingPath, value) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node setting %s.%s: %w", contractName, settingPath, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapMember -func EstimateBootstrapMemberGas(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - url = strings.Sanitize(url) - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapMember", id, url, nodeAddress) -} - -// Bootstrap a DAO member -func BootstrapMember(rp *rocketpool.RocketPool, id, url string, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return common.Hash{}, err - } - url = strings.Sanitize(url) - tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapMember", id, url, nodeAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap trusted node member %s: %w", id, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of BootstrapUpgrade -func EstimateBootstrapUpgradeGas(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return rocketpool.GasInfo{}, err - } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAONodeTrusted.GetTransactionGasInfo(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) -} - -// Bootstrap a contract upgrade -func BootstrapUpgrade(rp *rocketpool.RocketPool, upgradeType, contractName, contractAbi string, contractAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { - compressedAbi, err := rocketpool.EncodeAbiStr(contractAbi) - if err != nil { - return common.Hash{}, err - } - rocketDAONodeTrusted, err := getRocketDAONodeTrusted(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAONodeTrusted.Transact(opts, "bootstrapUpgrade", upgradeType, contractName, compressedAbi, contractAddress) - if err != nil { - return common.Hash{}, fmt.Errorf("Could not bootstrap contract '%s' upgrade (%s): %w", contractName, upgradeType, err) - } - return tx.Hash(), nil -} - // Get contracts var rocketDAONodeTrustedLock sync.Mutex diff --git a/network/balances.go b/network/balances.go index ce4eaf3b6..3908fcfee 100644 --- a/network/balances.go +++ b/network/balances.go @@ -1,14 +1,20 @@ package network import ( + "context" "fmt" + "math" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "gonum.org/v1/gonum/mathext" + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -125,6 +131,183 @@ func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.Call return *latestReportableBlock, nil } +// Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock +func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkBalances.ABI.Events["BalancesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil +} + +// Returns an array of members who submitted a balance since fromBlock +func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkBalances.Address} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil +} + +// Returns a mapping of members and whether they have submitted balances this interval or not +func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency + submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize, opts) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range members { + participationTable[member.Address] = false + } + for _, submission := range submissions { + participationTable[submission] = true + } + return participationTable, nil +} + +// Calculates the participation rate of every trusted node on balance submission since the last block that member count changed +func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { + // Get the update frequency + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber/updateBalancesFrequency - 50) * updateBalancesFrequency + latestMemberCountChangedBlock, err := trustednode.GetLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) + if err != nil { + return nil, err + } + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock/updateBalancesFrequency + 1) * updateBalancesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount)/2 + 1) + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber-startBlock)/updateBalancesFrequency + 1 + } + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range members { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if intervalsPassed > 0 { + blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize, opts) + if err != nil { + return nil, err + } + actual = len(*blocks) + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block%updateBalancesFrequency == 0 { + index := block/updateBalancesFrequency - startBlock/updateBalancesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if intervalsPassed > 0 { + probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) + } + // Construct return value + participation := node.TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updateBalancesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil +} + // Get contracts var rocketNetworkBalancesLock sync.Mutex diff --git a/network/prices.go b/network/prices.go index e718b1dc2..9f24f542b 100644 --- a/network/prices.go +++ b/network/prices.go @@ -1,14 +1,21 @@ package network import ( + "context" "fmt" + "math" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "gonum.org/v1/gonum/mathext" + "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Get the block number which network prices are current for @@ -72,6 +79,182 @@ func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOp return *latestReportableBlock, nil } +// Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock +func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + timestamps := make([]uint64, len(logs)) + for i, log := range logs { + values := make(map[string]interface{}) + // Decode the event + if rocketNetworkPrices.ABI.Events["PricesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { + return nil, err + } + timestamps[i] = values["block"].(*big.Int).Uint64() + } + return ×tamps, nil +} + +// Returns an array of members who submitted prices since fromBlock +func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return nil, err + } + // Construct a filter query for relevant logs + addressFilter := []common.Address{*rocketNetworkPrices.Address} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}} + + // Get the event logs + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) + if err != nil { + return nil, err + } + + results := make([]common.Address, len(logs)) + for i, log := range logs { + // Topic 0 is the event, topic 1 is the "from" address + address := common.BytesToAddress(log.Topics[1].Bytes()) + results[i] = address + } + return results, nil +} + +// Returns a mapping of members and whether they have submitted prices this interval or not +func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Get submission within the current interval + fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency + submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize, opts) + if err != nil { + return nil, err + } + // Build and return result table + participationTable := make(map[common.Address]bool) + for _, member := range members { + participationTable[member.Address] = false + } + for _, submission := range submissions { + participationTable[submission] = true + } + return participationTable, nil +} + +// Calculates the participation rate of every trusted node on price submission since the last block that member count changed +func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { + // Get the update frequency + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + if err != nil { + return nil, err + } + // Get the current block + currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + currentBlockNumber := currentBlock.Number.Uint64() + // Get the block of the most recent member join (limiting to 50 intervals) + minBlock := (currentBlockNumber/updatePricesFrequency - 50) * updatePricesFrequency + latestMemberCountChangedBlock, err := trustednode.GetLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) + if err != nil { + return nil, err + } + // Get the number of current members + memberCount, err := trustednode.GetMemberCount(rp, nil) + if err != nil { + return nil, err + } + // Start block is the first interval after the latest join + startBlock := (latestMemberCountChangedBlock/updatePricesFrequency + 1) * updatePricesFrequency + // The number of members that have to submit each interval + consensus := math.Floor(float64(memberCount)/2 + 1) + // Check if any intervals have passed + intervalsPassed := uint64(0) + if currentBlockNumber > startBlock { + // The number of intervals passed + intervalsPassed = (currentBlockNumber-startBlock)/updatePricesFrequency + 1 + } + // How many submissions would we expect per member given a random submission + expected := float64(intervalsPassed) * consensus / float64(memberCount) + // Get trusted members + members, err := trustednode.GetMembers(rp, nil) + if err != nil { + return nil, err + } + // Construct the epoch map + participationTable := make(map[common.Address][]bool) + // Iterate members and sum chi-square + submissions := make(map[common.Address]float64) + chi := float64(0) + for _, member := range members { + participationTable[member.Address] = make([]bool, intervalsPassed) + actual := 0 + if intervalsPassed > 0 { + blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize, opts) + if err != nil { + return nil, err + } + actual = len(*blocks) + delta := float64(actual) - expected + chi += (delta * delta) / expected + // Add to participation table + for _, block := range *blocks { + // Ignore out of step updates + if block%updatePricesFrequency == 0 { + index := block/updatePricesFrequency - startBlock/updatePricesFrequency + participationTable[member.Address][index] = true + } + } + } + // Save actual submission + submissions[member.Address] = float64(actual) + } + // Calculate inverse cumulative density function with members-1 DoF + probability := float64(1) + if intervalsPassed > 0 { + probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) + } + // Construct return value + participation := node.TrustedNodeParticipation{ + Probability: probability, + ExpectedSubmissions: expected, + ActualSubmissions: submissions, + StartBlock: startBlock, + UpdateFrequency: updatePricesFrequency, + UpdateCount: intervalsPassed, + Participation: participationTable, + } + return &participation, nil +} + // Get contracts var rocketNetworkPricesLock sync.Mutex diff --git a/node/node.go b/node/node.go index 858af2c77..3f796b0a0 100644 --- a/node/node.go +++ b/node/node.go @@ -1,17 +1,12 @@ package node import ( - "context" "fmt" "math" "math/big" "sync" "time" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "gonum.org/v1/gonum/mathext" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" @@ -438,394 +433,6 @@ func GetNodeRegistrationTimeRaw(rp *rocketpool.RocketPool, address common.Addres return *registrationTime, nil } -// Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock -func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { - // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkPrices.Address} - topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - timestamps := make([]uint64, len(logs)) - for i, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketNetworkPrices.ABI.Events["PricesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - timestamps[i] = values["block"].(*big.Int).Uint64() - } - return ×tamps, nil -} - -// Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock -func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { - // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkBalances.Address} - topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - timestamps := make([]uint64, len(logs)) - for i, log := range logs { - values := make(map[string]interface{}) - // Decode the event - if rocketNetworkBalances.ABI.Events["BalancesSubmitted"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return nil, err - } - timestamps[i] = values["block"].(*big.Int).Uint64() - } - return ×tamps, nil -} - -// Returns the most recent block number that the number of trusted nodes changed since fromBlock -func getLatestMemberCountChangedBlock(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (uint64, error) { - // Get contracts - rocketDaoNodeTrustedActions, err := getRocketDAONodeTrustedActions(rp, opts) - if err != nil { - return 0, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketDaoNodeTrustedActions.Address} - topicFilter := [][]common.Hash{{rocketDaoNodeTrustedActions.ABI.Events["ActionJoined"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionLeave"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionKick"].ID, rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return 0, err - } - - for i := range logs { - log := logs[len(logs)-i-1] - if log.Topics[0] == rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].ID { - values := make(map[string]interface{}) - // Decode the event - if rocketDaoNodeTrustedActions.ABI.Events["ActionChallengeDecided"].Inputs.UnpackIntoMap(values, log.Data) != nil { - return 0, err - } - if values["success"].(bool) { - return log.BlockNumber, nil - } - } else { - return log.BlockNumber, nil - } - } - return fromBlock, nil -} - -// Calculates the participation rate of every trusted node on price submission since the last block that member count changed -func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber/updatePricesFrequency - 50) * updatePricesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock/updatePricesFrequency + 1) * updatePricesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount)/2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber-startBlock)/updatePricesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range members { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if intervalsPassed > 0 { - blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize, opts) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block%updatePricesFrequency == 0 { - index := block/updatePricesFrequency - startBlock/updatePricesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if intervalsPassed > 0 { - probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) - } - // Construct return value - participation := TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updatePricesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil -} - -// Calculates the participation rate of every trusted node on balance submission since the last block that member count changed -func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*TrustedNodeParticipation, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber/updateBalancesFrequency - 50) * updateBalancesFrequency - latestMemberCountChangedBlock, err := getLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock/updateBalancesFrequency + 1) * updateBalancesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount)/2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber-startBlock)/updateBalancesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range members { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if intervalsPassed > 0 { - blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize, opts) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block%updateBalancesFrequency == 0 { - index := block/updateBalancesFrequency - startBlock/updateBalancesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if intervalsPassed > 0 { - probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) - } - // Construct return value - participation := TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updateBalancesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil -} - -// Returns an array of members who submitted a balance since fromBlock -func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { - // Get contracts - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkBalances.Address} - topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - results := make([]common.Address, len(logs)) - for i, log := range logs { - // Topic 0 is the event, topic 1 is the "from" address - address := common.BytesToAddress(log.Topics[1].Bytes()) - results[i] = address - } - return results, nil -} - -// Returns a mapping of members and whether they have submitted balances this interval or not -func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency - submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range members { - participationTable[member.Address] = false - } - for _, submission := range submissions { - participationTable[submission] = true - } - return participationTable, nil -} - -// Returns an array of members who submitted prices since fromBlock -func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) ([]common.Address, error) { - // Get contracts - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) - if err != nil { - return nil, err - } - // Construct a filter query for relevant logs - addressFilter := []common.Address{*rocketNetworkPrices.Address} - topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}} - - // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) - if err != nil { - return nil, err - } - - results := make([]common.Address, len(logs)) - for i, log := range logs { - // Topic 0 is the event, topic 1 is the "from" address - address := common.BytesToAddress(log.Topics[1].Bytes()) - results[i] = address - } - return results, nil -} - -// Returns a mapping of members and whether they have submitted prices this interval or not -func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency - submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range members { - participationTable[member.Address] = false - } - for _, submission := range submissions { - participationTable[submission] = true - } - return participationTable, nil -} - // Get the smoothing pool opt-in status of a node func GetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeManager, err := getRocketNodeManager(rp, opts) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index 362298c7f..e925cc61f 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -28,9 +26,6 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, } return *value, nil } -func BootstrapCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.create.enabled", value, opts) -} // Lot bidding currently enabled func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -44,9 +39,6 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e } return *value, nil } -func BootstrapBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, AuctionSettingsContractName, "auction.lot.bidding.enabled", value, opts) -} // The minimum lot size in ETH value func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -60,9 +52,6 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.minimum", value, opts) -} // The maximum lot size in ETH value func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -76,9 +65,6 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.value.maximum", value, opts) -} // The lot duration in blocks func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -92,9 +78,6 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } return (*value).Uint64(), nil } -func BootstrapLotDuration(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.lot.duration", big.NewInt(int64(value)), opts) -} // The starting price relative to current ETH price, as a fraction func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -108,9 +91,6 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } -func BootstrapLotStartingPriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.start", eth.EthToWei(value), opts) -} // The reserve price relative to current ETH price, as a fraction func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -124,9 +104,6 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl } return eth.WeiToEth(*value), nil } -func BootstrapLotReservePriceRatio(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, AuctionSettingsContractName, "auction.price.reserve", eth.EthToWei(value), opts) -} // Get contracts var auctionSettingsContractLock sync.Mutex diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index c31d7a3db..d4456d2ad 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -6,14 +6,14 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) // Config -const DepositSettingsContractName = "rocketDAOProtocolSettingsDeposit" +const ( + DepositSettingsContractName string = "rocketDAOProtocolSettingsDeposit" +) // Deposits currently enabled func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -27,9 +27,6 @@ func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, er } return *value, nil } -func BootstrapDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.enabled", value, opts) -} // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -43,9 +40,6 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } -func BootstrapAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, DepositSettingsContractName, "deposit.assign.enabled", value, opts) -} // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -59,9 +53,6 @@ func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int } return *value, nil } -func BootstrapMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.minimum", value, opts) -} // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -75,9 +66,6 @@ func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return *value, nil } -func BootstrapMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.pool.maximum", value, opts) -} // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -91,9 +79,6 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } return (*value).Uint64(), nil } -func BootstrapMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, DepositSettingsContractName, "deposit.assign.maximum", big.NewInt(int64(value)), opts) -} // Get contracts var depositSettingsContractLock sync.Mutex diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 282c194b2..a9bcf98af 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -28,9 +26,6 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } -func BootstrapInflationIntervalRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.rate", eth.EthToWei(value), opts) -} // RPL inflation start time func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -44,9 +39,6 @@ func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } return (*value).Uint64(), nil } -func BootstrapInflationStartTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, InflationSettingsContractName, "rpl.inflation.interval.start", big.NewInt(int64(value)), opts) -} // Get contracts var inflationSettingsContractLock sync.Mutex diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index dcf21d912..1c87dfcf1 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -7,9 +7,7 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -111,9 +109,6 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. } return *value, nil } -func BootstrapMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.submit.withdrawable.enabled", value, opts) -} // Timeout period in seconds for prelaunch minipools to launch func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { @@ -141,9 +136,6 @@ func GetMinipoolLaunchTimeoutRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return *value, nil } -func BootstrapMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, MinipoolSettingsContractName, "minipool.launch.timeout", big.NewInt(int64(value.Seconds())), opts) -} // Minipool bond reductions currently enabled func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -157,9 +149,6 @@ func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bo } return *value, nil } -func BootstrapBondReductionEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, MinipoolSettingsContractName, "minipool.bond.reduction.enabled", value, opts) -} // Get contracts var minipoolSettingsContractLock sync.Mutex diff --git a/settings/protocol/network.go b/settings/protocol/network.go index e1514018b..e9e75a9d1 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -28,9 +26,6 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } -func BootstrapNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.consensus.threshold", eth.EthToWei(value), opts) -} // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -44,9 +39,6 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } -func BootstrapSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.balances.enabled", value, opts) -} // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -60,9 +52,6 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.balances.frequency", big.NewInt(int64(value)), opts) -} // Network price submissions currently enabled func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -76,9 +65,6 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } return *value, nil } -func BootstrapSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NetworkSettingsContractName, "network.submit.prices.enabled", value, opts) -} // The frequency in blocks at which network prices should be submitted by trusted nodes func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -92,9 +78,6 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func BootstrapSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.submit.prices.frequency", big.NewInt(int64(value)), opts) -} // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -108,9 +91,6 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapMinimumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.minimum", eth.EthToWei(value), opts) -} // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -124,9 +104,6 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapTargetNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.target", eth.EthToWei(value), opts) -} // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -140,9 +117,6 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func BootstrapMaximumNodeFee(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.maximum", eth.EthToWei(value), opts) -} // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -156,9 +130,6 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } -func BootstrapNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.node.fee.demand.range", value, opts) -} // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -172,9 +143,6 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func BootstrapTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NetworkSettingsContractName, "network.reth.collateral.target", eth.EthToWei(value), opts) -} // Get contracts var networkSettingsContractLock sync.Mutex diff --git a/settings/protocol/node.go b/settings/protocol/node.go index f86dc4226..5bd8d775a 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -28,9 +26,6 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return *value, nil } -func BootstrapNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.registration.enabled", value, opts) -} // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -44,9 +39,6 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool } return *value, nil } -func BootstrapNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.deposit.enabled", value, opts) -} // Vacant minipools currently enabled func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -60,9 +52,6 @@ func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return *value, nil } -func BootstrapVacantMinipoolsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapBool(rp, NodeSettingsContractName, "node.vacant.minipools.enabled", value, opts) -} // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -89,9 +78,6 @@ func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpt } return *value, nil } -func BootstrapMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.minimum", eth.EthToWei(value), opts) -} // The maximum RPL stake per minipool as a fraction of assigned user ETH func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -118,9 +104,6 @@ func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpt } return *value, nil } -func BootstrapMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, NodeSettingsContractName, "node.per.minipool.stake.maximum", eth.EthToWei(value), opts) -} // Get contracts var nodeSettingsContractLock sync.Mutex diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index da5c6ecb9..5628eab0a 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -67,9 +65,6 @@ func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return protocoldao.BootstrapUint(rp, RewardsSettingsContractName, "rpl.rewards.claim.period.time", big.NewInt(int64(value)), opts) -} // Get contracts var rewardsSettingsContractLock sync.Mutex diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 9a465a3cb..65ff723fd 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -37,9 +37,6 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) } return eth.WeiToEth(*value), nil } -func BootstrapQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) -} func ProposeQuorum(rp *rocketpool.RocketPool, value float64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", QuorumSettingPath), MembersSettingsContractName, QuorumSettingPath, eth.EthToWei(value), opts) } @@ -59,9 +56,6 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error } return *value, nil } -func BootstrapRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, RPLBondSettingPath, value, opts) -} func ProposeRPLBond(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", RPLBondSettingPath), MembersSettingsContractName, RPLBondSettingPath, value, opts) } @@ -81,9 +75,6 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } return (*value).Uint64(), nil } -func BootstrapMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) -} func ProposeMinipoolUnbondedMax(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMaxSettingPath), MembersSettingsContractName, MinipoolUnbondedMaxSettingPath, big.NewInt(int64(value)), opts) } @@ -103,9 +94,6 @@ func GetMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return (*value).Uint64(), nil } -func BootstrapMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUnbondedMinFeeSettingPath), MembersSettingsContractName, MinipoolUnbondedMinFeeSettingPath, big.NewInt(int64(value)), opts) } @@ -125,9 +113,6 @@ func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint6 } return (*value).Uint64(), nil } -func BootstrapChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) -} func ProposeChallengeCooldown(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCooldownSettingPath), MembersSettingsContractName, ChallengeCooldownSettingPath, big.NewInt(int64(value)), opts) } @@ -147,9 +132,6 @@ func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, } return (*value).Uint64(), nil } -func BootstrapChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) -} func ProposeChallengeWindow(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeWindowSettingPath), MembersSettingsContractName, ChallengeWindowSettingPath, big.NewInt(int64(value)), opts) } @@ -169,9 +151,6 @@ func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } return *value, nil } -func BootstrapChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MembersSettingsContractName, ChallengeCostSettingPath, value, opts) -} func ProposeChallengeCost(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeCostSettingPath), MembersSettingsContractName, ChallengeCostSettingPath, value, opts) } diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index ae2822352..ed1a48d32 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -34,9 +34,6 @@ func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } return (*value).Uint64(), nil } -func BootstrapScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) -} func ProposeScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ScrubPeriodPath), MinipoolSettingsContractName, ScrubPeriodPath, big.NewInt(int64(value)), opts) } @@ -56,9 +53,6 @@ func GetPromotionScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } return (*value).Uint64(), nil } -func BootstrapPromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) -} func ProposePromotionScrubPeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", PromotionScrubPeriodPath), MinipoolSettingsContractName, PromotionScrubPeriodPath, big.NewInt(int64(value)), opts) } @@ -78,9 +72,6 @@ func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } return (*value), nil } -func BootstrapScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapBool(rp, MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) -} func ProposeScrubPenaltyEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetBool(rp, fmt.Sprintf("set %s", ScrubPenaltyEnabledPath), MinipoolSettingsContractName, ScrubPenaltyEnabledPath, value, opts) } @@ -100,9 +91,6 @@ func GetBondReductionWindowStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func BootstrapBondReductionWindowStart(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, BondReductionWindowStartPath, big.NewInt(int64(value)), opts) -} func ProposeBondReductionWindowStart(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", BondReductionWindowStartPath), MinipoolSettingsContractName, BondReductionWindowStartPath, big.NewInt(int64(value)), opts) } @@ -122,9 +110,6 @@ func GetBondReductionWindowLength(rp *rocketpool.RocketPool, opts *bind.CallOpts } return (*value).Uint64(), nil } -func BootstrapBondReductionWindowLength(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) -} func ProposeBondReductionWindowLength(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", BondReductionWindowLengthPath), MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 6c4e296b1..2ff83b00c 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -34,9 +34,6 @@ func GetProposalCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } return (*value).Uint64(), nil } -func BootstrapProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeProposalCooldownTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(int64(value)), opts) } @@ -56,9 +53,6 @@ func GetProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } return (*value).Uint64(), nil } -func BootstrapProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeProposalVoteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(int64(value)), opts) } @@ -78,9 +72,6 @@ func GetProposalVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func BootstrapProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeProposalVoteDelayTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(int64(value)), opts) } @@ -100,9 +91,6 @@ func GetProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } return (*value).Uint64(), nil } -func BootstrapProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeProposalExecuteTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(int64(value)), opts) } @@ -122,9 +110,6 @@ func GetProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } return (*value).Uint64(), nil } -func BootstrapProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (common.Hash, error) { - return trustednodedao.BootstrapUint(rp, ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) -} func ProposeProposalActionTime(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", ActionTimeSettingPath), ProposalsSettingsContractName, ActionTimeSettingPath, big.NewInt(int64(value)), opts) } diff --git a/types/dao.go b/types/dao.go index e5d7b370d..e1df2a212 100644 --- a/types/dao.go +++ b/types/dao.go @@ -2,7 +2,9 @@ package types import ( "fmt" + "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/utils/json" ) @@ -30,6 +32,11 @@ const ( ProposalSettingType_Address ) +type VotingTreeNode struct { + Sum *big.Int `abi:"sum" json:"sum"` + Hash common.Hash `abi:"hash" json:"hash"` +} + // String conversion func (s ProposalState) String() string { if int(s) >= len(ProposalStates) { From 68d6abf54f3ff60644513f594fc9040b8f98a082 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Sep 2023 21:58:22 -0400 Subject: [PATCH 643/878] Updated settings/protocol/deposit --- settings/protocol/deposit.go | 90 +++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index d4456d2ad..16f46be17 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -6,13 +6,23 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" ) // Config const ( - DepositSettingsContractName string = "rocketDAOProtocolSettingsDeposit" + DepositSettingsContractName string = "rocketDAOProtocolSettingsDeposit" + DepositEnabledSettingPath string = "deposit.enabled" + AssignDepositsEnabledSettingPath string = "deposit.assign.enabled" + MinimumDepositSettingPath string = "deposit.minimum" + MaximumDepositPoolSizeSettingPath string = "deposit.pool.maximum" + MaximumDepositAssignmentsSettingPath string = "deposit.assign.maximum" + MaximumSocializedDepositAssignmentsSettingPath string = "deposit.assign.socialised.maximum" + DepositFeeSettingPath string = "deposit.fee" ) // Deposits currently enabled @@ -23,10 +33,16 @@ func GetDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, er } value := new(bool) if err := depositSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { - return false, fmt.Errorf("Could not get deposits enabled status: %w", err) + return false, fmt.Errorf("error getting deposits enabled status: %w", err) } return *value, nil } +func ProposeDepositEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", DepositEnabledSettingPath), DepositSettingsContractName, DepositEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", DepositEnabledSettingPath), DepositSettingsContractName, DepositEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Deposit assignments currently enabled func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -36,10 +52,16 @@ func GetAssignDepositsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } value := new(bool) if err := depositSettingsContract.Call(opts, value, "getAssignDepositsEnabled"); err != nil { - return false, fmt.Errorf("Could not get deposit assignments enabled status: %w", err) + return false, fmt.Errorf("error getting deposit assignments enabled status: %w", err) } return *value, nil } +func ProposeAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", AssignDepositsEnabledSettingPath), DepositSettingsContractName, AssignDepositsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeAssignDepositsEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", AssignDepositsEnabledSettingPath), DepositSettingsContractName, AssignDepositsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Minimum deposit amount func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -49,10 +71,16 @@ func GetMinimumDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int } value := new(*big.Int) if err := depositSettingsContract.Call(opts, value, "getMinimumDeposit"); err != nil { - return nil, fmt.Errorf("Could not get minimum deposit amount: %w", err) + return nil, fmt.Errorf("error getting minimum deposit amount: %w", err) } return *value, nil } +func ProposeMinimumDeposit(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumDepositSettingPath), DepositSettingsContractName, MinimumDepositSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeMinimumDepositGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumDepositSettingPath), DepositSettingsContractName, MinimumDepositSettingPath, value, blockNumber, treeNodes, opts) +} // Maximum deposit pool size func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -62,10 +90,16 @@ func GetMaximumDepositPoolSize(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } value := new(*big.Int) if err := depositSettingsContract.Call(opts, value, "getMaximumDepositPoolSize"); err != nil { - return nil, fmt.Errorf("Could not get maximum deposit pool size: %w", err) + return nil, fmt.Errorf("error getting maximum deposit pool size: %w", err) } return *value, nil } +func ProposeMaximumDepositPoolSize(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumDepositPoolSizeSettingPath), DepositSettingsContractName, MaximumDepositPoolSizeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumDepositPoolSizeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumDepositPoolSizeSettingPath), DepositSettingsContractName, MaximumDepositPoolSizeSettingPath, value, blockNumber, treeNodes, opts) +} // Maximum deposit assignments per transaction func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -75,10 +109,54 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } value := new(*big.Int) if err := depositSettingsContract.Call(opts, value, "getMaximumDepositAssignments"); err != nil { - return 0, fmt.Errorf("Could not get maximum deposit assignments: %w", err) + return 0, fmt.Errorf("error getting maximum deposit assignments: %w", err) + } + return (*value).Uint64(), nil +} +func ProposeMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumDepositAssignmentsGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} + +// Maximum socialized deposit assignments per transaction +func GetMaximumSocializedDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + depositSettingsContract, err := getDepositSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getMaximumDepositSocialisedAssignments"); err != nil { + return 0, fmt.Errorf("error getting maximum socialized deposit assignments: %w", err) } return (*value).Uint64(), nil } +func ProposeMaximumSocializedDepositAssignments(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumSocializedDepositAssignmentsGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} + +// Current fee taken from user deposits +func GetDepositFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + depositSettingsContract, err := getDepositSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getDepositFee"); err != nil { + return nil, fmt.Errorf("error getting deposit fee: %w", err) + } + return *value, nil +} +func ProposeDepositFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeDepositFeeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) +} // Get contracts var depositSettingsContractLock sync.Mutex From a87268dc84216678483a6f80bc95225a002e6836 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Sep 2023 22:11:07 -0400 Subject: [PATCH 644/878] Refactored error messages --- auction/auction.go | 48 +++++++++---------- dao/proposal-payload.go | 6 +-- dao/proposals.go | 34 +++++++------- dao/trustednode/actions.go | 8 ++-- dao/trustednode/dao.go | 26 +++++------ dao/trustednode/proposals.go | 36 +++++++------- deposit/deposit.go | 10 ++-- legacy/v1.0.0/minipool/minipool.go | 34 +++++++------- legacy/v1.0.0/rewards/rewards.go | 22 ++++----- legacy/v1.1.0-rc1/rewards/rewards.go | 18 +++---- legacy/v1.1.0/minipool/factory.go | 2 +- legacy/v1.1.0/minipool/queue.go | 26 +++++------ legacy/v1.1.0/network/prices.go | 10 ++-- legacy/v1.1.0/node/deposit.go | 4 +- legacy/v1.1.0/node/staking.go | 26 +++++------ minipool/bond-reducer.go | 16 +++---- minipool/factory.go | 2 +- minipool/minipool-constructor.go | 2 +- minipool/minipool-contract-v2.go | 62 ++++++++++++------------ minipool/minipool-contract-v3.go | 70 ++++++++++++++-------------- minipool/minipool.go | 44 ++++++++--------- minipool/queue.go | 10 ++-- minipool/status.go | 2 +- network/balances.go | 16 +++---- network/fees.go | 6 +-- network/penalties.go | 2 +- network/prices.go | 8 ++-- node/deposit.go | 8 ++-- node/distributor.go | 8 ++-- node/node.go | 48 +++++++++---------- node/staking.go | 26 +++++------ rewards/distributor-mainnet.go | 8 ++-- rewards/rewards.go | 20 ++++---- rocketpool/abi.go | 12 ++--- rocketpool/contract.go | 6 +-- rocketpool/rocketpool.go | 8 ++-- rocketpool/version-interface.go | 6 +-- rocketpool/version-manager.go | 6 +-- settings/protocol/auction.go | 14 +++--- settings/protocol/inflation.go | 4 +- settings/protocol/minipool.go | 22 ++++----- settings/protocol/network.go | 20 ++++---- settings/protocol/node.go | 14 +++--- settings/protocol/rewards.go | 8 ++-- settings/trustednode/members.go | 14 +++--- settings/trustednode/minipool.go | 10 ++-- settings/trustednode/proposals.go | 10 ++-- settings/trustednode/rewards.go | 2 +- storage/address-queue-storage.go | 6 +-- storage/rocket-storage.go | 8 ++-- tests/minipool/contract_test.go | 8 ++-- tests/minipool/minipool_test.go | 2 +- tests/minipool/status_test.go | 2 +- tests/node/staking_test.go | 2 +- tests/rewards/node_test.go | 2 +- tests/rocketpool/rocketpool_test.go | 28 +++++------ tests/testutils/auction/auction.go | 2 +- tests/testutils/minipool/minipool.go | 4 +- tests/testutils/tokens/rpl/rpl.go | 2 +- tokens/reth.go | 12 ++--- tokens/rpl.go | 6 +-- tokens/tokens.go | 12 ++--- 62 files changed, 460 insertions(+), 460 deletions(-) diff --git a/auction/auction.go b/auction/auction.go index 2cdbcd73e..821aae6dc 100644 --- a/auction/auction.go +++ b/auction/auction.go @@ -278,7 +278,7 @@ func GetTotalRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } totalRplBalance := new(*big.Int) if err := rocketAuctionManager.Call(opts, totalRplBalance, "getTotalRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract total RPL balance: %w", err) + return nil, fmt.Errorf("error getting auction contract total RPL balance: %w", err) } return *totalRplBalance, nil } @@ -291,7 +291,7 @@ func GetAllottedRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } allottedRplBalance := new(*big.Int) if err := rocketAuctionManager.Call(opts, allottedRplBalance, "getAllottedRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract allotted RPL balance: %w", err) + return nil, fmt.Errorf("error getting auction contract allotted RPL balance: %w", err) } return *allottedRplBalance, nil } @@ -304,7 +304,7 @@ func GetRemainingRPLBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi } remainingRplBalance := new(*big.Int) if err := rocketAuctionManager.Call(opts, remainingRplBalance, "getRemainingRPLBalance"); err != nil { - return nil, fmt.Errorf("Could not get auction contract remaining RPL balance: %w", err) + return nil, fmt.Errorf("error getting auction contract remaining RPL balance: %w", err) } return *remainingRplBalance, nil } @@ -317,7 +317,7 @@ func GetLotCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) } lotCount := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotCount, "getLotCount"); err != nil { - return 0, fmt.Errorf("Could not get lot count: %w", err) + return 0, fmt.Errorf("error getting lot count: %w", err) } return (*lotCount).Uint64(), nil } @@ -330,7 +330,7 @@ func GetLotExists(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallOpt } lotExists := new(bool) if err := rocketAuctionManager.Call(opts, lotExists, "getLotExists", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d exists status: %w", lotIndex, err) + return false, fmt.Errorf("error getting lot %d exists status: %w", lotIndex, err) } return *lotExists, nil } @@ -341,7 +341,7 @@ func GetLotStartBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Cal } lotStartBlock := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotStartBlock, "getLotStartBlock", big.NewInt(int64(lotIndex))); err != nil { - return 0, fmt.Errorf("Could not get lot %d start block: %w", lotIndex, err) + return 0, fmt.Errorf("error getting lot %d start block: %w", lotIndex, err) } return (*lotStartBlock).Uint64(), nil } @@ -352,7 +352,7 @@ func GetLotEndBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.CallO } lotEndBlock := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotEndBlock, "getLotEndBlock", big.NewInt(int64(lotIndex))); err != nil { - return 0, fmt.Errorf("Could not get lot %d end block: %w", lotIndex, err) + return 0, fmt.Errorf("error getting lot %d end block: %w", lotIndex, err) } return (*lotEndBlock).Uint64(), nil } @@ -363,7 +363,7 @@ func GetLotStartPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Cal } lotStartPrice := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotStartPrice, "getLotStartPrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d start price: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d start price: %w", lotIndex, err) } return *lotStartPrice, nil } @@ -374,7 +374,7 @@ func GetLotReservePrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C } lotReservePrice := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotReservePrice, "getLotReservePrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d reserve price: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d reserve price: %w", lotIndex, err) } return *lotReservePrice, nil } @@ -385,7 +385,7 @@ func GetLotTotalRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind } lotTotalRplAmount := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotTotalRplAmount, "getLotTotalRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d total RPL amount: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d total RPL amount: %w", lotIndex, err) } return *lotTotalRplAmount, nil } @@ -396,7 +396,7 @@ func GetLotTotalBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind } lotTotalBidAmount := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotTotalBidAmount, "getLotTotalBidAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d total ETH bid amount: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d total ETH bid amount: %w", lotIndex, err) } return *lotTotalBidAmount, nil } @@ -407,7 +407,7 @@ func GetLotRPLRecovered(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C } lotRplRecovered := new(bool) if err := rocketAuctionManager.Call(opts, lotRplRecovered, "getLotRPLRecovered", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d RPL recovered status: %w", lotIndex, err) + return false, fmt.Errorf("error getting lot %d RPL recovered status: %w", lotIndex, err) } return *lotRplRecovered, nil } @@ -418,7 +418,7 @@ func GetLotPriceAtCurrentBlock(rp *rocketpool.RocketPool, lotIndex uint64, opts } lotPriceAtCurrentBlock := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotPriceAtCurrentBlock, "getLotPriceAtCurrentBlock", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price by current block: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d price by current block: %w", lotIndex, err) } return *lotPriceAtCurrentBlock, nil } @@ -429,7 +429,7 @@ func GetLotPriceByTotalBids(rp *rocketpool.RocketPool, lotIndex uint64, opts *bi } lotPriceByTotalBids := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotPriceByTotalBids, "getLotPriceByTotalBids", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price by total bids: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d price by total bids: %w", lotIndex, err) } return *lotPriceByTotalBids, nil } @@ -440,7 +440,7 @@ func GetLotCurrentPrice(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.C } lotCurrentPrice := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotCurrentPrice, "getLotCurrentPrice", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d current price: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d current price: %w", lotIndex, err) } return *lotCurrentPrice, nil } @@ -451,7 +451,7 @@ func GetLotClaimedRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts *bi } lotClaimedRplAmount := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotClaimedRplAmount, "getLotClaimedRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d claimed RPL amount: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d claimed RPL amount: %w", lotIndex, err) } return *lotClaimedRplAmount, nil } @@ -462,7 +462,7 @@ func GetLotRemainingRPLAmount(rp *rocketpool.RocketPool, lotIndex uint64, opts * } lotRemainingRplAmount := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotRemainingRplAmount, "getLotRemainingRPLAmount", big.NewInt(int64(lotIndex))); err != nil { - return nil, fmt.Errorf("Could not get lot %d remaining RPL amount: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d remaining RPL amount: %w", lotIndex, err) } return *lotRemainingRplAmount, nil } @@ -473,7 +473,7 @@ func GetLotIsCleared(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.Call } lotIsCleared := new(bool) if err := rocketAuctionManager.Call(opts, lotIsCleared, "getLotIsCleared", big.NewInt(int64(lotIndex))); err != nil { - return false, fmt.Errorf("Could not get lot %d cleared status: %w", lotIndex, err) + return false, fmt.Errorf("error getting lot %d cleared status: %w", lotIndex, err) } return *lotIsCleared, nil } @@ -486,7 +486,7 @@ func GetLotPriceAtBlock(rp *rocketpool.RocketPool, lotIndex, blockNumber uint64, } lotPriceAtBlock := new(*big.Int) if err := rocketAuctionManager.Call(opts, lotPriceAtBlock, "getLotPriceAtBlock", big.NewInt(int64(lotIndex)), big.NewInt(int64(blockNumber))); err != nil { - return nil, fmt.Errorf("Could not get lot %d price at block: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d price at block: %w", lotIndex, err) } return *lotPriceAtBlock, nil } @@ -499,7 +499,7 @@ func GetLotAddressBidAmount(rp *rocketpool.RocketPool, lotIndex uint64, bidder c } lot := new(*big.Int) if err := rocketAuctionManager.Call(opts, lot, "getLotAddressBidAmount", big.NewInt(int64(lotIndex)), bidder); err != nil { - return nil, fmt.Errorf("Could not get lot %d address ETH bid amount: %w", lotIndex, err) + return nil, fmt.Errorf("error getting lot %d address ETH bid amount: %w", lotIndex, err) } return *lot, nil } @@ -525,7 +525,7 @@ func CreateLot(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (uint64, comm } tx, err := rocketAuctionManager.Transact(opts, "createLot") if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not create lot: %w", err) + return 0, common.Hash{}, fmt.Errorf("error creating lot: %w", err) } return lotCount, tx.Hash(), nil } @@ -547,7 +547,7 @@ func PlaceBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt } tx, err := rocketAuctionManager.Transact(opts, "placeBid", big.NewInt(int64(lotIndex))) if err != nil { - return common.Hash{}, fmt.Errorf("Could not place bid on lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("error placing bid on lot %d: %w", lotIndex, err) } return tx.Hash(), nil } @@ -569,7 +569,7 @@ func ClaimBid(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind.TransactOpt } tx, err := rocketAuctionManager.Transact(opts, "claimBid", big.NewInt(int64(lotIndex))) if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim bid from lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("error claiming bid from lot %d: %w", lotIndex, err) } return tx.Hash(), nil } @@ -591,7 +591,7 @@ func RecoverUnclaimedRPL(rp *rocketpool.RocketPool, lotIndex uint64, opts *bind. } tx, err := rocketAuctionManager.Transact(opts, "recoverUnclaimedRPL", big.NewInt(int64(lotIndex))) if err != nil { - return common.Hash{}, fmt.Errorf("Could not recover unclaimed RPL from lot %d: %w", lotIndex, err) + return common.Hash{}, fmt.Errorf("error recovering unclaimed RPL from lot %d: %w", lotIndex, err) } return tx.Hash(), nil } diff --git a/dao/proposal-payload.go b/dao/proposal-payload.go index 3504dc825..aeb201e73 100644 --- a/dao/proposal-payload.go +++ b/dao/proposal-payload.go @@ -26,19 +26,19 @@ func GetProposalPayloadString(rp *rocketpool.RocketPool, daoName string, payload // Get proposal DAO contract ABI daoContractAbi, err := rp.GetABI(daoName, opts) if err != nil { - return "", fmt.Errorf("Could not get '%s' DAO contract ABI: %w", daoName, err) + return "", fmt.Errorf("error getting '%s' DAO contract ABI: %w", daoName, err) } // Get proposal payload method method, err := daoContractAbi.MethodById(payload) if err != nil { - return "", fmt.Errorf("Could not get proposal payload method: %w", err) + return "", fmt.Errorf("error getting proposal payload method: %w", err) } // Get proposal payload argument values args, err := method.Inputs.UnpackValues(payload[4:]) if err != nil { - return "", fmt.Errorf("Could not get proposal payload arguments: %w", err) + return "", fmt.Errorf("error getting proposal payload arguments: %w", err) } // Format argument values as strings diff --git a/dao/proposals.go b/dao/proposals.go index b0fc7fcd8..3245beb09 100644 --- a/dao/proposals.go +++ b/dao/proposals.go @@ -435,7 +435,7 @@ func GetProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } proposalCount := new(*big.Int) if err := rocketDAOProposal.Call(opts, proposalCount, "getTotal"); err != nil { - return 0, fmt.Errorf("Could not get proposal count: %w", err) + return 0, fmt.Errorf("error getting proposal count: %w", err) } return (*proposalCount).Uint64(), nil } @@ -448,7 +448,7 @@ func GetProposalDAO(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Cal } daoName := new(string) if err := rocketDAOProposal.Call(opts, daoName, "getDAO", big.NewInt(int64(proposalId))); err != nil { - return "", fmt.Errorf("Could not get proposal %d DAO: %w", proposalId, err) + return "", fmt.Errorf("error getting proposal %d DAO: %w", proposalId, err) } return strings.Sanitize(*daoName), nil } @@ -459,7 +459,7 @@ func GetProposalProposerAddress(rp *rocketpool.RocketPool, proposalId uint64, op } proposerAddress := new(common.Address) if err := rocketDAOProposal.Call(opts, proposerAddress, "getProposer", big.NewInt(int64(proposalId))); err != nil { - return common.Address{}, fmt.Errorf("Could not get proposal %d proposer address: %w", proposalId, err) + return common.Address{}, fmt.Errorf("error getting proposal %d proposer address: %w", proposalId, err) } return *proposerAddress, nil } @@ -470,7 +470,7 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } message := new(string) if err := rocketDAOProposal.Call(opts, message, "getMessage", big.NewInt(int64(proposalId))); err != nil { - return "", fmt.Errorf("Could not get proposal %d message: %w", proposalId, err) + return "", fmt.Errorf("error getting proposal %d message: %w", proposalId, err) } return strings.Sanitize(*message), nil } @@ -481,7 +481,7 @@ func GetProposalCreatedTime(rp *rocketpool.RocketPool, proposalId uint64, opts * } createdTime := new(*big.Int) if err := rocketDAOProposal.Call(opts, createdTime, "getCreated", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d created time: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d created time: %w", proposalId, err) } return (*createdTime).Uint64(), nil } @@ -492,7 +492,7 @@ func GetProposalStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bi } startTime := new(*big.Int) if err := rocketDAOProposal.Call(opts, startTime, "getStart", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d start time: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d start time: %w", proposalId, err) } return (*startTime).Uint64(), nil } @@ -503,7 +503,7 @@ func GetProposalEndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } endTime := new(*big.Int) if err := rocketDAOProposal.Call(opts, endTime, "getEnd", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d end time: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d end time: %w", proposalId, err) } return (*endTime).Uint64(), nil } @@ -514,7 +514,7 @@ func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *b } expiryTime := new(*big.Int) if err := rocketDAOProposal.Call(opts, expiryTime, "getExpires", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d expiry time: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d expiry time: %w", proposalId, err) } return (*expiryTime).Uint64(), nil } @@ -525,7 +525,7 @@ func GetProposalVotesRequired(rp *rocketpool.RocketPool, proposalId uint64, opts } votesRequired := new(*big.Int) if err := rocketDAOProposal.Call(opts, votesRequired, "getVotesRequired", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes required: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d votes required: %w", proposalId, err) } return eth.WeiToEth(*votesRequired), nil } @@ -536,7 +536,7 @@ func GetProposalVotesFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bin } votesFor := new(*big.Int) if err := rocketDAOProposal.Call(opts, votesFor, "getVotesFor", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes for: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d votes for: %w", proposalId, err) } return eth.WeiToEth(*votesFor), nil } @@ -547,7 +547,7 @@ func GetProposalVotesAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts } votesAgainst := new(*big.Int) if err := rocketDAOProposal.Call(opts, votesAgainst, "getVotesAgainst", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d votes against: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d votes against: %w", proposalId, err) } return eth.WeiToEth(*votesAgainst), nil } @@ -558,7 +558,7 @@ func GetProposalIsCancelled(rp *rocketpool.RocketPool, proposalId uint64, opts * } cancelled := new(bool) if err := rocketDAOProposal.Call(opts, cancelled, "getCancelled", big.NewInt(int64(proposalId))); err != nil { - return false, fmt.Errorf("Could not get proposal %d cancelled status: %w", proposalId, err) + return false, fmt.Errorf("error getting proposal %d cancelled status: %w", proposalId, err) } return *cancelled, nil } @@ -569,7 +569,7 @@ func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *b } executed := new(bool) if err := rocketDAOProposal.Call(opts, executed, "getExecuted", big.NewInt(int64(proposalId))); err != nil { - return false, fmt.Errorf("Could not get proposal %d executed status: %w", proposalId, err) + return false, fmt.Errorf("error getting proposal %d executed status: %w", proposalId, err) } return *executed, nil } @@ -580,7 +580,7 @@ func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } payload := new([]byte) if err := rocketDAOProposal.Call(opts, payload, "getPayload", big.NewInt(int64(proposalId))); err != nil { - return []byte{}, fmt.Errorf("Could not get proposal %d payload: %w", proposalId, err) + return []byte{}, fmt.Errorf("error getting proposal %d payload: %w", proposalId, err) } return *payload, nil } @@ -606,7 +606,7 @@ func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C } state := new(uint8) if err := rocketDAOProposal.Call(opts, state, "getState", big.NewInt(int64(proposalId))); err != nil { - return 0, fmt.Errorf("Could not get proposal %d state: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal %d state: %w", proposalId, err) } return rptypes.ProposalState(*state), nil } @@ -619,7 +619,7 @@ func GetProposalMemberVoted(rp *rocketpool.RocketPool, proposalId uint64, member } voted := new(bool) if err := rocketDAOProposal.Call(opts, voted, "getReceiptHasVoted", big.NewInt(int64(proposalId)), memberAddress); err != nil { - return false, fmt.Errorf("Could not get proposal %d member %s voted status: %w", proposalId, memberAddress.Hex(), err) + return false, fmt.Errorf("error getting proposal %d member %s voted status: %w", proposalId, memberAddress.Hex(), err) } return *voted, nil } @@ -632,7 +632,7 @@ func GetProposalMemberSupported(rp *rocketpool.RocketPool, proposalId uint64, me } supported := new(bool) if err := rocketDAOProposal.Call(opts, supported, "getReceiptSupported", big.NewInt(int64(proposalId)), memberAddress); err != nil { - return false, fmt.Errorf("Could not get proposal %d member %s supported status: %w", proposalId, memberAddress.Hex(), err) + return false, fmt.Errorf("error getting proposal %d member %s supported status: %w", proposalId, memberAddress.Hex(), err) } return *supported, nil } diff --git a/dao/trustednode/actions.go b/dao/trustednode/actions.go index f07f042a5..90924c266 100644 --- a/dao/trustednode/actions.go +++ b/dao/trustednode/actions.go @@ -30,7 +30,7 @@ func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, erro } tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionJoin") if err != nil { - return common.Hash{}, fmt.Errorf("Could not join the trusted node DAO: %w", err) + return common.Hash{}, fmt.Errorf("error joining the trusted node DAO: %w", err) } return tx.Hash(), nil } @@ -53,7 +53,7 @@ func Leave(rp *rocketpool.RocketPool, rplBondRefundAddress common.Address, opts } tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionLeave", rplBondRefundAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not leave the trusted node DAO: %w", err) + return common.Hash{}, fmt.Errorf("error leaving the trusted node DAO: %w", err) } return tx.Hash(), nil } @@ -75,7 +75,7 @@ func MakeChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, opts } tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeMake", memberAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not challenge trusted node DAO member %s: %w", memberAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("error challenging trusted node DAO member %s: %w", memberAddress.Hex(), err) } return tx.Hash(), nil } @@ -97,7 +97,7 @@ func DecideChallenge(rp *rocketpool.RocketPool, memberAddress common.Address, op } tx, err := rocketDAONodeTrustedActions.Transact(opts, "actionChallengeDecide", memberAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not decide the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("error deciding the challenge against trusted node DAO member %s: %w", memberAddress.Hex(), err) } return tx.Hash(), nil } diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 6876791fe..4abb5d521 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -195,7 +195,7 @@ func GetMinimumMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } minMemberCount := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, minMemberCount, "getMemberMinRequired"); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO minimum member count: %w", err) + return 0, fmt.Errorf("error getting trusted node DAO minimum member count: %w", err) } return (*minMemberCount).Uint64(), nil } @@ -208,7 +208,7 @@ func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } memberCount := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, memberCount, "getMemberCount"); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member count: %w", err) + return 0, fmt.Errorf("error getting trusted node DAO member count: %w", err) } return (*memberCount).Uint64(), nil } @@ -221,7 +221,7 @@ func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) ( } memberAddress := new(common.Address) if err := rocketDAONodeTrusted.Call(opts, memberAddress, "getMemberAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %d address: %w", index, err) + return common.Address{}, fmt.Errorf("error getting trusted node DAO member %d address: %w", index, err) } return *memberAddress, nil } @@ -234,7 +234,7 @@ func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, op } exists := new(bool) if err := rocketDAONodeTrusted.Call(opts, exists, "getMemberIsValid", memberAddress); err != nil { - return false, fmt.Errorf("Could not get trusted node DAO member %s exists status: %w", memberAddress.Hex(), err) + return false, fmt.Errorf("error getting trusted node DAO member %s exists status: %w", memberAddress.Hex(), err) } return *exists, nil } @@ -245,7 +245,7 @@ func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts * } id := new(string) if err := rocketDAONodeTrusted.Call(opts, id, "getMemberID", memberAddress); err != nil { - return "", fmt.Errorf("Could not get trusted node DAO member %s ID: %w", memberAddress.Hex(), err) + return "", fmt.Errorf("error getting trusted node DAO member %s ID: %w", memberAddress.Hex(), err) } return strings.Sanitize(*id), nil } @@ -256,7 +256,7 @@ func GetMemberUrl(rp *rocketpool.RocketPool, memberAddress common.Address, opts } url := new(string) if err := rocketDAONodeTrusted.Call(opts, url, "getMemberUrl", memberAddress); err != nil { - return "", fmt.Errorf("Could not get trusted node DAO member %s URL: %w", memberAddress.Hex(), err) + return "", fmt.Errorf("error getting trusted node DAO member %s URL: %w", memberAddress.Hex(), err) } return strings.Sanitize(*url), nil } @@ -267,7 +267,7 @@ func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address } joinedTime := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, joinedTime, "getMemberJoinedTime", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s joined time: %w", memberAddress.Hex(), err) + return 0, fmt.Errorf("error getting trusted node DAO member %s joined time: %w", memberAddress.Hex(), err) } return (*joinedTime).Uint64(), nil } @@ -278,7 +278,7 @@ func GetMemberLastProposalTime(rp *rocketpool.RocketPool, memberAddress common.A } lastProposalTime := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, lastProposalTime, "getMemberLastProposalTime", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s last proposal time: %w", memberAddress.Hex(), err) + return 0, fmt.Errorf("error getting trusted node DAO member %s last proposal time: %w", memberAddress.Hex(), err) } return (*lastProposalTime).Uint64(), nil } @@ -289,7 +289,7 @@ func GetMemberRPLBondAmount(rp *rocketpool.RocketPool, memberAddress common.Addr } rplBondAmount := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, rplBondAmount, "getMemberRPLBondAmount", memberAddress); err != nil { - return nil, fmt.Errorf("Could not get trusted node DAO member %s RPL bond amount: %w", memberAddress.Hex(), err) + return nil, fmt.Errorf("error getting trusted node DAO member %s RPL bond amount: %w", memberAddress.Hex(), err) } return *rplBondAmount, nil } @@ -300,7 +300,7 @@ func GetMemberUnbondedValidatorCount(rp *rocketpool.RocketPool, memberAddress co } unbondedValidatorCount := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, unbondedValidatorCount, "getMemberUnbondedValidatorCount", memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO member %s unbonded validator count: %w", memberAddress.Hex(), err) + return 0, fmt.Errorf("error getting trusted node DAO member %s unbonded validator count: %w", memberAddress.Hex(), err) } return (*unbondedValidatorCount).Uint64(), nil } @@ -322,7 +322,7 @@ func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType strin } proposalExecutedTime := new(*big.Int) if err := rocketDAONodeTrusted.Call(opts, proposalExecutedTime, "getMemberProposalExecutedTime", proposalType, memberAddress); err != nil { - return 0, fmt.Errorf("Could not get trusted node DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) + return 0, fmt.Errorf("error getting trusted node DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) } return (*proposalExecutedTime).Uint64(), nil } @@ -335,7 +335,7 @@ func GetMemberReplacementAddress(rp *rocketpool.RocketPool, memberAddress common } replacementAddress := new(common.Address) if err := rocketDAONodeTrusted.Call(opts, replacementAddress, "getMemberReplacedAddress", "new", memberAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get trusted node DAO member %s replacement address: %w", memberAddress.Hex(), err) + return common.Address{}, fmt.Errorf("error getting trusted node DAO member %s replacement address: %w", memberAddress.Hex(), err) } return *replacementAddress, nil } @@ -348,7 +348,7 @@ func GetMemberIsChallenged(rp *rocketpool.RocketPool, memberAddress common.Addre } isChallenged := new(bool) if err := rocketDAONodeTrusted.Call(opts, isChallenged, "getMemberIsChallenged", memberAddress); err != nil { - return false, fmt.Errorf("Could not get trusted node DAO member %s is challenged status: %w", memberAddress.Hex(), err) + return false, fmt.Errorf("error getting trusted node DAO member %s is challenged status: %w", memberAddress.Hex(), err) } return *isChallenged, nil } diff --git a/dao/trustednode/proposals.go b/dao/trustednode/proposals.go index 45dd54fc5..53d3e0904 100644 --- a/dao/trustednode/proposals.go +++ b/dao/trustednode/proposals.go @@ -22,7 +22,7 @@ func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, n newMemberUrl = strings.Sanitize(newMemberUrl) payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -36,7 +36,7 @@ func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberAdd newMemberUrl = strings.Sanitize(newMemberUrl) payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalInvite", newMemberId, newMemberUrl, newMemberAddress) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode invite member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -49,7 +49,7 @@ func EstimateProposeMemberLeaveGas(rp *rocketpool.RocketPool, message string, me } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding member leave proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -62,7 +62,7 @@ func ProposeMemberLeave(rp *rocketpool.RocketPool, message string, memberAddress } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalLeave", memberAddress) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode member leave proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding member leave proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -76,7 +76,7 @@ func EstimateProposeReplaceMemberGas(rp *rocketpool.RocketPool, message string, newMemberUrl = strings.Sanitize(newMemberUrl) payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding replace member proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -90,7 +90,7 @@ func ProposeReplaceMember(rp *rocketpool.RocketPool, message string, memberAddre newMemberUrl = strings.Sanitize(newMemberUrl) payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalReplace", memberAddress, newMemberId, newMemberUrl, newMemberAddress) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode replace member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding replace member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -103,7 +103,7 @@ func EstimateProposeKickMemberGas(rp *rocketpool.RocketPool, message string, mem } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding kick member proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -116,7 +116,7 @@ func ProposeKickMember(rp *rocketpool.RocketPool, message string, memberAddress } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalKick", memberAddress, rplFineAmount) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode kick member proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding kick member proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -129,7 +129,7 @@ func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set bool setting proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -142,7 +142,7 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode set bool setting proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding set bool setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -155,7 +155,7 @@ func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -168,7 +168,7 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode set uint setting proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -185,7 +185,7 @@ func EstimateProposeUpgradeContractGas(rp *rocketpool.RocketPool, message, upgra } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding upgrade contract proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, opts) } @@ -202,7 +202,7 @@ func ProposeUpgradeContract(rp *rocketpool.RocketPool, message, upgradeType, con } payload, err := rocketDAONodeTrustedProposals.ABI.Pack("proposalUpgrade", upgradeType, contractName, compressedAbi, contractAddress) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not encode upgrade contract proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding upgrade contract proposal payload: %w", err) } return SubmitProposal(rp, message, payload, opts) } @@ -229,7 +229,7 @@ func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, o } tx, err := rocketDAONodeTrustedProposals.Transact(opts, "propose", message, payload) if err != nil { - return 0, common.Hash{}, fmt.Errorf("Could not submit trusted node DAO proposal: %w", err) + return 0, common.Hash{}, fmt.Errorf("error submitting trusted node DAO proposal: %w", err) } return proposalCount + 1, tx.Hash(), nil } @@ -251,7 +251,7 @@ func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tra } tx, err := rocketDAONodeTrustedProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) if err != nil { - return common.Hash{}, fmt.Errorf("Could not cancel trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("error cancelling trusted node DAO proposal %d: %w", proposalId, err) } return tx.Hash(), nil } @@ -273,7 +273,7 @@ func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, } tx, err := rocketDAONodeTrustedProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote on trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("error voting on trusted node DAO proposal %d: %w", proposalId, err) } return tx.Hash(), nil } @@ -295,7 +295,7 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr } tx, err := rocketDAONodeTrustedProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) if err != nil { - return common.Hash{}, fmt.Errorf("Could not execute trusted node DAO proposal %d: %w", proposalId, err) + return common.Hash{}, fmt.Errorf("error executing trusted node DAO proposal %d: %w", proposalId, err) } return tx.Hash(), nil } diff --git a/deposit/deposit.go b/deposit/deposit.go index bb8a99191..83e88467c 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -19,7 +19,7 @@ func GetBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error } balance := new(*big.Int) if err := rocketDepositPool.Call(opts, balance, "getBalance"); err != nil { - return nil, fmt.Errorf("Could not get deposit pool balance: %w", err) + return nil, fmt.Errorf("error getting deposit pool balance: %w", err) } return *balance, nil } @@ -32,7 +32,7 @@ func GetUserBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, e } balance := new(*big.Int) if err := rocketDepositPool.Call(opts, balance, "getUserBalance"); err != nil { - return nil, fmt.Errorf("Could not get deposit pool user balance: %w", err) + return nil, fmt.Errorf("error getting deposit pool user balance: %w", err) } return *balance, nil } @@ -45,7 +45,7 @@ func GetExcessBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } excessBalance := new(*big.Int) if err := rocketDepositPool.Call(opts, excessBalance, "getExcessBalance"); err != nil { - return nil, fmt.Errorf("Could not get deposit pool excess balance: %w", err) + return nil, fmt.Errorf("error getting deposit pool excess balance: %w", err) } return *excessBalance, nil } @@ -67,7 +67,7 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, e } tx, err := rocketDepositPool.Transact(opts, "deposit") if err != nil { - return common.Hash{}, fmt.Errorf("Could not deposit: %w", err) + return common.Hash{}, fmt.Errorf("error depositing: %w", err) } return tx.Hash(), nil } @@ -89,7 +89,7 @@ func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common. } tx, err := rocketDepositPool.Transact(opts, "assignDeposits") if err != nil { - return common.Hash{}, fmt.Errorf("Could not assign deposits: %w", err) + return common.Hash{}, fmt.Errorf("error assigning deposits: %w", err) } return tx.Hash(), nil } diff --git a/legacy/v1.0.0/minipool/minipool.go b/legacy/v1.0.0/minipool/minipool.go index 68bdbf269..cb7acc3bb 100644 --- a/legacy/v1.0.0/minipool/minipool.go +++ b/legacy/v1.0.0/minipool/minipool.go @@ -157,7 +157,7 @@ func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpt offset := big.NewInt(i) newAddresses := new([]common.Address) if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { - return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + return []common.Address{}, fmt.Errorf("error getting prelaunch minipool addresses: %w", err) } addresses = append(addresses, *newAddresses...) } @@ -301,7 +301,7 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRock } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get minipool count: %w", err) + return 0, fmt.Errorf("error getting minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -314,7 +314,7 @@ func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, l } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + return 0, fmt.Errorf("error getting finalised minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -327,7 +327,7 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts, lega } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + return 0, fmt.Errorf("error getting finalised minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -359,7 +359,7 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts, l offset := big.NewInt(i) newMinipoolCounts := new(MinipoolCountsPerStatus) if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { - return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + return MinipoolCountsPerStatus{}, fmt.Errorf("error getting minipool counts: %w", err) } if newMinipoolCounts != nil { if newMinipoolCounts.Initialized != nil { @@ -390,7 +390,7 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts, } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + return common.Address{}, fmt.Errorf("error getting minipool %d address: %w", index, err) } return *minipoolAddress, nil } @@ -403,7 +403,7 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -416,7 +416,7 @@ func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Ad } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -429,7 +429,7 @@ func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -442,7 +442,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("error getting node %s minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } @@ -455,7 +455,7 @@ func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress commo } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s validating minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -468,7 +468,7 @@ func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.A } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("error getting node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } @@ -481,7 +481,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { - return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) + return common.Address{}, fmt.Errorf("error getting validator %s minipool address: %w", pubkey.Hex(), err) } return *minipoolAddress, nil } @@ -494,7 +494,7 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address } exists := new(bool) if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("error getting minipool %s exists status: %w", minipoolAddress.Hex(), err) } return *exists, nil } @@ -507,7 +507,7 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } pubkey := new(rptypes.ValidatorPubkey) if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { - return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) + return rptypes.ValidatorPubkey{}, fmt.Errorf("error getting minipool %s pubkey: %w", minipoolAddress.Hex(), err) } return *pubkey, nil } @@ -520,7 +520,7 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyR } bytecode := new([]byte) if err := rocketMinipoolManager.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + return []byte{}, fmt.Errorf("error getting minipool contract bytecode: %w", err) } return *bytecode, nil } @@ -533,7 +533,7 @@ func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress } withdrawalCredentials := new(common.Hash) if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { - return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) + return common.Hash{}, fmt.Errorf("error getting minipool withdrawal credentials: %w", err) } return *withdrawalCredentials, nil } diff --git a/legacy/v1.0.0/rewards/rewards.go b/legacy/v1.0.0/rewards/rewards.go index a02856346..f25d1d5b0 100644 --- a/legacy/v1.0.0/rewards/rewards.go +++ b/legacy/v1.0.0/rewards/rewards.go @@ -17,7 +17,7 @@ import ( func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bind.CallOpts) (bool, error) { enabled := new(bool) if err := claimsContract.Call(opts, enabled, "getEnabled"); err != nil { - return false, fmt.Errorf("Could not get %s claims contract enabled status: %w", claimsName, err) + return false, fmt.Errorf("error getting %s claims contract enabled status: %w", claimsName, err) } return *enabled, nil } @@ -27,7 +27,7 @@ func getEnabled(claimsContract *rocketpool.Contract, claimsName string, opts *bi func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) { claimPossible := new(bool) if err := claimsContract.Call(opts, claimPossible, "getClaimPossible", claimerAddress); err != nil { - return false, fmt.Errorf("Could not get %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) + return false, fmt.Errorf("error getting %s claim possible status for %s: %w", claimsName, claimerAddress.Hex(), err) } return *claimPossible, nil } @@ -36,7 +36,7 @@ func getClaimPossible(claimsContract *rocketpool.Contract, claimsName string, cl func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (float64, error) { claimRewardsPerc := new(*big.Int) if err := claimsContract.Call(opts, claimRewardsPerc, "getClaimRewardsPerc", claimerAddress); err != nil { - return 0, fmt.Errorf("Could not get %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) + return 0, fmt.Errorf("error getting %s claim rewards percent for %s: %w", claimsName, claimerAddress.Hex(), err) } return eth.WeiToEth(*claimRewardsPerc), nil } @@ -46,7 +46,7 @@ func getClaimRewardsPerc(claimsContract *rocketpool.Contract, claimsName string, func getClaimRewardsAmount(claimsContract *rocketpool.Contract, claimsName string, claimerAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { claimRewardsAmount := new(*big.Int) if err := claimsContract.Call(opts, claimRewardsAmount, "getClaimRewardsAmount", claimerAddress); err != nil { - return nil, fmt.Errorf("Could not get %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) + return nil, fmt.Errorf("error getting %s claim rewards amount for %s: %w", claimsName, claimerAddress.Hex(), err) } return *claimRewardsAmount, nil } @@ -59,7 +59,7 @@ func getClaimingContractUserRegisteredTime(rp *rocketpool.RocketPool, claimsCont } claimTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, claimTime, "getClaimingContractUserRegisteredTime", claimsContract, claimerAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) + return time.Time{}, fmt.Errorf("error getting claims registration time on contract %s for %s: %w", claimsContract, claimerAddress.Hex(), err) } return time.Unix((*claimTime).Int64(), 0), nil } @@ -72,7 +72,7 @@ func getClaimingContractTotalClaimed(rp *rocketpool.RocketPool, claimsContract s } totalClaimed := new(*big.Int) if err := rocketRewardsPool.Call(opts, totalClaimed, "getClaimingContractTotalClaimed", claimsContract); err != nil { - return nil, fmt.Errorf("Could not get total claimed for %s: %w", claimsContract, err) + return nil, fmt.Errorf("error getting total claimed for %s: %w", claimsContract, err) } return *totalClaimed, nil } @@ -86,7 +86,7 @@ func estimateClaimGas(claimsContract *rocketpool.Contract, opts *bind.TransactOp func claim(claimsContract *rocketpool.Contract, claimsName string, opts *bind.TransactOpts) (common.Hash, error) { tx, err := claimsContract.Transact(opts, "claim") if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim %s rewards: %w", claimsName, err) + return common.Hash{}, fmt.Errorf("error claiming %s rewards: %w", claimsName, err) } return tx.Hash(), nil } @@ -99,7 +99,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, l } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { - return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + return time.Time{}, fmt.Errorf("error getting claim interval time start: %w", err) } return time.Unix((*unixTime).Int64(), 0), nil } @@ -112,7 +112,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get claim interval time: %w", err) + return 0, fmt.Errorf("error getting claim interval time: %w", err) } return time.Duration((*unixTime).Int64()) * time.Second, nil } @@ -125,7 +125,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return 0, fmt.Errorf("Could not get node operator rewards percent: %w", err) + return 0, fmt.Errorf("error getting node operator rewards percent: %w", err) } return eth.WeiToEth(*perc), nil } @@ -138,7 +138,7 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return 0, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + return 0, fmt.Errorf("error getting trusted node operator rewards percent: %w", err) } return eth.WeiToEth(*perc), nil } diff --git a/legacy/v1.1.0-rc1/rewards/rewards.go b/legacy/v1.1.0-rc1/rewards/rewards.go index 170e925da..9f1f9b993 100644 --- a/legacy/v1.1.0-rc1/rewards/rewards.go +++ b/legacy/v1.1.0-rc1/rewards/rewards.go @@ -53,7 +53,7 @@ func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocket } index := new(*big.Int) if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { - return nil, fmt.Errorf("Could not get current reward index: %w", err) + return nil, fmt.Errorf("error getting current reward index: %w", err) } return *index, nil } @@ -66,7 +66,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts, l } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { - return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + return time.Time{}, fmt.Errorf("error getting claim interval time start: %w", err) } return time.Unix((*unixTime).Int64(), 0), nil } @@ -79,7 +79,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get claim interval time: %w", err) + return 0, fmt.Errorf("error getting claim interval time: %w", err) } return time.Duration((*unixTime).Int64()) * time.Second, nil } @@ -92,7 +92,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) + return nil, fmt.Errorf("error getting node operator rewards percent: %w", err) } return *perc, nil } @@ -105,7 +105,7 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + return nil, fmt.Errorf("error getting trusted node operator rewards percent: %w", err) } return *perc, nil } @@ -118,7 +118,7 @@ func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { - return nil, fmt.Errorf("Could not get protocol DAO rewards percent: %w", err) + return nil, fmt.Errorf("error getting protocol DAO rewards percent: %w", err) } return *perc, nil } @@ -131,7 +131,7 @@ func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } rewards := new(*big.Int) if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { - return nil, fmt.Errorf("Could not get pending RPL rewards: %w", err) + return nil, fmt.Errorf("error getting pending RPL rewards: %w", err) } return *rewards, nil } @@ -144,7 +144,7 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } rewards := new(*big.Int) if err := rocketRewardsPool.Call(opts, rewards, "getPendingETHRewards"); err != nil { - return nil, fmt.Errorf("Could not get pending ETH rewards: %w", err) + return nil, fmt.Errorf("error getting pending ETH rewards: %w", err) } return *rewards, nil } @@ -166,7 +166,7 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } tx, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) + return common.Hash{}, fmt.Errorf("error submitting rewards snapshot: %w", err) } return tx.Hash(), nil } diff --git a/legacy/v1.1.0/minipool/factory.go b/legacy/v1.1.0/minipool/factory.go index 5f6947a24..32c31fb7f 100644 --- a/legacy/v1.1.0/minipool/factory.go +++ b/legacy/v1.1.0/minipool/factory.go @@ -18,7 +18,7 @@ func GetMinipoolBytecode(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyR } bytecode := new([]byte) if err := rocketMinipoolFactory.Call(opts, bytecode, "getMinipoolBytecode"); err != nil { - return []byte{}, fmt.Errorf("Could not get minipool contract bytecode: %w", err) + return []byte{}, fmt.Errorf("error getting minipool contract bytecode: %w", err) } return *bytecode, nil } diff --git a/legacy/v1.1.0/minipool/queue.go b/legacy/v1.1.0/minipool/queue.go index 5129e53e1..3ba0605df 100644 --- a/legacy/v1.1.0/minipool/queue.go +++ b/legacy/v1.1.0/minipool/queue.go @@ -131,7 +131,7 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyR } length := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { - return 0, fmt.Errorf("Could not get minipool queue total length: %w", err) + return 0, fmt.Errorf("error getting minipool queue total length: %w", err) } return (*length).Uint64(), nil } @@ -144,7 +144,7 @@ func GetQueueLength(rp *rocketpool.RocketPool, depositType rptypes.MinipoolDepos } length := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, length, "getLength", depositType); err != nil { - return 0, fmt.Errorf("Could not get minipool queue length for deposit type %d: %w", depositType, err) + return 0, fmt.Errorf("error getting minipool queue length for deposit type %d: %w", depositType, err) } return (*length).Uint64(), nil } @@ -157,7 +157,7 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legac } capacity := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + return nil, fmt.Errorf("error getting minipool queue total capacity: %w", err) } return *capacity, nil } @@ -170,7 +170,7 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, l } capacity := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) + return nil, fmt.Errorf("error getting minipool queue effective capacity: %w", err) } return *capacity, nil } @@ -183,7 +183,7 @@ func GetQueueNextCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacy } capacity := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, capacity, "getNextCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue next item capacity: %w", err) + return nil, fmt.Errorf("error getting minipool queue next item capacity: %w", err) } return *capacity, nil } @@ -205,7 +205,7 @@ func GetQueueDetails(rp *rocketpool.RocketPool, mp minipool.Minipool, opts *bind func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (uint64, error) { depositType, err := mp.GetDepositType(opts) if err != nil { - return 0, fmt.Errorf("Could not get deposit type: %w", err) + return 0, fmt.Errorf("error getting deposit type: %w", err) } if depositType == rptypes.None { return 0, fmt.Errorf("Minipool address %s has no deposit type", mp.GetAddress()) @@ -214,7 +214,7 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, queryIndex := func(key string) (uint64, error) { index, err := storage.GetAddressQueueIndexOf(rp, opts, crypto.Keccak256Hash([]byte(key)), mp.GetAddress()) if err != nil { - return 0, fmt.Errorf("Could not get queue index for address %s: %w", mp.GetAddress(), err) + return 0, fmt.Errorf("error getting queue index for address %s: %w", mp.GetAddress(), err) } return uint64(index + 1), nil } @@ -225,7 +225,7 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, if depositType != rptypes.Half { position, err = GetQueueLength(rp, rptypes.Half, opts, legacyRocketMinipoolQueueAddress) if err != nil { - return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + return 0, fmt.Errorf("error getting queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) } } else { return queryIndex("minipools.available.half") @@ -235,7 +235,7 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, if depositType != rptypes.Full { length, err := GetQueueLength(rp, rptypes.Full, opts, legacyRocketMinipoolQueueAddress) if err != nil { - return 0, fmt.Errorf("Could not get queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) + return 0, fmt.Errorf("error getting queue length of type %s: %w", rptypes.MinipoolDepositTypes[rptypes.Empty], err) } position += length } else { @@ -258,21 +258,21 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, mp minipool.Minipool, func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts *bind.CallOpts, legacyRocketMinipoolQueueAddress *common.Address) (minipool.Minipool, error) { totalLength, err := GetQueueTotalLength(rp, opts, legacyRocketMinipoolQueueAddress) if err != nil { - return nil, fmt.Errorf("Could not get total queue length: %w", err) + return nil, fmt.Errorf("error getting total queue length: %w", err) } if position >= totalLength { - return nil, fmt.Errorf("Could not get index %d beyond queue length %d", position, totalLength) + return nil, fmt.Errorf("error getting index %d beyond queue length %d", position, totalLength) } lengths, err := GetQueueLengths(rp, opts, legacyRocketMinipoolQueueAddress) if err != nil { - return nil, fmt.Errorf("Could not get queue lengths: %w", err) + return nil, fmt.Errorf("error getting queue lengths: %w", err) } getMinipool := func(key string) (minipool.Minipool, error) { pos := big.NewInt(int64(position)) address, err := storage.GetAddressQueueItem(rp, opts, crypto.Keccak256Hash([]byte(key)), pos) if err != nil { - return nil, fmt.Errorf("Could not get address in queue at position %d: %w", position, err) + return nil, fmt.Errorf("error getting address in queue at position %d: %w", position, err) } return minipool.NewMinipool(rp, address, opts) } diff --git a/legacy/v1.1.0/network/prices.go b/legacy/v1.1.0/network/prices.go index d9f69e0f8..3a947e2e2 100644 --- a/legacy/v1.1.0/network/prices.go +++ b/legacy/v1.1.0/network/prices.go @@ -19,7 +19,7 @@ func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocket } pricesBlock := new(*big.Int) if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network prices block: %w", err) + return 0, fmt.Errorf("error getting network prices block: %w", err) } return (*pricesBlock).Uint64(), nil } @@ -32,7 +32,7 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNet } rplPrice := new(*big.Int) if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { - return nil, fmt.Errorf("Could not get network RPL price: %w", err) + return nil, fmt.Errorf("error getting network RPL price: %w", err) } return *rplPrice, nil } @@ -54,7 +54,7 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice, effectiveRp } tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice, effectiveRplStake) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) + return common.Hash{}, fmt.Errorf("error submitting network prices: %w", err) } return tx.Hash(), nil } @@ -67,7 +67,7 @@ func InConsensus(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNet } isInConsensus := new(bool) if err := rocketNetworkPrices.Call(opts, isInConsensus, "inConsensus"); err != nil { - return false, fmt.Errorf("Could not get consensus status: %w", err) + return false, fmt.Errorf("error getting consensus status: %w", err) } return *isInConsensus, nil } @@ -80,7 +80,7 @@ func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOp } latestReportableBlock := new(*big.Int) if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + return nil, fmt.Errorf("error getting latest reportable block: %w", err) } return *latestReportableBlock, nil } diff --git a/legacy/v1.1.0/node/deposit.go b/legacy/v1.1.0/node/deposit.go index 8b6b7a694..f5a171eb1 100644 --- a/legacy/v1.1.0/node/deposit.go +++ b/legacy/v1.1.0/node/deposit.go @@ -31,7 +31,7 @@ func Deposit(rp *rocketpool.RocketPool, minimumNodeFee float64, validatorPubkey } tx, err := rocketNodeDeposit.Transact(opts, "deposit", eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { - return nil, fmt.Errorf("Could not make node deposit: %w", err) + return nil, fmt.Errorf("error making node deposit: %w", err) } return tx, nil } @@ -45,7 +45,7 @@ func GetDepositType(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.CallO depositType := new(uint8) if err := rocketNodeDeposit.Call(opts, depositType, "getDepositType", amount); err != nil { - return rptypes.Empty, fmt.Errorf("Could not get deposit type: %w", err) + return rptypes.Empty, fmt.Errorf("error getting deposit type: %w", err) } return rptypes.MinipoolDeposit(*depositType), nil } diff --git a/legacy/v1.1.0/node/staking.go b/legacy/v1.1.0/node/staking.go index 592aa7e3f..29dc307b6 100644 --- a/legacy/v1.1.0/node/staking.go +++ b/legacy/v1.1.0/node/staking.go @@ -19,7 +19,7 @@ func GetNodeStakingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts, legac } version := new(uint8) if err := rocketNodeStaking.Call(opts, version, "version"); err != nil { - return 0, fmt.Errorf("Could not get node staking version: %w", err) + return 0, fmt.Errorf("error getting node staking version: %w", err) } return *version, nil } @@ -32,7 +32,7 @@ func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRock } totalRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) + return nil, fmt.Errorf("error getting total network RPL stake: %w", err) } return *totalRplStake, nil } @@ -45,7 +45,7 @@ func GetTotalEffectiveRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts, l } totalEffectiveRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "getTotalEffectiveRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get effective network RPL stake: %w", err) + return nil, fmt.Errorf("error getting effective network RPL stake: %w", err) } return *totalEffectiveRplStake, nil } @@ -58,7 +58,7 @@ func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts } nodeRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) + return nil, fmt.Errorf("error getting total node RPL stake: %w", err) } return *nodeRplStake, nil } @@ -71,12 +71,12 @@ func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addr } nodeEffectiveRplStakeWrapper := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStakeWrapper, "getNodeEffectiveRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) + return nil, fmt.Errorf("error getting effective node RPL stake: %w", err) } minimumStake, err := GetNodeMinimumRPLStake(rp, nodeAddress, opts, legacyRocketNodeStakingAddress) if err != nil { - return nil, fmt.Errorf("Could not get minimum node RPL stake to verify effective stake: %w", err) + return nil, fmt.Errorf("error getting minimum node RPL stake to verify effective stake: %w", err) } nodeEffectiveRplStake := *nodeEffectiveRplStakeWrapper @@ -96,7 +96,7 @@ func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } nodeMinimumRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) + return nil, fmt.Errorf("error getting minimum node RPL stake: %w", err) } return *nodeMinimumRplStake, nil } @@ -109,7 +109,7 @@ func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } nodeMaximumRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) + return nil, fmt.Errorf("error getting maximum node RPL stake: %w", err) } return *nodeMaximumRplStake, nil } @@ -122,7 +122,7 @@ func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, } nodeRplStakedTime := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) + return 0, fmt.Errorf("error getting node RPL staked time: %w", err) } return (*nodeRplStakedTime).Uint64(), nil } @@ -135,7 +135,7 @@ func GetNodeMinipoolLimit(rp *rocketpool.RocketPool, nodeAddress common.Address, } minipoolLimit := new(*big.Int) if err := rocketNodeStaking.Call(opts, minipoolLimit, "getNodeMinipoolLimit", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node minipool limit: %w", err) + return 0, fmt.Errorf("error getting node minipool limit: %w", err) } return (*minipoolLimit).Uint64(), nil } @@ -157,7 +157,7 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact } tx, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) + return common.Hash{}, fmt.Errorf("error staking RPL: %w", err) } return tx.Hash(), nil } @@ -179,7 +179,7 @@ func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Trans } tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) + return common.Hash{}, fmt.Errorf("error withdrawing staked RPL: %w", err) } return tx.Hash(), nil } @@ -192,7 +192,7 @@ func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, r } totalEffectiveRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { - return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) + return nil, fmt.Errorf("error getting total effective RPL stake: %w", err) } return *totalEffectiveRplStake, nil } diff --git a/minipool/bond-reducer.go b/minipool/bond-reducer.go index fbed5797b..db4e186c4 100644 --- a/minipool/bond-reducer.go +++ b/minipool/bond-reducer.go @@ -28,7 +28,7 @@ func VoteCancelReduction(rp *rocketpool.RocketPool, minipoolAddress common.Addre } tx, err := rocketMinipoolBondReducer.Transact(opts, "voteCancelReduction", minipoolAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to cancel bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("error voting to cancel bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) } return tx.Hash(), nil } @@ -41,7 +41,7 @@ func GetReduceBondCancelled(rp *rocketpool.RocketPool, minipoolAddress common.Ad } isCancelled := new(bool) if err := rocketMinipoolBondReducer.Call(opts, isCancelled, "getReduceBondCancelled", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get reduce bond cancelled status for minipool %s: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("error getting reduce bond cancelled status for minipool %s: %w", minipoolAddress.Hex(), err) } return *isCancelled, nil } @@ -54,7 +54,7 @@ func GetReduceBondTime(rp *rocketpool.RocketPool, minipoolAddress common.Address } reduceBondTime := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, reduceBondTime, "getReduceBondTime", minipoolAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get reduce bond time for minipool %s: %w", minipoolAddress.Hex(), err) + return time.Time{}, fmt.Errorf("error getting reduce bond time for minipool %s: %w", minipoolAddress.Hex(), err) } return time.Unix((*reduceBondTime).Int64(), 0), nil } @@ -67,7 +67,7 @@ func GetReduceBondValue(rp *rocketpool.RocketPool, minipoolAddress common.Addres } reduceBondValue := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, reduceBondValue, "getReduceBondValue", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get reduce bond value for minipool %s: %w", minipoolAddress.Hex(), err) + return nil, fmt.Errorf("error getting reduce bond value for minipool %s: %w", minipoolAddress.Hex(), err) } return *reduceBondValue, nil } @@ -80,7 +80,7 @@ func GetLastBondReductionTime(rp *rocketpool.RocketPool, minipoolAddress common. } lastBondReductionTime := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionTime, "getLastBondReductionTime", minipoolAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get last bond reduction time for minipool %s: %w", minipoolAddress.Hex(), err) + return time.Time{}, fmt.Errorf("error getting last bond reduction time for minipool %s: %w", minipoolAddress.Hex(), err) } return time.Unix((*lastBondReductionTime).Int64(), 0), nil } @@ -93,7 +93,7 @@ func GetLastBondReductionPrevValue(rp *rocketpool.RocketPool, minipoolAddress co } lastBondReductionPrevValue := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionPrevValue, "getLastBondReductionPrevValue", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get last bond reduction previous value for minipool %s: %w", minipoolAddress.Hex(), err) + return nil, fmt.Errorf("error getting last bond reduction previous value for minipool %s: %w", minipoolAddress.Hex(), err) } return *lastBondReductionPrevValue, nil } @@ -106,7 +106,7 @@ func GetLastBondReductionPrevNodeFee(rp *rocketpool.RocketPool, minipoolAddress } lastBondReductionPrevNodeFee := new(*big.Int) if err := rocketMinipoolBondReducer.Call(opts, lastBondReductionPrevNodeFee, "getLastBondReductionPrevNodeFee", minipoolAddress); err != nil { - return nil, fmt.Errorf("Could not get last bond reduction previous node fee for minipool %s: %w", minipoolAddress.Hex(), err) + return nil, fmt.Errorf("error getting last bond reduction previous node fee for minipool %s: %w", minipoolAddress.Hex(), err) } return *lastBondReductionPrevNodeFee, nil } @@ -128,7 +128,7 @@ func BeginReduceBondAmount(rp *rocketpool.RocketPool, minipoolAddress common.Add } tx, err := rocketMinipoolBondReducer.Transact(opts, "beginReduceBondAmount", minipoolAddress, newBondAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not begin bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) + return common.Hash{}, fmt.Errorf("error beginning bond reduction for minipool %s: %w", minipoolAddress.Hex(), err) } return tx.Hash(), nil } diff --git a/minipool/factory.go b/minipool/factory.go index 5b80347ad..3cd1800c3 100644 --- a/minipool/factory.go +++ b/minipool/factory.go @@ -19,7 +19,7 @@ func GetExpectedAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, s } address := new(common.Address) if err := rocketMinipoolFactory.Call(opts, address, "getExpectedAddress", nodeAddress, salt); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool expected address: %w", err) + return common.Address{}, fmt.Errorf("error getting minipool expected address: %w", err) } return *address, nil } diff --git a/minipool/minipool-constructor.go b/minipool/minipool-constructor.go index 89d83653b..b5c7f4afd 100644 --- a/minipool/minipool-constructor.go +++ b/minipool/minipool-constructor.go @@ -55,7 +55,7 @@ func createMinipoolContractFromEncodedAbi(rp *rocketpool.RocketPool, address com // Decode ABI abi, err := rocketpool.DecodeAbi(encodedAbi) if err != nil { - return nil, fmt.Errorf("Could not decode minipool %s ABI: %w", address, err) + return nil, fmt.Errorf("error decoding minipool %s ABI: %w", address, err) } // Create and return diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index 895080341..5a9c3f18f 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -134,28 +134,28 @@ func (mp *minipool_v2) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, err func (mp *minipool_v2) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } func (mp *minipool_v2) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } func (mp *minipool_v2) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) + return time.Unix(0, 0), fmt.Errorf("error getting minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } func (mp *minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { - return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s finalised: %w", mp.Address.Hex(), err) } return *finalised, nil } @@ -164,7 +164,7 @@ func (mp *minipool_v2) GetFinalised(opts *bind.CallOpts) (bool, error) { func (mp *minipool_v2) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s deposit type: %w", mp.Address.Hex(), err) } return rptypes.MinipoolDeposit(*depositType), nil } @@ -225,42 +225,42 @@ func (mp *minipool_v2) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) func (mp *minipool_v2) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } func (mp *minipool_v2) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } func (mp *minipool_v2) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } func (mp *minipool_v2) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } func (mp *minipool_v2) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } func (mp *minipool_v2) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil } @@ -307,21 +307,21 @@ func (mp *minipool_v2) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) func (mp *minipool_v2) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } func (mp *minipool_v2) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } func (mp *minipool_v2) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) + return time.Unix(0, 0), fmt.Errorf("error getting minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) } return time.Unix((*depositAssignedTime).Int64(), 0), nil } @@ -335,7 +335,7 @@ func (mp *minipool_v2) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.Ga func (mp *minipool_v2) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { - return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error refunding from minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -352,7 +352,7 @@ func (mp *minipool_v2) EstimateDistributeBalanceGas(opts *bind.TransactOpts) (ro func (mp *minipool_v2) DistributeBalance(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance") if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error processing withdrawal for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -370,7 +370,7 @@ func (mp *minipool_v2) EstimateDistributeBalanceAndFinaliseGas(opts *bind.Transa func (mp *minipool_v2) DistributeBalanceAndFinalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalanceAndFinalise") if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error processing withdrawal for and finalise minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -384,7 +384,7 @@ func (mp *minipool_v2) EstimateStakeGas(validatorSignature rptypes.ValidatorSign func (mp *minipool_v2) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error staking minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -398,7 +398,7 @@ func (mp *minipool_v2) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool. func (mp *minipool_v2) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { - return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error dissolving minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -412,7 +412,7 @@ func (mp *minipool_v2) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.Gas func (mp *minipool_v2) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { - return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error closing minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -426,7 +426,7 @@ func (mp *minipool_v2) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool. func (mp *minipool_v2) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { - return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error finalizing minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -440,7 +440,7 @@ func (mp *minipool_v2) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rock func (mp *minipool_v2) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { - return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error upgrading delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -454,7 +454,7 @@ func (mp *minipool_v2) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (roc func (mp *minipool_v2) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { - return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error rolling back delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -468,7 +468,7 @@ func (mp *minipool_v2) EstimateSetUseLatestDelegateGas(setting bool, opts *bind. func (mp *minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error setting use latest delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -477,7 +477,7 @@ func (mp *minipool_v2) SetUseLatestDelegate(setting bool, opts *bind.TransactOpt func (mp *minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { - return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting use latest delegate for minipool %s: %w", mp.Address.Hex(), err) } return *setting, nil } @@ -486,7 +486,7 @@ func (mp *minipool_v2) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { func (mp *minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -495,7 +495,7 @@ func (mp *minipool_v2) GetDelegate(opts *bind.CallOpts) (common.Address, error) func (mp *minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting previous delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -504,7 +504,7 @@ func (mp *minipool_v2) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, func (mp *minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting effective delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -513,7 +513,7 @@ func (mp *minipool_v2) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address func (mp *minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool node portion: %w", err) + return nil, fmt.Errorf("error getting minipool node portion: %w", err) } return *nodeAmount, nil } @@ -522,7 +522,7 @@ func (mp *minipool_v2) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) func (mp *minipool_v2) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool user portion: %w", err) + return nil, fmt.Errorf("error getting minipool user portion: %w", err) } return *userAmount, nil } @@ -536,7 +536,7 @@ func (mp *minipool_v2) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool func (mp *minipool_v2) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error voting to scrub minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 3e71115fa..632afd23c 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -145,28 +145,28 @@ func (mp *minipool_v3) GetStatusDetails(opts *bind.CallOpts) (StatusDetails, err func (mp *minipool_v3) GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) { status := new(uint8) if err := mp.Contract.Call(opts, status, "getStatus"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s status: %w", mp.Address.Hex(), err) } return rptypes.MinipoolStatus(*status), nil } func (mp *minipool_v3) GetStatusBlock(opts *bind.CallOpts) (uint64, error) { statusBlock := new(*big.Int) if err := mp.Contract.Call(opts, statusBlock, "getStatusBlock"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s status changed block: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s status changed block: %w", mp.Address.Hex(), err) } return (*statusBlock).Uint64(), nil } func (mp *minipool_v3) GetStatusTime(opts *bind.CallOpts) (time.Time, error) { statusTime := new(*big.Int) if err := mp.Contract.Call(opts, statusTime, "getStatusTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s status changed time: %w", mp.Address.Hex(), err) + return time.Unix(0, 0), fmt.Errorf("error getting minipool %s status changed time: %w", mp.Address.Hex(), err) } return time.Unix((*statusTime).Int64(), 0), nil } func (mp *minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { finalised := new(bool) if err := mp.Contract.Call(opts, finalised, "getFinalised"); err != nil { - return false, fmt.Errorf("Could not get minipool %s finalised: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s finalised: %w", mp.Address.Hex(), err) } return *finalised, nil } @@ -175,7 +175,7 @@ func (mp *minipool_v3) GetFinalised(opts *bind.CallOpts) (bool, error) { func (mp *minipool_v3) GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) { depositType := new(uint8) if err := mp.Contract.Call(opts, depositType, "getDepositType"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s deposit type: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s deposit type: %w", mp.Address.Hex(), err) } return rptypes.MinipoolDeposit(*depositType), nil } @@ -236,56 +236,56 @@ func (mp *minipool_v3) GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) func (mp *minipool_v3) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { nodeAddress := new(common.Address) if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %s node address: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting minipool %s node address: %w", mp.Address.Hex(), err) } return *nodeAddress, nil } func (mp *minipool_v3) GetNodeFee(opts *bind.CallOpts) (float64, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + return 0, fmt.Errorf("error getting minipool %s node fee: %w", mp.Address.Hex(), err) } return eth.WeiToEth(*nodeFee), nil } func (mp *minipool_v3) GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) { nodeFee := new(*big.Int) if err := mp.Contract.Call(opts, nodeFee, "getNodeFee"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node fee: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node fee: %w", mp.Address.Hex(), err) } return *nodeFee, nil } func (mp *minipool_v3) GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) { nodeDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeDepositBalance, "getNodeDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node deposit balance: %w", mp.Address.Hex(), err) } return *nodeDepositBalance, nil } func (mp *minipool_v3) GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) { nodeRefundBalance := new(*big.Int) if err := mp.Contract.Call(opts, nodeRefundBalance, "getNodeRefundBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s node refund balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s node refund balance: %w", mp.Address.Hex(), err) } return *nodeRefundBalance, nil } func (mp *minipool_v3) GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) { nodeDepositAssigned := new(bool) if err := mp.Contract.Call(opts, nodeDepositAssigned, "getNodeDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s node deposit assigned status: %w", mp.Address.Hex(), err) } return *nodeDepositAssigned, nil } func (mp *minipool_v3) GetVacant(opts *bind.CallOpts) (bool, error) { isVacant := new(bool) if err := mp.Contract.Call(opts, isVacant, "getVacant"); err != nil { - return false, fmt.Errorf("Could not get minipool %s vacant status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s vacant status: %w", mp.Address.Hex(), err) } return *isVacant, nil } func (mp *minipool_v3) GetPreMigrationBalance(opts *bind.CallOpts) (*big.Int, error) { preMigrationBalance := new(*big.Int) if err := mp.Contract.Call(opts, preMigrationBalance, "getPreMigrationBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s pre-migration balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s pre-migration balance: %w", mp.Address.Hex(), err) } return *preMigrationBalance, nil } @@ -332,21 +332,21 @@ func (mp *minipool_v3) GetUserDetails(opts *bind.CallOpts) (UserDetails, error) func (mp *minipool_v3) GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) { userDepositBalance := new(*big.Int) if err := mp.Contract.Call(opts, userDepositBalance, "getUserDepositBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool %s user deposit balance: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting minipool %s user deposit balance: %w", mp.Address.Hex(), err) } return *userDepositBalance, nil } func (mp *minipool_v3) GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) { userDepositAssigned := new(bool) if err := mp.Contract.Call(opts, userDepositAssigned, "getUserDepositAssigned"); err != nil { - return false, fmt.Errorf("Could not get minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting minipool %s user deposit assigned status: %w", mp.Address.Hex(), err) } return *userDepositAssigned, nil } func (mp *minipool_v3) GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) { depositAssignedTime := new(*big.Int) if err := mp.Contract.Call(opts, depositAssignedTime, "getUserDepositAssignedTime"); err != nil { - return time.Unix(0, 0), fmt.Errorf("Could not get minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) + return time.Unix(0, 0), fmt.Errorf("error getting minipool %s user deposit assigned time: %w", mp.Address.Hex(), err) } return time.Unix((*depositAssignedTime).Int64(), 0), nil } @@ -360,7 +360,7 @@ func (mp *minipool_v3) EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.Ga func (mp *minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "refund") if err != nil { - return common.Hash{}, fmt.Errorf("Could not refund from minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error refunding from minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -369,7 +369,7 @@ func (mp *minipool_v3) Refund(opts *bind.TransactOpts) (common.Hash, error) { func (mp *minipool_v3) GetUserDistributed(opts *bind.CallOpts) (bool, error) { distributed := new(bool) if err := mp.Contract.Call(opts, distributed, "getUserDistributed"); err != nil { - return false, fmt.Errorf("Could not get user distributed status for minipool %s: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting user distributed status for minipool %s: %w", mp.Address.Hex(), err) } return *distributed, nil } @@ -383,7 +383,7 @@ func (mp *minipool_v3) EstimateDistributeBalanceGas(rewardsOnly bool, opts *bind func (mp *minipool_v3) DistributeBalance(rewardsOnly bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "distributeBalance", rewardsOnly) if err != nil { - return common.Hash{}, fmt.Errorf("Could not process withdrawal for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error processing withdrawal for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -397,7 +397,7 @@ func (mp *minipool_v3) EstimateStakeGas(validatorSignature rptypes.ValidatorSign func (mp *minipool_v3) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot) if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error staking minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -411,7 +411,7 @@ func (mp *minipool_v3) EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool. func (mp *minipool_v3) Dissolve(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolve") if err != nil { - return common.Hash{}, fmt.Errorf("Could not dissolve minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error dissolving minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -425,7 +425,7 @@ func (mp *minipool_v3) EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.Gas func (mp *minipool_v3) Close(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "close") if err != nil { - return common.Hash{}, fmt.Errorf("Could not close minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error closing minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -439,7 +439,7 @@ func (mp *minipool_v3) EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool. func (mp *minipool_v3) Finalise(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "finalise") if err != nil { - return common.Hash{}, fmt.Errorf("Could not finalise minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error finalizing minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -453,7 +453,7 @@ func (mp *minipool_v3) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rock func (mp *minipool_v3) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateUpgrade") if err != nil { - return common.Hash{}, fmt.Errorf("Could not upgrade delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error upgrading delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -467,7 +467,7 @@ func (mp *minipool_v3) EstimateDelegateRollbackGas(opts *bind.TransactOpts) (roc func (mp *minipool_v3) DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "delegateRollback") if err != nil { - return common.Hash{}, fmt.Errorf("Could not rollback delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error rolling back delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -481,7 +481,7 @@ func (mp *minipool_v3) EstimateSetUseLatestDelegateGas(setting bool, opts *bind. func (mp *minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error setting use latest delegate for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -490,7 +490,7 @@ func (mp *minipool_v3) SetUseLatestDelegate(setting bool, opts *bind.TransactOpt func (mp *minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { setting := new(bool) if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { - return false, fmt.Errorf("Could not get use latest delegate for minipool %s: %w", mp.Address.Hex(), err) + return false, fmt.Errorf("error getting use latest delegate for minipool %s: %w", mp.Address.Hex(), err) } return *setting, nil } @@ -499,7 +499,7 @@ func (mp *minipool_v3) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { func (mp *minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -508,7 +508,7 @@ func (mp *minipool_v3) GetDelegate(opts *bind.CallOpts) (common.Address, error) func (mp *minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getPreviousDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get previous delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting previous delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -517,7 +517,7 @@ func (mp *minipool_v3) GetPreviousDelegate(opts *bind.CallOpts) (common.Address, func (mp *minipool_v3) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { - return common.Address{}, fmt.Errorf("Could not get effective delegate for minipool %s: %w", mp.Address.Hex(), err) + return common.Address{}, fmt.Errorf("error getting effective delegate for minipool %s: %w", mp.Address.Hex(), err) } return *address, nil } @@ -531,7 +531,7 @@ func (mp *minipool_v3) EstimateReduceBondAmountGas(opts *bind.TransactOpts) (roc func (mp *minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "reduceBondAmount") if err != nil { - return common.Hash{}, fmt.Errorf("Could not reduce bond for minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error reducing bond for minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -540,7 +540,7 @@ func (mp *minipool_v3) ReduceBondAmount(opts *bind.TransactOpts) (common.Hash, e func (mp *minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { nodeAmount := new(*big.Int) if err := mp.Contract.Call(opts, nodeAmount, "calculateNodeShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool node portion: %w", err) + return nil, fmt.Errorf("error getting minipool node portion: %w", err) } return *nodeAmount, nil } @@ -549,7 +549,7 @@ func (mp *minipool_v3) CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) func (mp *minipool_v3) CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) { userAmount := new(*big.Int) if err := mp.Contract.Call(opts, userAmount, "calculateUserShare", balance); err != nil { - return nil, fmt.Errorf("Could not get minipool user portion: %w", err) + return nil, fmt.Errorf("error getting minipool user portion: %w", err) } return *userAmount, nil } @@ -563,7 +563,7 @@ func (mp *minipool_v3) EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool func (mp *minipool_v3) VoteScrub(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "voteScrub") if err != nil { - return common.Hash{}, fmt.Errorf("Could not vote to scrub minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error voting to scrub minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } @@ -577,7 +577,7 @@ func (mp *minipool_v3) EstimatePromoteGas(opts *bind.TransactOpts) (rocketpool.G func (mp *minipool_v3) Promote(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "promote") if err != nil { - return common.Hash{}, fmt.Errorf("Could not promote minipool %s: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error promoting minipool %s: %w", mp.Address.Hex(), err) } return tx.Hash(), nil } diff --git a/minipool/minipool.go b/minipool/minipool.go index d78632c3a..9cc191009 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -160,7 +160,7 @@ func GetPrelaunchMinipoolAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpt offset := big.NewInt(i) newAddresses := new([]common.Address) if err := rocketMinipoolManager.Call(opts, newAddresses, "getPrelaunchMinipools", offset, limit); err != nil { - return []common.Address{}, fmt.Errorf("Could not get prelaunch minipool addresses: %w", err) + return []common.Address{}, fmt.Errorf("error getting prelaunch minipool addresses: %w", err) } addresses = append(addresses, *newAddresses...) } @@ -304,7 +304,7 @@ func GetMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get minipool count: %w", err) + return 0, fmt.Errorf("error getting minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -317,7 +317,7 @@ func GetStakingMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getStakingMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get staking minipool count: %w", err) + return 0, fmt.Errorf("error getting staking minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -330,7 +330,7 @@ func GetFinalisedMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getFinalisedMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + return 0, fmt.Errorf("error getting finalised minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -343,7 +343,7 @@ func GetActiveMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getActiveMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get finalised minipool count: %w", err) + return 0, fmt.Errorf("error getting finalised minipool count: %w", err) } return (*minipoolCount).Uint64(), nil } @@ -375,7 +375,7 @@ func GetMinipoolCountPerStatus(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( offset := big.NewInt(i) newMinipoolCounts := new(MinipoolCountsPerStatus) if err := rocketMinipoolManager.Call(opts, newMinipoolCounts, "getMinipoolCountPerStatus", offset, limit); err != nil { - return MinipoolCountsPerStatus{}, fmt.Errorf("Could not get minipool counts: %w", err) + return MinipoolCountsPerStatus{}, fmt.Errorf("error getting minipool counts: %w", err) } if newMinipoolCounts != nil { if newMinipoolCounts.Initialized != nil { @@ -406,7 +406,7 @@ func GetMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool %d address: %w", index, err) + return common.Address{}, fmt.Errorf("error getting minipool %d address: %w", index, err) } return *minipoolAddress, nil } @@ -419,7 +419,7 @@ func GetNodeMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Address, } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -432,7 +432,7 @@ func GetNodeMinipoolCountRaw(rp *rocketpool.RocketPool, nodeAddress common.Addre } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeMinipoolCount", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return nil, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return *minipoolCount, nil } @@ -445,7 +445,7 @@ func GetNodeActiveMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common.Ad } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeActiveMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -458,7 +458,7 @@ func GetNodeFinalisedMinipoolCount(rp *rocketpool.RocketPool, nodeAddress common } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeFinalisedMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -471,7 +471,7 @@ func GetNodeMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.Address, in } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s minipool %d address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("error getting node %s minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } @@ -484,7 +484,7 @@ func GetNodeValidatingMinipoolCount(rp *rocketpool.RocketPool, nodeAddress commo } minipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, minipoolCount, "getNodeValidatingMinipoolCount", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s validating minipool count: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s validating minipool count: %w", nodeAddress.Hex(), err) } return (*minipoolCount).Uint64(), nil } @@ -497,7 +497,7 @@ func GetNodeValidatingMinipoolAt(rp *rocketpool.RocketPool, nodeAddress common.A } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getNodeValidatingMinipoolAt", nodeAddress, big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) + return common.Address{}, fmt.Errorf("error getting node %s validating minipool %d address: %w", nodeAddress.Hex(), index, err) } return *minipoolAddress, nil } @@ -510,7 +510,7 @@ func GetMinipoolByPubkey(rp *rocketpool.RocketPool, pubkey rptypes.ValidatorPubk } minipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, minipoolAddress, "getMinipoolByPubkey", pubkey[:]); err != nil { - return common.Address{}, fmt.Errorf("Could not get validator %s minipool address: %w", pubkey.Hex(), err) + return common.Address{}, fmt.Errorf("error getting validator %s minipool address: %w", pubkey.Hex(), err) } return *minipoolAddress, nil } @@ -523,7 +523,7 @@ func GetMinipoolExists(rp *rocketpool.RocketPool, minipoolAddress common.Address } exists := new(bool) if err := rocketMinipoolManager.Call(opts, exists, "getMinipoolExists", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s exists status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("error getting minipool %s exists status: %w", minipoolAddress.Hex(), err) } return *exists, nil } @@ -536,7 +536,7 @@ func GetMinipoolPubkey(rp *rocketpool.RocketPool, minipoolAddress common.Address } pubkey := new(rptypes.ValidatorPubkey) if err := rocketMinipoolManager.Call(opts, pubkey, "getMinipoolPubkey", minipoolAddress); err != nil { - return rptypes.ValidatorPubkey{}, fmt.Errorf("Could not get minipool %s pubkey: %w", minipoolAddress.Hex(), err) + return rptypes.ValidatorPubkey{}, fmt.Errorf("error getting minipool %s pubkey: %w", minipoolAddress.Hex(), err) } return *pubkey, nil } @@ -549,7 +549,7 @@ func GetMinipoolWithdrawalCredentials(rp *rocketpool.RocketPool, minipoolAddress } withdrawalCredentials := new(common.Hash) if err := rocketMinipoolManager.Call(opts, withdrawalCredentials, "getMinipoolWithdrawalCredentials", minipoolAddress); err != nil { - return common.Hash{}, fmt.Errorf("Could not get minipool withdrawal credentials: %w", err) + return common.Hash{}, fmt.Errorf("error getting minipool withdrawal credentials: %w", err) } return *withdrawalCredentials, nil } @@ -572,7 +572,7 @@ func GetVacantMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } vacantMinipoolCount := new(*big.Int) if err := rocketMinipoolManager.Call(opts, vacantMinipoolCount, "getVacantMinipoolCount"); err != nil { - return 0, fmt.Errorf("Could not get vacant minipool count: %w", err) + return 0, fmt.Errorf("error getting vacant minipool count: %w", err) } return (*vacantMinipoolCount).Uint64(), nil } @@ -585,7 +585,7 @@ func GetVacantMinipoolAt(rp *rocketpool.RocketPool, index uint64, opts *bind.Cal } vacantMinipoolAddress := new(common.Address) if err := rocketMinipoolManager.Call(opts, vacantMinipoolAddress, "getVacantMinipoolAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get vacant minipool %d address: %w", index, err) + return common.Address{}, fmt.Errorf("error getting vacant minipool %d address: %w", index, err) } return *vacantMinipoolAddress, nil } @@ -598,7 +598,7 @@ func GetMinipoolRPLSlashed(rp *rocketpool.RocketPool, minipoolAddress common.Add } value := new(bool) if err := rocketMinipoolManager.Call(opts, value, "getMinipoolRPLSlashed", minipoolAddress); err != nil { - return false, fmt.Errorf("Could not get minipool %s slashed status: %w", minipoolAddress.Hex(), err) + return false, fmt.Errorf("error getting minipool %s slashed status: %w", minipoolAddress.Hex(), err) } return *value, nil } @@ -611,7 +611,7 @@ func GetMinipoolDepositType(rp *rocketpool.RocketPool, minipoolAddress common.Ad } value := new(uint8) if err := rocketMinipoolManager.Call(opts, value, "getMinipoolDepositType", minipoolAddress); err != nil { - return types.None, fmt.Errorf("Could not get minipool %s slashed status: %w", minipoolAddress.Hex(), err) + return types.None, fmt.Errorf("error getting minipool %s slashed status: %w", minipoolAddress.Hex(), err) } return types.MinipoolDeposit(*value), nil } diff --git a/minipool/queue.go b/minipool/queue.go index bc41fb649..4b83ddae7 100644 --- a/minipool/queue.go +++ b/minipool/queue.go @@ -64,7 +64,7 @@ func GetQueueTotalLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } length := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, length, "getTotalLength"); err != nil { - return 0, fmt.Errorf("Could not get total minipool queue length: %w", err) + return 0, fmt.Errorf("error getting total minipool queue length: %w", err) } return (*length).Uint64(), nil } @@ -77,7 +77,7 @@ func GetQueueTotalCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } capacity := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, capacity, "getTotalCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue total capacity: %w", err) + return nil, fmt.Errorf("error getting minipool queue total capacity: %w", err) } return *capacity, nil } @@ -90,7 +90,7 @@ func GetQueueEffectiveCapacity(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } capacity := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, capacity, "getEffectiveCapacity"); err != nil { - return nil, fmt.Errorf("Could not get minipool queue effective capacity: %w", err) + return nil, fmt.Errorf("error getting minipool queue effective capacity: %w", err) } return *capacity, nil } @@ -116,7 +116,7 @@ func GetQueuePositionOfMinipool(rp *rocketpool.RocketPool, minipoolAddress commo } position := new(*big.Int) if err := rocketMinipoolQueue.Call(opts, position, "getMinipoolPosition", minipoolAddress); err != nil { - return 0, fmt.Errorf("Could not get queue position for minipool %s: %w", minipoolAddress.Hex(), err) + return 0, fmt.Errorf("error getting queue position for minipool %s: %w", minipoolAddress.Hex(), err) } return (*position).Int64() + 1, nil } @@ -129,7 +129,7 @@ func GetQueueMinipoolAtPosition(rp *rocketpool.RocketPool, position uint64, opts } address := new(common.Address) if err := rocketMinipoolQueue.Call(opts, address, "getMinipoolAt", big.NewInt(int64(position))); err != nil { - return common.Address{}, fmt.Errorf("Could not get minipool at queue position %d: %w", position, err) + return common.Address{}, fmt.Errorf("error getting minipool at queue position %d: %w", position, err) } return *address, nil } diff --git a/minipool/status.go b/minipool/status.go index b18e8a1d6..44eb2ab99 100644 --- a/minipool/status.go +++ b/minipool/status.go @@ -27,7 +27,7 @@ func SubmitMinipoolWithdrawable(rp *rocketpool.RocketPool, minipoolAddress commo } tx, err := rocketMinipoolStatus.Transact(opts, "submitMinipoolWithdrawable", minipoolAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit minipool withdrawable event: %w", err) + return common.Hash{}, fmt.Errorf("error submitting minipool withdrawable event: %w", err) } return tx.Hash(), nil } diff --git a/network/balances.go b/network/balances.go index 3908fcfee..68921088c 100644 --- a/network/balances.go +++ b/network/balances.go @@ -26,7 +26,7 @@ func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } balancesBlock := new(*big.Int) if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network balances block: %w", err) + return 0, fmt.Errorf("error getting network balances block: %w", err) } return (*balancesBlock).Uint64(), nil } @@ -39,7 +39,7 @@ func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.I } balancesBlock := new(*big.Int) if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { - return nil, fmt.Errorf("Could not get network balances block: %w", err) + return nil, fmt.Errorf("error getting network balances block: %w", err) } return *balancesBlock, nil } @@ -52,7 +52,7 @@ func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } totalEthBalance := new(*big.Int) if err := rocketNetworkBalances.Call(opts, totalEthBalance, "getTotalETHBalance"); err != nil { - return nil, fmt.Errorf("Could not get network total ETH balance: %w", err) + return nil, fmt.Errorf("error getting network total ETH balance: %w", err) } return *totalEthBalance, nil } @@ -65,7 +65,7 @@ func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } stakingEthBalance := new(*big.Int) if err := rocketNetworkBalances.Call(opts, stakingEthBalance, "getStakingETHBalance"); err != nil { - return nil, fmt.Errorf("Could not get network staking ETH balance: %w", err) + return nil, fmt.Errorf("error getting network staking ETH balance: %w", err) } return *stakingEthBalance, nil } @@ -78,7 +78,7 @@ func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } totalRethSupply := new(*big.Int) if err := rocketNetworkBalances.Call(opts, totalRethSupply, "getTotalRETHSupply"); err != nil { - return nil, fmt.Errorf("Could not get network total rETH supply: %w", err) + return nil, fmt.Errorf("error getting network total rETH supply: %w", err) } return *totalRethSupply, nil } @@ -91,7 +91,7 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } ethUtilizationRate := new(*big.Int) if err := rocketNetworkBalances.Call(opts, ethUtilizationRate, "getETHUtilizationRate"); err != nil { - return 0, fmt.Errorf("Could not get network ETH utilization rate: %w", err) + return 0, fmt.Errorf("error getting network ETH utilization rate: %w", err) } return eth.WeiToEth(*ethUtilizationRate), nil } @@ -113,7 +113,7 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt } tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) + return common.Hash{}, fmt.Errorf("error submitting network balances: %w", err) } return tx.Hash(), nil } @@ -126,7 +126,7 @@ func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.Call } latestReportableBlock := new(*big.Int) if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + return nil, fmt.Errorf("error getting latest reportable block: %w", err) } return *latestReportableBlock, nil } diff --git a/network/fees.go b/network/fees.go index 8070ea0c0..a2eded958 100644 --- a/network/fees.go +++ b/network/fees.go @@ -19,7 +19,7 @@ func GetNodeDemand(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, er } nodeDemand := new(*big.Int) if err := rocketNetworkFees.Call(opts, nodeDemand, "getNodeDemand"); err != nil { - return nil, fmt.Errorf("Could not get network node demand: %w", err) + return nil, fmt.Errorf("error getting network node demand: %w", err) } return *nodeDemand, nil } @@ -32,7 +32,7 @@ func GetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) } nodeFee := new(*big.Int) if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get network node fee: %w", err) + return 0, fmt.Errorf("error getting network node fee: %w", err) } return eth.WeiToEth(*nodeFee), nil } @@ -45,7 +45,7 @@ func GetNodeFeeByDemand(rp *rocketpool.RocketPool, nodeDemand *big.Int, opts *bi } nodeFee := new(*big.Int) if err := rocketNetworkFees.Call(opts, nodeFee, "getNodeFeeByDemand", nodeDemand); err != nil { - return 0, fmt.Errorf("Could not get node fee by node demand: %w", err) + return 0, fmt.Errorf("error getting node fee by node demand: %w", err) } return eth.WeiToEth(*nodeFee), nil } diff --git a/network/penalties.go b/network/penalties.go index d9442b202..3cfa539f1 100644 --- a/network/penalties.go +++ b/network/penalties.go @@ -28,7 +28,7 @@ func SubmitPenalty(rp *rocketpool.RocketPool, minipoolAddress common.Address, bl } tx, err := rocketNetworkPrices.Transact(opts, "submitPenalty", minipoolAddress, block) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit penalty: %w", err) + return common.Hash{}, fmt.Errorf("error submitting penalty: %w", err) } return tx.Hash(), nil } diff --git a/network/prices.go b/network/prices.go index 9f24f542b..b4c89785a 100644 --- a/network/prices.go +++ b/network/prices.go @@ -26,7 +26,7 @@ func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } pricesBlock := new(*big.Int) if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { - return 0, fmt.Errorf("Could not get network prices block: %w", err) + return 0, fmt.Errorf("error getting network prices block: %w", err) } return (*pricesBlock).Uint64(), nil } @@ -39,7 +39,7 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } rplPrice := new(*big.Int) if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { - return nil, fmt.Errorf("Could not get network RPL price: %w", err) + return nil, fmt.Errorf("error getting network RPL price: %w", err) } return *rplPrice, nil } @@ -61,7 +61,7 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, op } tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) + return common.Hash{}, fmt.Errorf("error submitting network prices: %w", err) } return tx.Hash(), nil } @@ -74,7 +74,7 @@ func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOp } latestReportableBlock := new(*big.Int) if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + return nil, fmt.Errorf("error getting latest reportable block: %w", err) } return *latestReportableBlock, nil } diff --git a/node/deposit.go b/node/deposit.go index f3fd6cc60..153e47dac 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -31,7 +31,7 @@ func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee floa } tx, err := rocketNodeDeposit.Transact(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { - return nil, fmt.Errorf("Could not make node deposit: %w", err) + return nil, fmt.Errorf("error making node deposit: %w", err) } return tx, nil } @@ -53,7 +53,7 @@ func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNo } tx, err := rocketNodeDeposit.Transact(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) if err != nil { - return nil, fmt.Errorf("Could not make node deposit with credit: %w", err) + return nil, fmt.Errorf("error making node deposit with credit: %w", err) } return tx, nil } @@ -75,7 +75,7 @@ func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, minimu } tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) if err != nil { - return nil, fmt.Errorf("Could not create vacant minipool: %w", err) + return nil, fmt.Errorf("error creating vacant minipool: %w", err) } return tx, nil } @@ -89,7 +89,7 @@ func GetNodeDepositCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, creditBalance := new(*big.Int) if err := rocketNodeDeposit.Call(opts, creditBalance, "getNodeDepositCredit", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node deposit credit: %w", err) + return nil, fmt.Errorf("error getting node deposit credit: %w", err) } return *creditBalance, nil } diff --git a/node/distributor.go b/node/distributor.go index 0706874c1..e914aba5e 100644 --- a/node/distributor.go +++ b/node/distributor.go @@ -43,7 +43,7 @@ func GetDistributorAddress(rp *rocketpool.RocketPool, nodeAddress common.Address } var address common.Address if err := rocketNodeDistributorFactory.Call(opts, &address, "getProxyAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get distributor address: %w", err) + return common.Address{}, fmt.Errorf("error getting distributor address: %w", err) } return address, nil } @@ -57,7 +57,7 @@ func (d *Distributor) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { tx, err := d.Contract.Transact(opts, "distribute") if err != nil { - return common.Hash{}, fmt.Errorf("Could not distribute fee distributor balance: %w", err) + return common.Hash{}, fmt.Errorf("error distributing fee distributor balance: %w", err) } return tx.Hash(), nil } @@ -66,7 +66,7 @@ func (d *Distributor) Distribute(opts *bind.TransactOpts) (common.Hash, error) { func (d *Distributor) GetNodeShare(opts *bind.CallOpts) (*big.Int, error) { nodeShare := new(*big.Int) if err := d.Contract.Call(opts, nodeShare, "getNodeShare"); err != nil { - return nil, fmt.Errorf("Could not get distributor %s node share: %w", d.Address.Hex(), err) + return nil, fmt.Errorf("error getting distributor %s node share: %w", d.Address.Hex(), err) } return *nodeShare, nil } @@ -75,7 +75,7 @@ func (d *Distributor) GetNodeShare(opts *bind.CallOpts) (*big.Int, error) { func (d *Distributor) GetUserShare(opts *bind.CallOpts) (*big.Int, error) { userShare := new(*big.Int) if err := d.Contract.Call(opts, userShare, "getUserShare"); err != nil { - return nil, fmt.Errorf("Could not get distributor %s user share: %w", d.Address.Hex(), err) + return nil, fmt.Errorf("error getting distributor %s user share: %w", d.Address.Hex(), err) } return *userShare, nil } diff --git a/node/node.go b/node/node.go index 3f796b0a0..f29decc0a 100644 --- a/node/node.go +++ b/node/node.go @@ -203,7 +203,7 @@ func GetNodeCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error } nodeCount := new(*big.Int) if err := rocketNodeManager.Call(opts, nodeCount, "getNodeCount"); err != nil { - return 0, fmt.Errorf("Could not get node count: %w", err) + return 0, fmt.Errorf("error getting node count: %w", err) } return (*nodeCount).Uint64(), nil } @@ -216,7 +216,7 @@ func GetNodeCountPerTimezone(rp *rocketpool.RocketPool, offset, limit *big.Int, } timezoneCounts := new([]TimezoneCount) if err := rocketNodeManager.Call(opts, timezoneCounts, "getNodeCountPerTimezone", offset, limit); err != nil { - return []TimezoneCount{}, fmt.Errorf("Could not get node count: %w", err) + return []TimezoneCount{}, fmt.Errorf("error getting node count: %w", err) } return *timezoneCounts, nil } @@ -229,7 +229,7 @@ func GetNodeAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (co } nodeAddress := new(common.Address) if err := rocketNodeManager.Call(opts, nodeAddress, "getNodeAt", big.NewInt(int64(index))); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %d address: %w", index, err) + return common.Address{}, fmt.Errorf("error getting node %d address: %w", index, err) } return *nodeAddress, nil } @@ -242,7 +242,7 @@ func GetNodeExists(rp *rocketpool.RocketPool, nodeAddress common.Address, opts * } exists := new(bool) if err := rocketNodeManager.Call(opts, exists, "getNodeExists", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %s exists status: %w", nodeAddress.Hex(), err) + return false, fmt.Errorf("error getting node %s exists status: %w", nodeAddress.Hex(), err) } return *exists, nil } @@ -255,7 +255,7 @@ func GetNodeTimezoneLocation(rp *rocketpool.RocketPool, nodeAddress common.Addre } timezoneLocation := new(string) if err := rocketNodeManager.Call(opts, timezoneLocation, "getNodeTimezoneLocation", nodeAddress); err != nil { - return "", fmt.Errorf("Could not get node %s timezone location: %w", nodeAddress.Hex(), err) + return "", fmt.Errorf("error getting node %s timezone location: %w", nodeAddress.Hex(), err) } return strings.Sanitize(*timezoneLocation), nil } @@ -268,7 +268,7 @@ func EstimateRegisterNodeGas(rp *rocketpool.RocketPool, timezoneLocation string, } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + return rocketpool.GasInfo{}, fmt.Errorf("error verifying timezone [%s]: %w", timezoneLocation, err) } return rocketNodeManager.GetTransactionGasInfo(opts, "registerNode", timezoneLocation) } @@ -281,11 +281,11 @@ func RegisterNode(rp *rocketpool.RocketPool, timezoneLocation string, opts *bind } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + return common.Hash{}, fmt.Errorf("error verifying timezone [%s]: %w", timezoneLocation, err) } tx, err := rocketNodeManager.Transact(opts, "registerNode", timezoneLocation) if err != nil { - return common.Hash{}, fmt.Errorf("Could not register node: %w", err) + return common.Hash{}, fmt.Errorf("error registering node: %w", err) } return tx.Hash(), nil } @@ -298,7 +298,7 @@ func EstimateSetTimezoneLocationGas(rp *rocketpool.RocketPool, timezoneLocation } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + return rocketpool.GasInfo{}, fmt.Errorf("error verifying timezone [%s]: %w", timezoneLocation, err) } return rocketNodeManager.GetTransactionGasInfo(opts, "setTimezoneLocation", timezoneLocation) } @@ -311,11 +311,11 @@ func SetTimezoneLocation(rp *rocketpool.RocketPool, timezoneLocation string, opt } _, err = time.LoadLocation(timezoneLocation) if err != nil { - return common.Hash{}, fmt.Errorf("Could not verify timezone [%s]: %w", timezoneLocation, err) + return common.Hash{}, fmt.Errorf("error verifying timezone [%s]: %w", timezoneLocation, err) } tx, err := rocketNodeManager.Transact(opts, "setTimezoneLocation", timezoneLocation) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set node timezone location: %w", err) + return common.Hash{}, fmt.Errorf("error setting node timezone location: %w", err) } return tx.Hash(), nil } @@ -328,7 +328,7 @@ func GetRewardNetwork(rp *rocketpool.RocketPool, nodeAddress common.Address, opt } rewardNetwork := new(*big.Int) if err := rocketNodeManager.Call(opts, rewardNetwork, "getRewardNetwork", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s reward network: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s reward network: %w", nodeAddress.Hex(), err) } return (*rewardNetwork).Uint64(), nil } @@ -341,7 +341,7 @@ func GetRewardNetworkRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, } rewardNetwork := new(*big.Int) if err := rocketNodeManager.Call(opts, rewardNetwork, "getRewardNetwork", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node %s reward network: %w", nodeAddress.Hex(), err) + return nil, fmt.Errorf("error getting node %s reward network: %w", nodeAddress.Hex(), err) } return *rewardNetwork, nil } @@ -354,7 +354,7 @@ func GetFeeDistributorInitialized(rp *rocketpool.RocketPool, nodeAddress common. } isInitialized := new(bool) if err := rocketNodeManager.Call(opts, isInitialized, "getFeeDistributorInitialised", nodeAddress); err != nil { - return false, fmt.Errorf("Could not check if node %s's fee distributor is initialized: %w", nodeAddress.Hex(), err) + return false, fmt.Errorf("error checking if node %s's fee distributor is initialized: %w", nodeAddress.Hex(), err) } return *isInitialized, nil } @@ -376,7 +376,7 @@ func InitializeFeeDistributor(rp *rocketpool.RocketPool, opts *bind.TransactOpts } tx, err := rocketNodeManager.Transact(opts, "initialiseFeeDistributor") if err != nil { - return common.Hash{}, fmt.Errorf("Could not initialize fee distributor: %w", err) + return common.Hash{}, fmt.Errorf("error initializing fee distributor: %w", err) } return tx.Hash(), nil } @@ -389,7 +389,7 @@ func GetNodeAverageFee(rp *rocketpool.RocketPool, nodeAddress common.Address, op } avgFee := new(*big.Int) if err := rocketNodeManager.Call(opts, avgFee, "getAverageNodeFee", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node %s average fee: %w", nodeAddress.Hex(), err) + return 0, fmt.Errorf("error getting node %s average fee: %w", nodeAddress.Hex(), err) } return eth.WeiToEth(*avgFee), nil } @@ -402,7 +402,7 @@ func GetNodeAverageFeeRaw(rp *rocketpool.RocketPool, nodeAddress common.Address, } avgFee := new(*big.Int) if err := rocketNodeManager.Call(opts, avgFee, "getAverageNodeFee", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node %s average fee: %w", nodeAddress.Hex(), err) + return nil, fmt.Errorf("error getting node %s average fee: %w", nodeAddress.Hex(), err) } return *avgFee, nil } @@ -415,7 +415,7 @@ func GetNodeRegistrationTime(rp *rocketpool.RocketPool, address common.Address, } registrationTime := new(*big.Int) if err := rocketNodeManager.Call(opts, registrationTime, "getNodeRegistrationTime", address); err != nil { - return time.Time{}, fmt.Errorf("Could not get registration time for %s: %w", address.Hex(), err) + return time.Time{}, fmt.Errorf("error getting registration time for %s: %w", address.Hex(), err) } return time.Unix((*registrationTime).Int64(), 0), nil } @@ -428,7 +428,7 @@ func GetNodeRegistrationTimeRaw(rp *rocketpool.RocketPool, address common.Addres } registrationTime := new(*big.Int) if err := rocketNodeManager.Call(opts, registrationTime, "getNodeRegistrationTime", address); err != nil { - return nil, fmt.Errorf("Could not get registration time for %s: %w", address.Hex(), err) + return nil, fmt.Errorf("error getting registration time for %s: %w", address.Hex(), err) } return *registrationTime, nil } @@ -441,7 +441,7 @@ func GetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, nodeAddress co } state := new(bool) if err := rocketNodeManager.Call(opts, state, "getSmoothingPoolRegistrationState", nodeAddress); err != nil { - return false, fmt.Errorf("Could not get node %s smoothing pool registration status: %w", nodeAddress.Hex(), err) + return false, fmt.Errorf("error getting node %s smoothing pool registration status: %w", nodeAddress.Hex(), err) } return *state, nil } @@ -454,7 +454,7 @@ func GetSmoothingPoolRegistrationChanged(rp *rocketpool.RocketPool, nodeAddress } timestamp := new(*big.Int) if err := rocketNodeManager.Call(opts, timestamp, "getSmoothingPoolRegistrationChanged", nodeAddress); err != nil { - return time.Time{}, fmt.Errorf("Could not get node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) + return time.Time{}, fmt.Errorf("error getting node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) } return time.Unix((*timestamp).Int64(), 0), nil } @@ -467,7 +467,7 @@ func GetSmoothingPoolRegistrationChangedRaw(rp *rocketpool.RocketPool, nodeAddre } timestamp := new(*big.Int) if err := rocketNodeManager.Call(opts, timestamp, "getSmoothingPoolRegistrationChanged", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) + return nil, fmt.Errorf("error getting node %s's last smoothing pool registration change time: %w", nodeAddress.Hex(), err) } return *timestamp, nil } @@ -489,7 +489,7 @@ func SetSmoothingPoolRegistrationState(rp *rocketpool.RocketPool, optIn bool, op } tx, err := rocketNodeManager.Transact(opts, "setSmoothingPoolRegistrationState", optIn) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set smoothing pool registration state: %w", err) + return common.Hash{}, fmt.Errorf("error setting smoothing pool registration state: %w", err) } return tx.Hash(), nil } @@ -523,7 +523,7 @@ func GetSmoothingPoolRegisteredNodeCount(rp *rocketpool.RocketPool, opts *bind.C count := new(*big.Int) err := rocketNodeManager.Call(opts, count, "getSmoothingPoolRegisteredNodeCount", big.NewInt(int64(offset)), big.NewInt(int64(limit))) if err != nil { - return fmt.Errorf("Could not get smoothing pool opt-in count for batch starting at %d: %w", offset, err) + return fmt.Errorf("error getting smoothing pool opt-in count for batch starting at %d: %w", offset, err) } iterationCounts[i] = *count diff --git a/node/staking.go b/node/staking.go index 3b43cbf13..7cb54705e 100644 --- a/node/staking.go +++ b/node/staking.go @@ -28,7 +28,7 @@ func GetTotalRPLStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } totalRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, totalRplStake, "getTotalRPLStake"); err != nil { - return nil, fmt.Errorf("Could not get total network RPL stake: %w", err) + return nil, fmt.Errorf("error getting total network RPL stake: %w", err) } return *totalRplStake, nil } @@ -41,7 +41,7 @@ func GetNodeRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Address, opts } nodeRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeRplStake, "getNodeRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get total node RPL stake: %w", err) + return nil, fmt.Errorf("error getting total node RPL stake: %w", err) } return *nodeRplStake, nil } @@ -54,12 +54,12 @@ func GetNodeEffectiveRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addr } nodeEffectiveRplStakeWrapper := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeEffectiveRplStakeWrapper, "getNodeEffectiveRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get effective node RPL stake: %w", err) + return nil, fmt.Errorf("error getting effective node RPL stake: %w", err) } minimumStake, err := GetNodeMinimumRPLStake(rp, nodeAddress, opts) if err != nil { - return nil, fmt.Errorf("Could not get minimum node RPL stake to verify effective stake: %w", err) + return nil, fmt.Errorf("error getting minimum node RPL stake to verify effective stake: %w", err) } nodeEffectiveRplStake := *nodeEffectiveRplStakeWrapper @@ -79,7 +79,7 @@ func GetNodeMinimumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } nodeMinimumRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeMinimumRplStake, "getNodeMinimumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get minimum node RPL stake: %w", err) + return nil, fmt.Errorf("error getting minimum node RPL stake: %w", err) } return *nodeMinimumRplStake, nil } @@ -92,7 +92,7 @@ func GetNodeMaximumRPLStake(rp *rocketpool.RocketPool, nodeAddress common.Addres } nodeMaximumRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeMaximumRplStake, "getNodeMaximumRPLStake", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get maximum node RPL stake: %w", err) + return nil, fmt.Errorf("error getting maximum node RPL stake: %w", err) } return *nodeMaximumRplStake, nil } @@ -105,7 +105,7 @@ func GetNodeRPLStakedTime(rp *rocketpool.RocketPool, nodeAddress common.Address, } nodeRplStakedTime := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeRplStakedTime, "getNodeRPLStakedTime", nodeAddress); err != nil { - return 0, fmt.Errorf("Could not get node RPL staked time: %w", err) + return 0, fmt.Errorf("error getting node RPL staked time: %w", err) } return (*nodeRplStakedTime).Uint64(), nil } @@ -118,7 +118,7 @@ func GetNodeEthMatched(rp *rocketpool.RocketPool, nodeAddress common.Address, op } nodeEthMatched := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeEthMatched, "getNodeETHMatched", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node ETH matched: %w", err) + return nil, fmt.Errorf("error getting node ETH matched: %w", err) } return *nodeEthMatched, nil } @@ -131,7 +131,7 @@ func GetNodeEthMatchedLimit(rp *rocketpool.RocketPool, nodeAddress common.Addres } nodeEthMatchedLimit := new(*big.Int) if err := rocketNodeStaking.Call(opts, nodeEthMatchedLimit, "getNodeETHMatchedLimit", nodeAddress); err != nil { - return nil, fmt.Errorf("Could not get node ETH matched limit: %w", err) + return nil, fmt.Errorf("error getting node ETH matched limit: %w", err) } return *nodeEthMatchedLimit, nil } @@ -153,7 +153,7 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact } tx, err := rocketNodeStaking.Transact(opts, "stakeRPL", rplAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not stake RPL: %w", err) + return common.Hash{}, fmt.Errorf("error staking RPL: %w", err) } return tx.Hash(), nil } @@ -175,7 +175,7 @@ func SetStakeRPLForAllowed(rp *rocketpool.RocketPool, caller common.Address, all } tx, err := rocketNodeStaking.Transact(opts, "setStakeRPLForAllowed", caller, allowed) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set stake RPL for allowed: %w", err) + return common.Hash{}, fmt.Errorf("error setting stake RPL for allowed: %w", err) } return tx.Hash(), nil } @@ -197,7 +197,7 @@ func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Trans } tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not withdraw staked RPL: %w", err) + return common.Hash{}, fmt.Errorf("error withdrawing staked RPL: %w", err) } return tx.Hash(), nil } @@ -210,7 +210,7 @@ func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, r } totalEffectiveRplStake := new(*big.Int) if err := rocketNodeStaking.Call(opts, totalEffectiveRplStake, "calculateTotalEffectiveRPLStake", offset, limit, rplPrice); err != nil { - return nil, fmt.Errorf("Could not get total effective RPL stake: %w", err) + return nil, fmt.Errorf("error getting total effective RPL stake: %w", err) } return *totalEffectiveRplStake, nil } diff --git a/rewards/distributor-mainnet.go b/rewards/distributor-mainnet.go index aa585af54..a4395c7ea 100644 --- a/rewards/distributor-mainnet.go +++ b/rewards/distributor-mainnet.go @@ -18,7 +18,7 @@ func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common. } isClaimed := new(bool) if err := rocketDistributorMainnet.Call(opts, isClaimed, "isClaimed", index, claimerAddress); err != nil { - return false, fmt.Errorf("Could not get rewards claim status for interval %s, node %s: %w", index.String(), claimerAddress.Hex(), err) + return false, fmt.Errorf("error getting rewards claim status for interval %s, node %s: %w", index.String(), claimerAddress.Hex(), err) } return *isClaimed, nil } @@ -31,7 +31,7 @@ func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOp } bytes := new([32]byte) if err := rocketDistributorMainnet.Call(opts, bytes, "merkleRoots", interval); err != nil { - return nil, fmt.Errorf("Could not get Merkle root for interval %s: %w", interval.String(), err) + return nil, fmt.Errorf("error getting Merkle root for interval %s: %w", interval.String(), err) } return (*bytes)[:], nil } @@ -53,7 +53,7 @@ func Claim(rp *rocketpool.RocketPool, address common.Address, indices []*big.Int } tx, err := rocketDistributorMainnet.Transact(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs) if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) + return common.Hash{}, fmt.Errorf("error claiming rewards: %w", err) } return tx.Hash(), nil } @@ -75,7 +75,7 @@ func ClaimAndStake(rp *rocketpool.RocketPool, address common.Address, indices [] } tx, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not claim rewards: %w", err) + return common.Hash{}, fmt.Errorf("error claiming rewards: %w", err) } return tx.Hash(), nil } diff --git a/rewards/rewards.go b/rewards/rewards.go index 50d711ae4..b22aa43ec 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -69,7 +69,7 @@ func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, e } index := new(*big.Int) if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { - return nil, fmt.Errorf("Could not get current reward index: %w", err) + return nil, fmt.Errorf("error getting current reward index: %w", err) } return *index, nil } @@ -82,7 +82,7 @@ func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTimeStart"); err != nil { - return time.Time{}, fmt.Errorf("Could not get claim interval time start: %w", err) + return time.Time{}, fmt.Errorf("error getting claim interval time start: %w", err) } return time.Unix((*unixTime).Int64(), 0), nil } @@ -95,7 +95,7 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. } unixTime := new(*big.Int) if err := rocketRewardsPool.Call(opts, unixTime, "getClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get claim interval time: %w", err) + return 0, fmt.Errorf("error getting claim interval time: %w", err) } return time.Duration((*unixTime).Int64()) * time.Second, nil } @@ -108,7 +108,7 @@ func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpt } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return nil, fmt.Errorf("Could not get node operator rewards percent: %w", err) + return nil, fmt.Errorf("error getting node operator rewards percent: %w", err) } return *perc, nil } @@ -121,7 +121,7 @@ func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind. } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return nil, fmt.Errorf("Could not get trusted node operator rewards percent: %w", err) + return nil, fmt.Errorf("error getting trusted node operator rewards percent: %w", err) } return *perc, nil } @@ -134,7 +134,7 @@ func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts } perc := new(*big.Int) if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { - return nil, fmt.Errorf("Could not get protocol DAO rewards percent: %w", err) + return nil, fmt.Errorf("error getting protocol DAO rewards percent: %w", err) } return *perc, nil } @@ -147,7 +147,7 @@ func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } rewards := new(*big.Int) if err := rocketRewardsPool.Call(opts, rewards, "getPendingRPLRewards"); err != nil { - return nil, fmt.Errorf("Could not get pending RPL rewards: %w", err) + return nil, fmt.Errorf("error getting pending RPL rewards: %w", err) } return *rewards, nil } @@ -160,7 +160,7 @@ func GetPendingETHRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } rewards := new(*big.Int) if err := rocketRewardsPool.Call(opts, rewards, "getPendingETHRewards"); err != nil { - return nil, fmt.Errorf("Could not get pending ETH rewards: %w", err) + return nil, fmt.Errorf("error getting pending ETH rewards: %w", err) } return *rewards, nil } @@ -175,7 +175,7 @@ func GetTrustedNodeSubmitted(rp *rocketpool.RocketPool, nodeAddress common.Addre indexBig := big.NewInt(0).SetUint64(rewardsIndex) hasSubmitted := new(bool) if err := rocketRewardsPool.Call(opts, hasSubmitted, "getTrustedNodeSubmitted", nodeAddress, indexBig); err != nil { - return false, fmt.Errorf("Could not get trusted node submission status: %w", err) + return false, fmt.Errorf("error getting trusted node submission status: %w", err) } return *hasSubmitted, nil } @@ -236,7 +236,7 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission } tx, err := rocketRewardsPool.Transact(opts, "submitRewardSnapshot", submission) if err != nil { - return common.Hash{}, fmt.Errorf("Could not submit rewards snapshot: %w", err) + return common.Hash{}, fmt.Errorf("error submitting rewards snapshot: %w", err) } return tx.Hash(), nil } diff --git a/rocketpool/abi.go b/rocketpool/abi.go index 59bdeef97..46e17a014 100644 --- a/rocketpool/abi.go +++ b/rocketpool/abi.go @@ -22,14 +22,14 @@ func DecodeAbi(abiEncoded string) (*abi.ABI, error) { // base64 decode abiCompressed, err := base64.StdEncoding.DecodeString(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode base64 data: %w", err) + return nil, fmt.Errorf("error decoding base64 data: %w", err) } // zlib decompress byteReader := bytes.NewReader(abiCompressed) zlibReader, err := zlib.NewReader(byteReader) if err != nil { - return nil, fmt.Errorf("Could not decompress zlib data: %w", err) + return nil, fmt.Errorf("error decompressing zlib data: %w", err) } defer func() { _ = zlibReader.Close() @@ -38,7 +38,7 @@ func DecodeAbi(abiEncoded string) (*abi.ABI, error) { // Parse ABI abiParsed, err := abi.JSON(zlibReader) if err != nil { - return nil, fmt.Errorf("Could not parse JSON: %w", err) + return nil, fmt.Errorf("error parsing JSON: %w", err) } decoderCache.Store(abiEncoded, &abiParsed) @@ -55,13 +55,13 @@ func EncodeAbiStr(abiStr string) (string, error) { var abiCompressed bytes.Buffer zlibWriter := zlib.NewWriter(&abiCompressed) if _, err := zlibWriter.Write([]byte(abiStr)); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + return "", fmt.Errorf("error zlib-compressing ABI string: %w", err) } if err := zlibWriter.Flush(); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + return "", fmt.Errorf("error zlib-compressing ABI string: %w", err) } if err := zlibWriter.Close(); err != nil { - return "", fmt.Errorf("Could not zlib-compress ABI string: %w", err) + return "", fmt.Errorf("error zlib-compressing ABI string: %w", err) } // base64 encode & return diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 70b101e64..598ed4140 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -75,7 +75,7 @@ func (c *Contract) Transact(opts *bind.TransactOpts, method string, params ...in if opts.GasLimit == 0 { input, err := c.ABI.Pack(method, params...) if err != nil { - return nil, fmt.Errorf("Could not encode input data: %w", err) + return nil, fmt.Errorf("error encoding input data: %w", err) } _, safeGasLimit, err := c.estimateGasLimit(opts, input) if err != nil { @@ -145,7 +145,7 @@ func (c *Contract) estimateGasLimit(opts *bind.TransactOpts, input []byte) (uint }) if err != nil { - return 0, 0, fmt.Errorf("Could not estimate gas needed: %w", c.normalizeErrorMessage(err)) + return 0, 0, fmt.Errorf("error estimating gas needed: %w", c.normalizeErrorMessage(err)) } // Pad and return gas limit @@ -213,7 +213,7 @@ func (c *Contract) GetTransactionEvents(txReceipt *types.Receipt, eventName stri // Unpack event event := reflect.New(eventType) if err := c.Contract.UnpackLog(event.Interface(), eventName, *log); err != nil { - return nil, fmt.Errorf("Could not unpack event data: %w", err) + return nil, fmt.Errorf("error unpacking event data: %w", err) } events = append(events, reflect.Indirect(event).Interface()) diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index 640b905bb..59e6c72d1 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -52,7 +52,7 @@ func NewRocketPool(client ExecutionClient, rocketStorageAddress common.Address) // Initialize RocketStorage contract rocketStorage, err := contracts.NewRocketStorage(rocketStorageAddress, client) if err != nil { - return nil, fmt.Errorf("Could not initialize Rocket Pool storage contract: %w", err) + return nil, fmt.Errorf("error initializing Rocket Pool storage contract: %w", err) } // Create a Contract for it @@ -99,7 +99,7 @@ func (rp *RocketPool) GetAddress(contractName string, opts *bind.CallOpts) (*com // Get address address, err := rp.RocketStorage.GetAddress(opts, crypto.Keccak256Hash([]byte("contract.address"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %s address: %w", contractName, err) + return nil, fmt.Errorf("error loading contract %s address: %w", contractName, err) } // Cache address @@ -160,13 +160,13 @@ func (rp *RocketPool) GetABI(contractName string, opts *bind.CallOpts) (*abi.ABI // Get ABI abiEncoded, err := rp.RocketStorage.GetString(opts, crypto.Keccak256Hash([]byte("contract.abi"), []byte(contractName))) if err != nil { - return nil, fmt.Errorf("Could not load contract %s ABI: %w", contractName, err) + return nil, fmt.Errorf("error loading contract %s ABI: %w", contractName, err) } // Decode ABI abi, err := DecodeAbi(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + return nil, fmt.Errorf("error decoding contract %s ABI: %w", contractName, err) } // Cache ABI diff --git a/rocketpool/version-interface.go b/rocketpool/version-interface.go index 99d41bc50..c78f27d52 100644 --- a/rocketpool/version-interface.go +++ b/rocketpool/version-interface.go @@ -35,7 +35,7 @@ func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bi // Parse ABI using the hardcoded string until the contract is deployed abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceAbiString)) if err != nil { - return 0, fmt.Errorf("Could not parse version interface JSON: %w", err) + return 0, fmt.Errorf("error parsing version interface JSON: %w", err) } versionAbi = &abiParsed } @@ -51,7 +51,7 @@ func GetContractVersion(rp *RocketPool, contractAddress common.Address, opts *bi // Get the contract version version := new(uint8) if err := contract.Call(opts, version, "version"); err != nil { - return 0, fmt.Errorf("Could not get contract version: %w", err) + return 0, fmt.Errorf("error getting contract version: %w", err) } return *version, nil @@ -63,7 +63,7 @@ func GetRocketVersionContractForAddress(rp *RocketPool, address common.Address) // Parse ABI using the hardcoded string until the contract is deployed abiParsed, err := abi.JSON(strings.NewReader(rocketVersionInterfaceAbiString)) if err != nil { - return nil, fmt.Errorf("Could not parse version interface JSON: %w", err) + return nil, fmt.Errorf("error parsing version interface JSON: %w", err) } versionAbi = &abiParsed } diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index 5a50859ac..e87724543 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -58,7 +58,7 @@ func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapp emptyAddress := common.Address{} address, err := rp.RocketStorage.GetAddress(nil, crypto.Keccak256Hash([]byte("contract.address"), []byte(legacyName))) if err != nil { - return nil, fmt.Errorf("Could not load v%s contract %s address: %w", m.GetVersion().String(), contractName, err) + return nil, fmt.Errorf("error loading v%s contract %s address: %w", m.GetVersion().String(), contractName, err) } if address == emptyAddress { @@ -70,7 +70,7 @@ func getLegacyContract(rp *RocketPool, contractName string, m LegacyVersionWrapp abiEncoded := m.GetEncodedABI(contractName) abi, err := DecodeAbi(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + return nil, fmt.Errorf("error decoding contract %s ABI: %w", contractName, err) } contract := &Contract{ @@ -90,7 +90,7 @@ func getLegacyContractWithAddress(rp *RocketPool, contractName string, address c abiEncoded := m.GetEncodedABI(contractName) abi, err := DecodeAbi(abiEncoded) if err != nil { - return nil, fmt.Errorf("Could not decode contract %s ABI: %w", contractName, err) + return nil, fmt.Errorf("error decoding contract %s ABI: %w", contractName, err) } contract := &Contract{ diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index e925cc61f..1d5a3e1e0 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -22,7 +22,7 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, } value := new(bool) if err := auctionSettingsContract.Call(opts, value, "getCreateLotEnabled"); err != nil { - return false, fmt.Errorf("Could not get lot creation enabled status: %w", err) + return false, fmt.Errorf("error getting lot creation enabled status: %w", err) } return *value, nil } @@ -35,7 +35,7 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e } value := new(bool) if err := auctionSettingsContract.Call(opts, value, "getBidOnLotEnabled"); err != nil { - return false, fmt.Errorf("Could not get lot bidding enabled status: %w", err) + return false, fmt.Errorf("error getting lot bidding enabled status: %w", err) } return *value, nil } @@ -48,7 +48,7 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } value := new(*big.Int) if err := auctionSettingsContract.Call(opts, value, "getLotMinimumEthValue"); err != nil { - return nil, fmt.Errorf("Could not get lot minimum ETH value: %w", err) + return nil, fmt.Errorf("error getting lot minimum ETH value: %w", err) } return *value, nil } @@ -61,7 +61,7 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } value := new(*big.Int) if err := auctionSettingsContract.Call(opts, value, "getLotMaximumEthValue"); err != nil { - return nil, fmt.Errorf("Could not get lot maximum ETH value: %w", err) + return nil, fmt.Errorf("error getting lot maximum ETH value: %w", err) } return *value, nil } @@ -74,7 +74,7 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } value := new(*big.Int) if err := auctionSettingsContract.Call(opts, value, "getLotDuration"); err != nil { - return 0, fmt.Errorf("Could not get lot duration: %w", err) + return 0, fmt.Errorf("error getting lot duration: %w", err) } return (*value).Uint64(), nil } @@ -87,7 +87,7 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } value := new(*big.Int) if err := auctionSettingsContract.Call(opts, value, "getStartingPriceRatio"); err != nil { - return 0, fmt.Errorf("Could not get lot starting price ratio: %w", err) + return 0, fmt.Errorf("error getting lot starting price ratio: %w", err) } return eth.WeiToEth(*value), nil } @@ -100,7 +100,7 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl } value := new(*big.Int) if err := auctionSettingsContract.Call(opts, value, "getReservePriceRatio"); err != nil { - return 0, fmt.Errorf("Could not get lot reserve price ratio: %w", err) + return 0, fmt.Errorf("error getting lot reserve price ratio: %w", err) } return eth.WeiToEth(*value), nil } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index a9bcf98af..97f6e0777 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -22,7 +22,7 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } value := new(*big.Int) if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalRate"); err != nil { - return 0, fmt.Errorf("Could not get inflation rate: %w", err) + return 0, fmt.Errorf("error getting inflation rate: %w", err) } return eth.WeiToEth(*value), nil } @@ -35,7 +35,7 @@ func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } value := new(*big.Int) if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalStartTime"); err != nil { - return 0, fmt.Errorf("Could not get inflation start time: %w", err) + return 0, fmt.Errorf("error getting inflation start time: %w", err) } return (*value).Uint64(), nil } diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 1c87dfcf1..48b550a07 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -22,7 +22,7 @@ func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (* } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getLaunchBalance"); err != nil { - return nil, fmt.Errorf("Could not get minipool launch balance: %w", err) + return nil, fmt.Errorf("error getting minipool launch balance: %w", err) } return *value, nil } @@ -35,7 +35,7 @@ func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Call } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getFullDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get full minipool deposit node amount: %w", err) + return nil, fmt.Errorf("error getting full minipool deposit node amount: %w", err) } return *value, nil } @@ -46,7 +46,7 @@ func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Call } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get half minipool deposit node amount: %w", err) + return nil, fmt.Errorf("error getting half minipool deposit node amount: %w", err) } return *value, nil } @@ -57,7 +57,7 @@ func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.Cal } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("Could not get empty minipool deposit node amount: %w", err) + return nil, fmt.Errorf("error getting empty minipool deposit node amount: %w", err) } return *value, nil } @@ -70,7 +70,7 @@ func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Call } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getFullDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get full minipool deposit user amount: %w", err) + return nil, fmt.Errorf("error getting full minipool deposit user amount: %w", err) } return *value, nil } @@ -81,7 +81,7 @@ func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Call } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get half minipool deposit user amount: %w", err) + return nil, fmt.Errorf("error getting half minipool deposit user amount: %w", err) } return *value, nil } @@ -92,7 +92,7 @@ func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.Cal } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { - return nil, fmt.Errorf("Could not get empty minipool deposit user amount: %w", err) + return nil, fmt.Errorf("error getting empty minipool deposit user amount: %w", err) } return *value, nil } @@ -105,7 +105,7 @@ func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind. } value := new(bool) if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { - return false, fmt.Errorf("Could not get minipool withdrawable submissions enabled status: %w", err) + return false, fmt.Errorf("error getting minipool withdrawable submissions enabled status: %w", err) } return *value, nil } @@ -118,7 +118,7 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (t } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { - return 0, fmt.Errorf("Could not get minipool launch timeout: %w", err) + return 0, fmt.Errorf("error getting minipool launch timeout: %w", err) } seconds := time.Duration((*value).Int64()) * time.Second return seconds, nil @@ -132,7 +132,7 @@ func GetMinipoolLaunchTimeoutRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { - return nil, fmt.Errorf("Could not get minipool launch timeout: %w", err) + return nil, fmt.Errorf("error getting minipool launch timeout: %w", err) } return *value, nil } @@ -145,7 +145,7 @@ func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bo } value := new(bool) if err := minipoolSettingsContract.Call(opts, value, "getBondReductionEnabled"); err != nil { - return false, fmt.Errorf("Could not get bond reduction enabled status: %w", err) + return false, fmt.Errorf("error getting bond reduction enabled status: %w", err) } return *value, nil } diff --git a/settings/protocol/network.go b/settings/protocol/network.go index e9e75a9d1..2ec5f5668 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -22,7 +22,7 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getNodeConsensusThreshold"); err != nil { - return 0, fmt.Errorf("Could not get trusted node consensus threshold: %w", err) + return 0, fmt.Errorf("error getting trusted node consensus threshold: %w", err) } return eth.WeiToEth(*value), nil } @@ -35,7 +35,7 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } value := new(bool) if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEnabled"); err != nil { - return false, fmt.Errorf("Could not get network balance submissions enabled status: %w", err) + return false, fmt.Errorf("error getting network balance submissions enabled status: %w", err) } return *value, nil } @@ -48,7 +48,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { - return 0, fmt.Errorf("Could not get network balance submission frequency: %w", err) + return 0, fmt.Errorf("error getting network balance submission frequency: %w", err) } return (*value).Uint64(), nil } @@ -61,7 +61,7 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } value := new(bool) if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEnabled"); err != nil { - return false, fmt.Errorf("Could not get network price submissions enabled status: %w", err) + return false, fmt.Errorf("error getting network price submissions enabled status: %w", err) } return *value, nil } @@ -74,7 +74,7 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { - return 0, fmt.Errorf("Could not get network price submission frequency: %w", err) + return 0, fmt.Errorf("error getting network price submission frequency: %w", err) } return (*value).Uint64(), nil } @@ -87,7 +87,7 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getMinimumNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get minimum node fee: %w", err) + return 0, fmt.Errorf("error getting minimum node fee: %w", err) } return eth.WeiToEth(*value), nil } @@ -100,7 +100,7 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getTargetNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get target node fee: %w", err) + return 0, fmt.Errorf("error getting target node fee: %w", err) } return eth.WeiToEth(*value), nil } @@ -113,7 +113,7 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getMaximumNodeFee"); err != nil { - return 0, fmt.Errorf("Could not get maximum node fee: %w", err) + return 0, fmt.Errorf("error getting maximum node fee: %w", err) } return eth.WeiToEth(*value), nil } @@ -126,7 +126,7 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getNodeFeeDemandRange"); err != nil { - return nil, fmt.Errorf("Could not get node fee demand range: %w", err) + return nil, fmt.Errorf("error getting node fee demand range: %w", err) } return *value, nil } @@ -139,7 +139,7 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := networkSettingsContract.Call(opts, value, "getTargetRethCollateralRate"); err != nil { - return 0, fmt.Errorf("Could not get target rETH contract collateralization rate: %w", err) + return 0, fmt.Errorf("error getting target rETH contract collateralization rate: %w", err) } return eth.WeiToEth(*value), nil } diff --git a/settings/protocol/node.go b/settings/protocol/node.go index 5bd8d775a..b0fa60732 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -22,7 +22,7 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(bool) if err := nodeSettingsContract.Call(opts, value, "getRegistrationEnabled"); err != nil { - return false, fmt.Errorf("Could not get node registrations enabled status: %w", err) + return false, fmt.Errorf("error getting node registrations enabled status: %w", err) } return *value, nil } @@ -35,7 +35,7 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool } value := new(bool) if err := nodeSettingsContract.Call(opts, value, "getDepositEnabled"); err != nil { - return false, fmt.Errorf("Could not get node deposits enabled status: %w", err) + return false, fmt.Errorf("error getting node deposits enabled status: %w", err) } return *value, nil } @@ -48,7 +48,7 @@ func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } value := new(bool) if err := nodeSettingsContract.Call(opts, value, "getVacantMinipoolsEnabled"); err != nil { - return false, fmt.Errorf("Could not get vacant minipools enabled status: %w", err) + return false, fmt.Errorf("error getting vacant minipools enabled status: %w", err) } return *value, nil } @@ -61,7 +61,7 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { - return 0, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + return 0, fmt.Errorf("error getting minimum RPL stake per minipool: %w", err) } return eth.WeiToEth(*value), nil } @@ -74,7 +74,7 @@ func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpt } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil { - return nil, fmt.Errorf("Could not get minimum RPL stake per minipool: %w", err) + return nil, fmt.Errorf("error getting minimum RPL stake per minipool: %w", err) } return *value, nil } @@ -87,7 +87,7 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { - return 0, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + return 0, fmt.Errorf("error getting maximum RPL stake per minipool: %w", err) } return eth.WeiToEth(*value), nil } @@ -100,7 +100,7 @@ func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpt } value := new(*big.Int) if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil { - return nil, fmt.Errorf("Could not get maximum RPL stake per minipool: %w", err) + return nil, fmt.Errorf("error getting maximum RPL stake per minipool: %w", err) } return *value, nil } diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 5628eab0a..01a4640ba 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -22,7 +22,7 @@ func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts } value := new(*big.Int) if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPerc", contractName); err != nil { - return 0, fmt.Errorf("Could not get rewards claimer percent: %w", err) + return 0, fmt.Errorf("error getting rewards claimer percent: %w", err) } return eth.WeiToEth(*value), nil } @@ -35,7 +35,7 @@ func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName st } value := new(*big.Int) if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercTimeUpdated", contractName); err != nil { - return 0, fmt.Errorf("Could not get rewards claimer updated time: %w", err) + return 0, fmt.Errorf("error getting rewards claimer updated time: %w", err) } return (*value).Uint64(), nil } @@ -48,7 +48,7 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersPercTotal"); err != nil { - return 0, fmt.Errorf("Could not get rewards claimers total percent: %w", err) + return 0, fmt.Errorf("error getting rewards claimers total percent: %w", err) } return eth.WeiToEth(*value), nil } @@ -61,7 +61,7 @@ func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalTime"); err != nil { - return 0, fmt.Errorf("Could not get rewards claim interval: %w", err) + return 0, fmt.Errorf("error getting rewards claim interval: %w", err) } return (*value).Uint64(), nil } diff --git a/settings/trustednode/members.go b/settings/trustednode/members.go index 65ff723fd..043ffbe6f 100644 --- a/settings/trustednode/members.go +++ b/settings/trustednode/members.go @@ -33,7 +33,7 @@ func GetQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getQuorum"); err != nil { - return 0, fmt.Errorf("Could not get member quorum threshold: %w", err) + return 0, fmt.Errorf("error getting member quorum threshold: %w", err) } return eth.WeiToEth(*value), nil } @@ -52,7 +52,7 @@ func GetRPLBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getRPLBond"); err != nil { - return nil, fmt.Errorf("Could not get member RPL bond amount: %w", err) + return nil, fmt.Errorf("error getting member RPL bond amount: %w", err) } return *value, nil } @@ -71,7 +71,7 @@ func GetMinipoolUnbondedMax(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMax"); err != nil { - return 0, fmt.Errorf("Could not get member unbonded minipool limit: %w", err) + return 0, fmt.Errorf("error getting member unbonded minipool limit: %w", err) } return (*value).Uint64(), nil } @@ -90,7 +90,7 @@ func GetMinipoolUnbondedMinFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getMinipoolUnbondedMinFee"); err != nil { - return 0, fmt.Errorf("Could not get member unbonded minipool minimum fee: %w", err) + return 0, fmt.Errorf("error getting member unbonded minipool minimum fee: %w", err) } return (*value).Uint64(), nil } @@ -109,7 +109,7 @@ func GetChallengeCooldown(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint6 } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getChallengeCooldown"); err != nil { - return 0, fmt.Errorf("Could not get member challenge cooldown period: %w", err) + return 0, fmt.Errorf("error getting member challenge cooldown period: %w", err) } return (*value).Uint64(), nil } @@ -128,7 +128,7 @@ func GetChallengeWindow(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getChallengeWindow"); err != nil { - return 0, fmt.Errorf("Could not get member challenge window period: %w", err) + return 0, fmt.Errorf("error getting member challenge window period: %w", err) } return (*value).Uint64(), nil } @@ -147,7 +147,7 @@ func GetChallengeCost(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, } value := new(*big.Int) if err := membersSettingsContract.Call(opts, value, "getChallengeCost"); err != nil { - return nil, fmt.Errorf("Could not get member challenge cost: %w", err) + return nil, fmt.Errorf("error getting member challenge cost: %w", err) } return *value, nil } diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index ed1a48d32..6e98e806a 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -30,7 +30,7 @@ func GetScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getScrubPeriod"); err != nil { - return 0, fmt.Errorf("Could not get scrub period: %w", err) + return 0, fmt.Errorf("error getting scrub period: %w", err) } return (*value).Uint64(), nil } @@ -49,7 +49,7 @@ func GetPromotionScrubPeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getPromotionScrubPeriod"); err != nil { - return 0, fmt.Errorf("Could not get promotion scrub period: %w", err) + return 0, fmt.Errorf("error getting promotion scrub period: %w", err) } return (*value).Uint64(), nil } @@ -68,7 +68,7 @@ func GetScrubPenaltyEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } value := new(bool) if err := minipoolSettingsContract.Call(opts, value, "getScrubPenaltyEnabled"); err != nil { - return false, fmt.Errorf("Could not get scrub penalty setting: %w", err) + return false, fmt.Errorf("error getting scrub penalty setting: %w", err) } return (*value), nil } @@ -87,7 +87,7 @@ func GetBondReductionWindowStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getBondReductionWindowStart"); err != nil { - return 0, fmt.Errorf("Could not get bond reduction window start: %w", err) + return 0, fmt.Errorf("error getting bond reduction window start: %w", err) } return (*value).Uint64(), nil } @@ -106,7 +106,7 @@ func GetBondReductionWindowLength(rp *rocketpool.RocketPool, opts *bind.CallOpts } value := new(*big.Int) if err := minipoolSettingsContract.Call(opts, value, "getBondReductionWindowLength"); err != nil { - return 0, fmt.Errorf("Could not get bond reduction window length: %w", err) + return 0, fmt.Errorf("error getting bond reduction window length: %w", err) } return (*value).Uint64(), nil } diff --git a/settings/trustednode/proposals.go b/settings/trustednode/proposals.go index 2ff83b00c..e3fb61fd8 100644 --- a/settings/trustednode/proposals.go +++ b/settings/trustednode/proposals.go @@ -30,7 +30,7 @@ func GetProposalCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } value := new(*big.Int) if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal cooldown period: %w", err) + return 0, fmt.Errorf("error getting proposal cooldown period: %w", err) } return (*value).Uint64(), nil } @@ -49,7 +49,7 @@ func GetProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64 } value := new(*big.Int) if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal voting period: %w", err) + return 0, fmt.Errorf("error getting proposal voting period: %w", err) } return (*value).Uint64(), nil } @@ -68,7 +68,7 @@ func GetProposalVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } value := new(*big.Int) if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal voting delay: %w", err) + return 0, fmt.Errorf("error getting proposal voting delay: %w", err) } return (*value).Uint64(), nil } @@ -87,7 +87,7 @@ func GetProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } value := new(*big.Int) if err := proposalsSettingsContract.Call(opts, value, "getExecuteTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal execution period: %w", err) + return 0, fmt.Errorf("error getting proposal execution period: %w", err) } return (*value).Uint64(), nil } @@ -106,7 +106,7 @@ func GetProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } value := new(*big.Int) if err := proposalsSettingsContract.Call(opts, value, "getActionTime"); err != nil { - return 0, fmt.Errorf("Could not get proposal action period: %w", err) + return 0, fmt.Errorf("error getting proposal action period: %w", err) } return (*value).Uint64(), nil } diff --git a/settings/trustednode/rewards.go b/settings/trustednode/rewards.go index 68750e440..1381aa910 100644 --- a/settings/trustednode/rewards.go +++ b/settings/trustednode/rewards.go @@ -24,7 +24,7 @@ func GetNetworkEnabled(rp *rocketpool.RocketPool, network *big.Int, opts *bind.C } value := new(bool) if err := rewardsSettingsContract.Call(opts, value, "getNetworkEnabled", network); err != nil { - return false, fmt.Errorf("Could not check if network %s is enabled: %w", network.String(), err) + return false, fmt.Errorf("error checking if network %s is enabled: %w", network.String(), err) } return (*value), nil } diff --git a/storage/address-queue-storage.go b/storage/address-queue-storage.go index f17f02f2c..506e17226 100644 --- a/storage/address-queue-storage.go +++ b/storage/address-queue-storage.go @@ -20,7 +20,7 @@ func GetAddressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [ } length := new(*big.Int) if err := addressQueueStorage.Call(opts, length, "getIndexOf", key); err != nil { - return 0, fmt.Errorf("Could not get address queue length for key: %w", key, err) + return 0, fmt.Errorf("error getting address queue length for key: %w", key, err) } return (*length).Uint64(), nil } @@ -33,7 +33,7 @@ func GetAddressQueueItem(rp *rocketpool.RocketPool, opts *bind.CallOpts, key [32 } address := new(common.Address) if err := addressQueueStorage.Call(opts, address, "getItem", key, index); err != nil { - return common.Address{}, fmt.Errorf("Could not get address item at index %d: %w", index, key, err) + return common.Address{}, fmt.Errorf("error getting address item at index %d: %w", index, key, err) } return *address, nil } @@ -46,7 +46,7 @@ func GetAddressQueueIndexOf(rp *rocketpool.RocketPool, opts *bind.CallOpts, key } index := new(*big.Int) if err := addressQueueStorage.Call(opts, index, "getIndexOf", key, address); err != nil { - return 0, fmt.Errorf("Could not get index for address %s: %w", address.String(), err) + return 0, fmt.Errorf("error getting index for address %s: %w", address.String(), err) } return (*index).Int64(), nil } diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go index b2704b8bb..513e7d46f 100644 --- a/storage/rocket-storage.go +++ b/storage/rocket-storage.go @@ -12,7 +12,7 @@ import ( func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { withdrawalAddress := new(common.Address) if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodeWithdrawalAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s withdrawal address: %w", nodeAddress.Hex(), err) + return common.Address{}, fmt.Errorf("error getting node %s withdrawal address: %w", nodeAddress.Hex(), err) } return *withdrawalAddress, nil } @@ -21,7 +21,7 @@ func GetNodeWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Addr func GetNodePendingWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { withdrawalAddress := new(common.Address) if err := rp.RocketStorageContract.Call(opts, withdrawalAddress, "getNodePendingWithdrawalAddress", nodeAddress); err != nil { - return common.Address{}, fmt.Errorf("Could not get node %s pending withdrawal address: %w", nodeAddress.Hex(), err) + return common.Address{}, fmt.Errorf("error getting node %s pending withdrawal address: %w", nodeAddress.Hex(), err) } return *withdrawalAddress, nil } @@ -35,7 +35,7 @@ func EstimateSetWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress comm func SetWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { tx, err := rp.RocketStorageContract.Transact(opts, "setWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) if err != nil { - return common.Hash{}, fmt.Errorf("Could not set node withdrawal address: %w", err) + return common.Hash{}, fmt.Errorf("error setting node withdrawal address: %w", err) } return tx.Hash(), nil } @@ -49,7 +49,7 @@ func EstimateConfirmWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { tx, err := rp.RocketStorageContract.Transact(opts, "confirmWithdrawalAddress", nodeAddress) if err != nil { - return common.Hash{}, fmt.Errorf("Could not confirm node withdrawal address: %w", err) + return common.Hash{}, fmt.Errorf("error confirming node withdrawal address: %w", err) } return tx.Hash(), nil } diff --git a/tests/minipool/contract_test.go b/tests/minipool/contract_test.go index b044b0bb8..679354d7e 100644 --- a/tests/minipool/contract_test.go +++ b/tests/minipool/contract_test.go @@ -72,7 +72,7 @@ func TestDetails(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool @@ -255,7 +255,7 @@ func TestStake(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool @@ -421,7 +421,7 @@ func TestWithdrawValidatorBalance(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool @@ -539,7 +539,7 @@ func TestWithdrawValidatorBalanceAndFinalise(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool diff --git a/tests/minipool/minipool_test.go b/tests/minipool/minipool_test.go index e7f050683..82b48b9a9 100644 --- a/tests/minipool/minipool_test.go +++ b/tests/minipool/minipool_test.go @@ -71,7 +71,7 @@ func TestMinipoolDetails(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { diff --git a/tests/minipool/status_test.go b/tests/minipool/status_test.go index a3df53955..c22a4c880 100644 --- a/tests/minipool/status_test.go +++ b/tests/minipool/status_test.go @@ -49,7 +49,7 @@ func TestSubmitMinipoolWithdrawable(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } if err := minipoolutils.StakeMinipool(rp, mp, nodeAccount); err != nil { diff --git a/tests/node/staking_test.go b/tests/node/staking_test.go index 759b00abb..00aa3b85c 100644 --- a/tests/node/staking_test.go +++ b/tests/node/staking_test.go @@ -161,7 +161,7 @@ func TestStakeRPL(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool diff --git a/tests/rewards/node_test.go b/tests/rewards/node_test.go index d4457aeba..0c1d5c45c 100644 --- a/tests/rewards/node_test.go +++ b/tests/rewards/node_test.go @@ -96,7 +96,7 @@ func TestNodeRewards(t *testing.T) { } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - t.Fatal(fmt.Errorf("Could not increase time: %w", err)) + t.Fatal(fmt.Errorf("error increasing time: %w", err)) } // Stake minipool diff --git a/tests/rocketpool/rocketpool_test.go b/tests/rocketpool/rocketpool_test.go index 617b6a34a..4c23c15be 100644 --- a/tests/rocketpool/rocketpool_test.go +++ b/tests/rocketpool/rocketpool_test.go @@ -13,7 +13,7 @@ func TestGetAddress(t *testing.T) { // Get contract address address1, err := rp.GetAddress("rocketDepositPool") if err != nil { - t.Fatalf("Could not get contract address: %s", err) + t.Fatalf("error getting contract address: %s", err) } else if bytes.Equal(address1.Bytes(), common.Address{}.Bytes()) { t.Error("Contract address was not found") } @@ -21,7 +21,7 @@ func TestGetAddress(t *testing.T) { // Get cached contract address address2, err := rp.GetAddress("rocketDepositPool") if err != nil { - t.Fatalf("Could not get cached contract address: %s", err) + t.Fatalf("error getting cached contract address: %s", err) } else if !bytes.Equal(address2.Bytes(), address1.Bytes()) { t.Error("Cached contract address did not match original contract address") } @@ -33,7 +33,7 @@ func TestGetAddresses(t *testing.T) { // Get contract addresses addresses1, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Fatalf("Could not get contract addresses: %s", err) + t.Fatalf("error getting contract addresses: %s", err) } else { for ai, address := range addresses1 { if bytes.Equal(address.Bytes(), common.Address{}.Bytes()) { @@ -45,7 +45,7 @@ func TestGetAddresses(t *testing.T) { // Get cached contract addresses addresses2, err := rp.GetAddresses("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Fatalf("Could not get cached contract addresses: %s", err) + t.Fatalf("error getting cached contract addresses: %s", err) } else { for ai := 0; ai < len(addresses2); ai++ { if !bytes.Equal(addresses2[ai].Bytes(), addresses1[ai].Bytes()) { @@ -61,13 +61,13 @@ func TestGetABI(t *testing.T) { // Get ABI abi1, err := rp.GetABI("rocketDepositPool") if err != nil { - t.Fatalf("Could not get contract ABI: %s", err) + t.Fatalf("error getting contract ABI: %s", err) } // Get cached ABI abi2, err := rp.GetABI("rocketDepositPool") if err != nil { - t.Fatalf("Could not get cached contract ABI: %s", err) + t.Fatalf("error getting cached contract ABI: %s", err) } else { abi2Json, err := json.Marshal(abi2) if err != nil { @@ -89,13 +89,13 @@ func TestGetABIs(t *testing.T) { // Get ABIs abis1, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Fatalf("Could not get contract ABIs: %s", err) + t.Fatalf("error getting contract ABIs: %s", err) } // Get cached ABIs abis2, err := rp.GetABIs("rocketNodeManager", "rocketNodeDeposit") if err != nil { - t.Fatalf("Could not get cached contract ABIs: %s", err) + t.Fatalf("error getting cached contract ABIs: %s", err) } else { for ai := 0; ai < len(abis2); ai++ { abi2Json, err := json.Marshal(abis2[ai]) @@ -118,12 +118,12 @@ func TestGetContract(t *testing.T) { // Get contract if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Fatalf("Could not get contract: %s", err) + t.Fatalf("error getting contract: %s", err) } // Get cached contract if _, err := rp.GetContract("rocketDepositPool"); err != nil { - t.Fatalf("Could not get cached contract: %s", err) + t.Fatalf("error getting cached contract: %s", err) } } @@ -132,12 +132,12 @@ func TestGetContracts(t *testing.T) { // Get contracts if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Fatalf("Could not get contracts: %s", err) + t.Fatalf("error getting contracts: %s", err) } // Get cached contracts if _, err := rp.GetContracts("rocketNodeManager", "rocketNodeDeposit"); err != nil { - t.Fatalf("Could not get cached contracts: %s", err) + t.Fatalf("error getting cached contracts: %s", err) } } @@ -146,12 +146,12 @@ func TestMakeContract(t *testing.T) { // Make contract if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x1111111111111111111111111111111111111111")); err != nil { - t.Fatalf("Could not make contract: %s", err) + t.Fatalf("error making contract: %s", err) } // Make contract with cached ABI if _, err := rp.MakeContract("rocketMinipool", common.HexToAddress("0x2222222222222222222222222222222222222222")); err != nil { - t.Fatalf("Could not make contract with cached ABI: %s", err) + t.Fatalf("error making contract with cached ABI: %s", err) } } diff --git a/tests/testutils/auction/auction.go b/tests/testutils/auction/auction.go index f6b920b6c..4f9427a54 100644 --- a/tests/testutils/auction/auction.go +++ b/tests/testutils/auction/auction.go @@ -51,7 +51,7 @@ func CreateSlashedRPL(t *testing.T, rp *rocketpool.RocketPool, ownerAccount *acc } err = evm.IncreaseTime(int(scrubPeriod + 1)) if err != nil { - return fmt.Errorf("Could not increase time: %w", err) + return fmt.Errorf("error increasing time: %w", err) } // Stake minipool diff --git a/tests/testutils/minipool/minipool.go b/tests/testutils/minipool/minipool.go index 5fe51a72d..30680106e 100644 --- a/tests/testutils/minipool/minipool.go +++ b/tests/testutils/minipool/minipool.go @@ -41,7 +41,7 @@ func CreateMinipool(t *testing.T, rp *rocketpool.RocketPool, ownerAccount, nodeA // Do the node deposit to generate the minipool expectedMinipoolAddress, txReceipt, err := nodeutils.Deposit(t, rp, nodeAccount, depositAmount, pubkey) if err != nil { - return nil, fmt.Errorf("Could not do node deposit: %w", err) + return nil, fmt.Errorf("error doing node deposit: %w", err) } // Get minipool manager contract @@ -53,7 +53,7 @@ func CreateMinipool(t *testing.T, rp *rocketpool.RocketPool, ownerAccount, nodeA // Get created minipool address minipoolCreatedEvents, err := rocketMinipoolManager.GetTransactionEvents(txReceipt, "MinipoolCreated", minipoolCreated{}) if err != nil || len(minipoolCreatedEvents) == 0 { - return nil, errors.New("Could not get minipool created event") + return nil, errors.New("error getting minipool created event") } minipoolAddress := minipoolCreatedEvents[0].(minipoolCreated).Minipool diff --git a/tests/testutils/tokens/rpl/rpl.go b/tests/testutils/tokens/rpl/rpl.go index 6a8be2253..443d20a76 100644 --- a/tests/testutils/tokens/rpl/rpl.go +++ b/tests/testutils/tokens/rpl/rpl.go @@ -42,7 +42,7 @@ func MintFixedSupplyRPL(rp *rocketpool.RocketPool, ownerAccount *accounts.Accoun return err } if _, err := rocketTokenFixedSupplyRPL.Transact(ownerAccount.GetTransactor(), "mint", toAccount.Address, amount); err != nil { - return fmt.Errorf("Could not mint fixed-supply RPL tokens to %s: %w", toAccount.Address.Hex(), err) + return fmt.Errorf("error minting fixed-supply RPL tokens to %s: %w", toAccount.Address.Hex(), err) } return nil } diff --git a/tokens/reth.go b/tokens/reth.go index 337e40d69..a65a57b4b 100644 --- a/tokens/reth.go +++ b/tokens/reth.go @@ -118,7 +118,7 @@ func GetETHValueOfRETH(rp *rocketpool.RocketPool, rethAmount *big.Int, opts *bin } ethValue := new(*big.Int) if err := rocketTokenRETH.Call(opts, ethValue, "getEthValue", rethAmount); err != nil { - return nil, fmt.Errorf("Could not get ETH value of rETH amount: %w", err) + return nil, fmt.Errorf("error getting ETH value of rETH amount: %w", err) } return *ethValue, nil } @@ -131,7 +131,7 @@ func GetRETHValueOfETH(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind } rethValue := new(*big.Int) if err := rocketTokenRETH.Call(opts, rethValue, "getRethValue", ethAmount); err != nil { - return nil, fmt.Errorf("Could not get rETH value of ETH amount: %w", err) + return nil, fmt.Errorf("error getting rETH value of ETH amount: %w", err) } return *rethValue, nil } @@ -144,7 +144,7 @@ func GetRETHExchangeRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float6 } exchangeRate := new(*big.Int) if err := rocketTokenRETH.Call(opts, exchangeRate, "getExchangeRate"); err != nil { - return 0, fmt.Errorf("Could not get rETH exchange rate: %w", err) + return 0, fmt.Errorf("error getting rETH exchange rate: %w", err) } return eth.WeiToEth(*exchangeRate), nil } @@ -157,7 +157,7 @@ func GetRETHTotalCollateral(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*bi } totalCollateral := new(*big.Int) if err := rocketTokenRETH.Call(opts, totalCollateral, "getTotalCollateral"); err != nil { - return nil, fmt.Errorf("Could not get rETH total collateral: %w", err) + return nil, fmt.Errorf("error getting rETH total collateral: %w", err) } return *totalCollateral, nil } @@ -170,7 +170,7 @@ func GetRETHCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } collateralRate := new(*big.Int) if err := rocketTokenRETH.Call(opts, collateralRate, "getCollateralRate"); err != nil { - return 0, fmt.Errorf("Could not get rETH collateral rate: %w", err) + return 0, fmt.Errorf("error getting rETH collateral rate: %w", err) } return eth.WeiToEth(*collateralRate), nil } @@ -192,7 +192,7 @@ func BurnRETH(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpt } tx, err := rocketTokenRETH.Transact(opts, "burn", amount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not burn rETH: %w", err) + return common.Hash{}, fmt.Errorf("error burning rETH: %w", err) } return tx.Hash(), nil } diff --git a/tokens/rpl.go b/tokens/rpl.go index e7825567f..a9e61debc 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -117,7 +117,7 @@ func MintInflationRPL(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } tx, err := rocketTokenRPL.Transact(opts, "inflationMintTokens") if err != nil { - return common.Hash{}, fmt.Errorf("Could not mint RPL tokens from inflation: %w", err) + return common.Hash{}, fmt.Errorf("error minting RPL tokens from inflation: %w", err) } return tx.Hash(), nil } @@ -139,7 +139,7 @@ func SwapFixedSupplyRPLForRPL(rp *rocketpool.RocketPool, amount *big.Int, opts * } tx, err := rocketTokenRPL.Transact(opts, "swapTokens", amount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not swap fixed-supply RPL for new RPL: %w", err) + return common.Hash{}, fmt.Errorf("error swapping fixed-supply RPL for new RPL: %w", err) } return tx.Hash(), nil } @@ -152,7 +152,7 @@ func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } rate := new(*big.Int) if err := rocketTokenRPL.Call(opts, rate, "getInflationIntervalRate"); err != nil { - return nil, fmt.Errorf("Could not get RPL inflation interval rate: %w", err) + return nil, fmt.Errorf("error getting RPL inflation interval rate: %w", err) } return *rate, nil } diff --git a/tokens/tokens.go b/tokens/tokens.go index 286f98de9..340b76c95 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -86,7 +86,7 @@ func contractETHBalance(rp *rocketpool.RocketPool, tokenContract *rocketpool.Con func totalSupply(tokenContract *rocketpool.Contract, tokenName string, opts *bind.CallOpts) (*big.Int, error) { totalSupply := new(*big.Int) if err := tokenContract.Call(opts, totalSupply, "totalSupply"); err != nil { - return nil, fmt.Errorf("Could not get %s total supply: %w", tokenName, err) + return nil, fmt.Errorf("error getting %s total supply: %w", tokenName, err) } return *totalSupply, nil } @@ -95,7 +95,7 @@ func totalSupply(tokenContract *rocketpool.Contract, tokenName string, opts *bin func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address common.Address, opts *bind.CallOpts) (*big.Int, error) { balance := new(*big.Int) if err := tokenContract.Call(opts, balance, "balanceOf", address); err != nil { - return nil, fmt.Errorf("Could not get %s balance of %s: %w", tokenName, address.Hex(), err) + return nil, fmt.Errorf("error getting %s balance of %s: %w", tokenName, address.Hex(), err) } return *balance, nil } @@ -104,7 +104,7 @@ func balanceOf(tokenContract *rocketpool.Contract, tokenName string, address com func allowance(tokenContract *rocketpool.Contract, tokenName string, owner, spender common.Address, opts *bind.CallOpts) (*big.Int, error) { allowance := new(*big.Int) if err := tokenContract.Call(opts, allowance, "allowance", owner, spender); err != nil { - return nil, fmt.Errorf("Could not get %s allowance of %s for %s: %w", tokenName, spender.Hex(), owner.Hex(), err) + return nil, fmt.Errorf("error getting %s allowance of %s for %s: %w", tokenName, spender.Hex(), owner.Hex(), err) } return *allowance, nil } @@ -118,7 +118,7 @@ func estimateTransferGas(tokenContract *rocketpool.Contract, tokenName string, t func transfer(tokenContract *rocketpool.Contract, tokenName string, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { tx, err := tokenContract.Transact(opts, "transfer", to, amount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not transfer %s to %s: %w", tokenName, to.Hex(), err) + return common.Hash{}, fmt.Errorf("error transferring %s to %s: %w", tokenName, to.Hex(), err) } return tx.Hash(), nil } @@ -132,7 +132,7 @@ func estimateApproveGas(tokenContract *rocketpool.Contract, tokenName string, sp func approve(tokenContract *rocketpool.Contract, tokenName string, spender common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { tx, err := tokenContract.Transact(opts, "approve", spender, amount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not approve %s allowance for %s: %w", tokenName, spender.Hex(), err) + return common.Hash{}, fmt.Errorf("error approving %s allowance for %s: %w", tokenName, spender.Hex(), err) } return tx.Hash(), nil } @@ -146,7 +146,7 @@ func estimateTransferFromGas(tokenContract *rocketpool.Contract, tokenName strin func transferFrom(tokenContract *rocketpool.Contract, tokenName string, from, to common.Address, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { tx, err := tokenContract.Transact(opts, "transferFrom", from, to, amount) if err != nil { - return common.Hash{}, fmt.Errorf("Could not transfer %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) + return common.Hash{}, fmt.Errorf("error transferring %s from %s to %s: %w", tokenName, from.Hex(), to.Hex(), err) } return tx.Hash(), nil } From a3de673181712f34e6ed9f4f2aeb09526c84fdb9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 21 Sep 2023 00:52:20 -0400 Subject: [PATCH 645/878] Implemented most of the pDAO proposers --- settings/protocol/auction.go | 56 ++++++++++- settings/protocol/inflation.go | 4 +- settings/protocol/minipool.go | 167 +++++++++++++++++---------------- settings/protocol/network.go | 137 ++++++++++++++++++++++++++- settings/protocol/node.go | 62 +++++++++++- settings/protocol/rewards.go | 19 +++- 6 files changed, 356 insertions(+), 89 deletions(-) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index 1d5a3e1e0..f085ac221 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -6,13 +6,25 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Config -const AuctionSettingsContractName = "rocketDAOProtocolSettingsAuction" +const ( + AuctionSettingsContractName string = "rocketDAOProtocolSettingsAuction" + CreateLotEnabledSettingPath string = "auction.lot.create.enabled" + BidOnLotEnabledSettingPath string = "auction.lot.bidding.enabled" + LotMinimumEthValueSettingPath string = "auction.lot.value.minimum" + LotMaximumEthValueSettingPath string = "auction.lot.value.maximu" + LotDurationSettingPath string = "auction.lot.duration" + LotStartingPriceRatioSettingPath string = "auction.price.start" + LotReservePriceRatioSettingPath string = "auction.price.reserve" +) // Lot creation currently enabled func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -26,6 +38,12 @@ func GetCreateLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, } return *value, nil } +func ProposeCreateLotEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", CreateLotEnabledSettingPath), AuctionSettingsContractName, CreateLotEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeCreateLotEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", CreateLotEnabledSettingPath), AuctionSettingsContractName, CreateLotEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Lot bidding currently enabled func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -39,6 +57,12 @@ func GetBidOnLotEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e } return *value, nil } +func ProposeBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", BidOnLotEnabledSettingPath), AuctionSettingsContractName, BidOnLotEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeBidOnLotEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", BidOnLotEnabledSettingPath), AuctionSettingsContractName, BidOnLotEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // The minimum lot size in ETH value func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -52,6 +76,12 @@ func GetLotMinimumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } +func ProposeLotMinimumEthValue(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotMinimumEthValueSettingPath), AuctionSettingsContractName, LotMinimumEthValueSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeLotMinimumEthValueGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotMinimumEthValueSettingPath), AuctionSettingsContractName, LotMinimumEthValueSettingPath, value, blockNumber, treeNodes, opts) +} // The maximum lot size in ETH value func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -65,6 +95,12 @@ func GetLotMaximumEthValue(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } +func ProposeLotMaximumEthValue(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotMaximumEthValueSettingPath), AuctionSettingsContractName, LotMaximumEthValueSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeLotMaximumEthValueGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotMaximumEthValueSettingPath), AuctionSettingsContractName, LotMaximumEthValueSettingPath, value, blockNumber, treeNodes, opts) +} // The lot duration in blocks func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -78,6 +114,12 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } return (*value).Uint64(), nil } +func ProposeLotDuration(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotDurationSettingPath), AuctionSettingsContractName, LotDurationSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeLotDurationGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotDurationSettingPath), AuctionSettingsContractName, LotDurationSettingPath, value, blockNumber, treeNodes, opts) +} // The starting price relative to current ETH price, as a fraction func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -91,6 +133,12 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } +func ProposeLotStartingPriceRatio(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotStartingPriceRatioSettingPath), AuctionSettingsContractName, LotStartingPriceRatioSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeLotStartingPriceRatioGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotStartingPriceRatioSettingPath), AuctionSettingsContractName, LotStartingPriceRatioSettingPath, value, blockNumber, treeNodes, opts) +} // The reserve price relative to current ETH price, as a fraction func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -104,6 +152,12 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl } return eth.WeiToEth(*value), nil } +func ProposeLotReservePriceRatio(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotReservePriceRatioSettingPath), AuctionSettingsContractName, LotReservePriceRatioSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeLotReservePriceRatioGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotReservePriceRatioSettingPath), AuctionSettingsContractName, LotReservePriceRatioSettingPath, value, blockNumber, treeNodes, opts) +} // Get contracts var auctionSettingsContractLock sync.Mutex diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 97f6e0777..64967f77b 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -12,7 +12,9 @@ import ( ) // Config -const InflationSettingsContractName = "rocketDAOProtocolSettingsInflation" +const ( + InflationSettingsContractName string = "rocketDAOProtocolSettingsInflation" +) // RPL inflation rate per interval func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 48b550a07..0a7fea9c1 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -7,147 +7,150 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" ) // Config -const MinipoolSettingsContractName = "rocketDAOProtocolSettingsMinipool" - -// Get the minipool launch balance -func GetMinipoolLaunchBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getLaunchBalance"); err != nil { - return nil, fmt.Errorf("error getting minipool launch balance: %w", err) - } - return *value, nil -} +const ( + MinipoolSettingsContractName string = "rocketDAOProtocolSettingsMinipool" + MinipoolSubmitWithdrawableEnabledSettingPath string = "minipool.submit.withdrawable.enabled" + MinipoolLaunchTimeoutSettingPath string = "minipool.launch.timeout" + BondReductionEnabledSettingPath string = "minipool.bond.reduction.enabled" + MaximumMinipoolCountSettingPath string = "minipool.maximum.count" + MinipoolUserDistributeWindowStartSettingPath string = "minipool.user.distribute.window.start" + MinipoolUserDistributeWindowLengthSettingPath string = "minipool.user.distribute.window.length" +) -// Required node deposit amounts -func GetMinipoolFullDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// Minipool withdrawable event submissions currently enabled +func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { - return nil, err + return false, err } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getFullDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("error getting full minipool deposit node amount: %w", err) + value := new(bool) + if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { + return false, fmt.Errorf("error getting minipool withdrawable submissions enabled status: %w", err) } return *value, nil } -func GetMinipoolHalfDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("error getting half minipool deposit node amount: %w", err) - } - return *value, nil +func ProposeMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", MinipoolSubmitWithdrawableEnabledSettingPath), MinipoolSettingsContractName, MinipoolSubmitWithdrawableEnabledSettingPath, value, blockNumber, treeNodes, opts) } -func GetMinipoolEmptyDepositNodeAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositNodeAmount"); err != nil { - return nil, fmt.Errorf("error getting empty minipool deposit node amount: %w", err) - } - return *value, nil +func EstimateProposeMinipoolSubmitWithdrawableEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", MinipoolSubmitWithdrawableEnabledSettingPath), MinipoolSettingsContractName, MinipoolSubmitWithdrawableEnabledSettingPath, value, blockNumber, treeNodes, opts) } -// Required user deposit amounts -func GetMinipoolFullDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// Timeout period in seconds for prelaunch minipools to launch +func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getFullDepositUserAmount"); err != nil { - return nil, fmt.Errorf("error getting full minipool deposit user amount: %w", err) + if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { + return 0, fmt.Errorf("error getting minipool launch timeout: %w", err) } - return *value, nil + seconds := time.Duration((*value).Int64()) * time.Second + return seconds, nil } -func GetMinipoolHalfDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getHalfDepositUserAmount"); err != nil { - return nil, fmt.Errorf("error getting half minipool deposit user amount: %w", err) - } - return *value, nil +func ProposeMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeMinipoolLaunchTimeoutGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) } -func GetMinipoolEmptyDepositUserAmount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + +// Timeout period in seconds for prelaunch minipools to launch +func GetMinipoolLaunchTimeoutRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return nil, err } value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getEmptyDepositUserAmount"); err != nil { - return nil, fmt.Errorf("error getting empty minipool deposit user amount: %w", err) + if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { + return nil, fmt.Errorf("error getting minipool launch timeout: %w", err) } return *value, nil } -// Minipool withdrawable event submissions currently enabled -func GetMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +// Minipool bond reductions currently enabled +func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return false, err } value := new(bool) - if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { - return false, fmt.Errorf("error getting minipool withdrawable submissions enabled status: %w", err) + if err := minipoolSettingsContract.Call(opts, value, "getBondReductionEnabled"); err != nil { + return false, fmt.Errorf("error getting bond reduction enabled status: %w", err) } return *value, nil } +func ProposeBondReductionEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", BondReductionEnabledSettingPath), MinipoolSettingsContractName, BondReductionEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeBondReductionEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", BondReductionEnabledSettingPath), MinipoolSettingsContractName, BondReductionEnabledSettingPath, value, blockNumber, treeNodes, opts) +} -// Timeout period in seconds for prelaunch minipools to launch -func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +// The maximum number of minipools allowed +func GetMaximumMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { - return 0, fmt.Errorf("error getting minipool launch timeout: %w", err) + if err := minipoolSettingsContract.Call(opts, value, "getMaximumCount"); err != nil { + return 0, fmt.Errorf("error getting maximum minipool count: %w", err) } - seconds := time.Duration((*value).Int64()) * time.Second - return seconds, nil + return (*value).Uint64(), nil +} +func ProposeMaximumMinipoolCount(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumMinipoolCountGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) } -// Timeout period in seconds for prelaunch minipools to launch -func GetMinipoolLaunchTimeoutRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +// The time a user must wait before being able to distribute a minipool +func GetMinipoolUserDistributeWindowStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) - if err := minipoolSettingsContract.Call(opts, value, "getLaunchTimeout"); err != nil { - return nil, fmt.Errorf("error getting minipool launch timeout: %w", err) + if err := minipoolSettingsContract.Call(opts, value, "getUserDistributeWindowStart"); err != nil { + return 0, fmt.Errorf("error getting user distribute window start: %w", err) } - return *value, nil + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeMinipoolUserDistributeWindowStart(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeMinipoolUserDistributeWindowStartGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) } -// Minipool bond reductions currently enabled -func GetBondReductionEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +// The time a user has to distribute a minipool after waiting the start length +func GetMinipoolUserDistributeWindowLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) if err != nil { - return false, err + return 0, err } - value := new(bool) - if err := minipoolSettingsContract.Call(opts, value, "getBondReductionEnabled"); err != nil { - return false, fmt.Errorf("error getting bond reduction enabled status: %w", err) + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getUserDistributeWindowLength"); err != nil { + return 0, fmt.Errorf("error getting user distribute window length: %w", err) } - return *value, nil + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeMinipoolUserDistributeWindowLength(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeMinipoolUserDistributeWindowLengthGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) } // Get contracts diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 2ec5f5668..8fc710a25 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -6,13 +6,31 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Config -const NetworkSettingsContractName = "rocketDAOProtocolSettingsNetwork" +const ( + NetworkSettingsContractName string = "rocketDAOProtocolSettingsNetwork" + NodeConsensusThresholdSettingPath string = "network.consensus.threshold" + SubmitBalancesEnabledSettingPath string = "network.submit.balances.enabled" + SubmitBalancesFrequencySettingPath string = "network.submit.balances.frequency" + SubmitPricesEnabledSettingPath string = "network.submit.prices.enabled" + SubmitPricesFrequencySettingPath string = "network.submit.prices.frequency" + MinimumNodeFeeSettingPath string = "network.node.fee.minimum" + TargetNodeFeeSettingPath string = "network.node.fee.target" + MaximumNodeFeeSettingPath string = "network.node.fee.maximum" + NodeFeeDemandRangeSettingPath string = "network.node.fee.demand.range" + TargetRethCollateralRateSettingPath string = "network.reth.collateral.target" + NetworkPenaltyThreshold string = "network.penalty.threshold" + NetworkPenaltyPerRateSettingPath string = "network.penalty.per.rate" + SubmitRewardsEnabledSettingPath string = "network.submit.rewards.enabled" +) // The threshold of trusted nodes that must reach consensus on oracle data to commit it func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -26,6 +44,12 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } +func ProposeNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeNodeConsensusThresholdGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // Network balance submissions currently enabled func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -39,6 +63,12 @@ func GetSubmitBalancesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (b } return *value, nil } +func ProposeSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", SubmitBalancesEnabledSettingPath), NetworkSettingsContractName, SubmitBalancesEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitBalancesEnabledSettingPath), NetworkSettingsContractName, SubmitBalancesEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // The frequency in blocks at which network balances should be submitted by trusted nodes func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -52,6 +82,12 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } +func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeSubmitBalancesFrequencyGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} // Network price submissions currently enabled func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -65,6 +101,12 @@ func GetSubmitPricesEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (boo } return *value, nil } +func ProposeSubmitPricesEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", SubmitPricesEnabledSettingPath), NetworkSettingsContractName, SubmitPricesEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSubmitPricesEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitPricesEnabledSettingPath), NetworkSettingsContractName, SubmitPricesEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // The frequency in blocks at which network prices should be submitted by trusted nodes func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { @@ -78,6 +120,12 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } +func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeSubmitPricesFrequencyGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} // Minimum node commission rate func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -91,6 +139,12 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func ProposeMinimumNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMinimumNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // Target node commission rate func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -104,6 +158,12 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func ProposeTargetNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeTargetNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // Maximum node commission rate func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -117,6 +177,12 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } +func ProposeMaximumNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // The range of node demand values to base fee calculations on func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -130,6 +196,12 @@ func GetNodeFeeDemandRange(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big } return *value, nil } +func ProposeNodeFeeDemandRange(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NodeFeeDemandRangeSettingPath), NetworkSettingsContractName, NodeFeeDemandRangeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeNodeFeeDemandRangeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NodeFeeDemandRangeSettingPath), NetworkSettingsContractName, NodeFeeDemandRangeSettingPath, value, blockNumber, treeNodes, opts) +} // The target collateralization rate for the rETH contract as a fraction func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -143,6 +215,69 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } +func ProposeTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeTargetRethCollateralRateGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} + +// The number of oDAO members that have to vote for a penalty expressed as a percentage +func GetNetworkPenaltyThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getNodePenaltyThreshold"); err != nil { + return 0, fmt.Errorf("error getting network penalty threshold: %w", err) + } + return eth.WeiToEth(*value), nil +} +func ProposeNetworkPenaltyThreshold(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeNetworkPenaltyThresholdGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, eth.EthToWei(value), blockNumber, treeNodes, opts) +} + +// The amount a node operator is penalised for each penalty as a percentage +func GetNetworkPenaltyPerRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getPerPenaltyRate"); err != nil { + return 0, fmt.Errorf("error getting network penalty per rate: %w", err) + } + return eth.WeiToEth(*value), nil +} +func ProposeNetworkPenaltyPerRate(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeNetworkPenaltyPerRateGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} + +// Rewards submissions currently enabled +func GetSubmitRewardsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := networkSettingsContract.Call(opts, value, "getSubmitRewardsEnabled"); err != nil { + return false, fmt.Errorf("error getting rewards submissions enabled status: %w", err) + } + return *value, nil +} +func ProposeSubmitRewardsEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", SubmitRewardsEnabledSettingPath), NetworkSettingsContractName, SubmitRewardsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSubmitRewardsEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitRewardsEnabledSettingPath), NetworkSettingsContractName, SubmitRewardsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Get contracts var networkSettingsContractLock sync.Mutex diff --git a/settings/protocol/node.go b/settings/protocol/node.go index b0fa60732..b81fed6f7 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -6,13 +6,24 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Config -const NodeSettingsContractName = "rocketDAOProtocolSettingsNode" +const ( + NodeSettingsContractName string = "rocketDAOProtocolSettingsNode" + NodeRegistrationEnabledSettingPath string = "node.registration.enabled" + SmoothingPoolRegistrationEnabledSettingPath string = "node.smoothing.pool.registration.enabled" + NodeDepositEnabledSettingPath string = "node.deposit.enabled" + VacantMinipoolsEnabledSettingPath string = "node.vacant.minipools.enabled" + MinimumPerMinipoolStakeSettingPath string = "node.per.minipool.stake.minimum" + MaximumPerMinipoolStakeSettingPath string = "node.per.minipool.stake.maximum" +) // Node registrations currently enabled func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -26,6 +37,31 @@ func GetNodeRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return *value, nil } +func ProposeNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", NodeRegistrationEnabledSettingPath), NodeSettingsContractName, NodeRegistrationEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeNodeRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", NodeRegistrationEnabledSettingPath), NodeSettingsContractName, NodeRegistrationEnabledSettingPath, value, blockNumber, treeNodes, opts) +} + +// Smoothing pool joining currently enabled +func GetSmoothingPoolRegistrationEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + nodeSettingsContract, err := getNodeSettingsContract(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := nodeSettingsContract.Call(opts, value, "getSmoothingPoolRegistrationEnabled"); err != nil { + return false, fmt.Errorf("error getting smoothing pool registrations enabled status: %w", err) + } + return *value, nil +} +func ProposeSmoothingPoolRegistrationEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", SmoothingPoolRegistrationEnabledSettingPath), NodeSettingsContractName, SmoothingPoolRegistrationEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSmoothingPoolRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SmoothingPoolRegistrationEnabledSettingPath), NodeSettingsContractName, SmoothingPoolRegistrationEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Node deposits currently enabled func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -39,6 +75,12 @@ func GetNodeDepositEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool } return *value, nil } +func ProposeNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", NodeDepositEnabledSettingPath), NodeSettingsContractName, NodeDepositEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeNodeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", NodeDepositEnabledSettingPath), NodeSettingsContractName, NodeDepositEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // Vacant minipools currently enabled func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { @@ -52,6 +94,12 @@ func GetVacantMinipoolsEnabled(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return *value, nil } +func ProposeVacantMinipoolsEnabled(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetBool(rp, fmt.Sprintf("set %s", VacantMinipoolsEnabledSettingPath), NodeSettingsContractName, VacantMinipoolsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeVacantMinipoolsEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", VacantMinipoolsEnabledSettingPath), NodeSettingsContractName, VacantMinipoolsEnabledSettingPath, value, blockNumber, treeNodes, opts) +} // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { @@ -65,6 +113,12 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } +func ProposeMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMinimumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // The minimum RPL stake per minipool as a fraction of assigned user ETH func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { @@ -91,6 +145,12 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } +func ProposeMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeMaximumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} // The maximum RPL stake per minipool as a fraction of assigned user ETH func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 01a4640ba..5d35b31e6 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -4,15 +4,22 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Config -const RewardsSettingsContractName = "rocketDAOProtocolSettingsRewards" +const ( + RewardsSettingsContractName string = "rocketDAOProtocolSettingsRewards" + RewardsClaimIntervalTimeSettingPath string = "rpl.rewards.claim.period.time" +) // The claim amount for a claimer as a fraction func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (float64, error) { @@ -54,7 +61,7 @@ func GetRewardsClaimersPercTotal(rp *rocketpool.RocketPool, opts *bind.CallOpts) } // Rewards claim interval time -func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err @@ -63,7 +70,13 @@ func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimIntervalTime"); err != nil { return 0, fmt.Errorf("error getting rewards claim interval: %w", err) } - return (*value).Uint64(), nil + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeRewardsClaimIntervalTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) } // Get contracts From f8b63cb6d92780eb9bb72985d0b580a56444ce5d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 21 Sep 2023 01:46:12 -0400 Subject: [PATCH 646/878] Finished settings/protocol/proposals --- settings/protocol/proposals.go | 229 +++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 settings/protocol/proposals.go diff --git a/settings/protocol/proposals.go b/settings/protocol/proposals.go new file mode 100644 index 000000000..7513b1f56 --- /dev/null +++ b/settings/protocol/proposals.go @@ -0,0 +1,229 @@ +package protocol + +import ( + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Config +const ( + ProposalsSettingsContractName string = "rocketDAOProtocolSettingsProposals" + CooldownTimeSettingPath string = "proposal.cooldown.time" + VoteTimeSettingPath string = "proposal.vote.time" + VoteDelayTimeSettingPath string = "proposal.vote.delay.time" + ExecuteTimeSettingPath string = "proposal.execute.time" + ProposalBondSettingPath string = "proposal.bond" + ChallengeBondSettingPath string = "proposal.challenge.bond" + ChallengePeriodSettingPath string = "proposal.challenge.period" + ProposalQuorumSettingPath string = "proposal.quorum" + ProposalVetoQuorumSettingPath string = "proposal.veto.quorum" + ProposalMaxBlockAgeSettingPath string = "proposal.max.block.age" +) + +// The cooldown time between submitting new proposals +func GetCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { + return 0, fmt.Errorf("error getting cooldown time: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeCooldownTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeCooldownTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} + +// How long a proposal can be voted on before expiring +func GetVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { + return 0, fmt.Errorf("error getting vote time: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeVoteTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeVoteTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} + +// How long before a proposal can be voted on after its created +func GetVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVoteDelayTime"); err != nil { + return 0, fmt.Errorf("error getting vote delay time: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeVoteDelayTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeVoteDelayTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} + +// How long after a succesful proposal can it be executed before it expires +func GetExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getExecuteTime"); err != nil { + return 0, fmt.Errorf("error getting execute time: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeExecuteTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeExecuteTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} + +// How much RPL is locked when creating a proposal +func GetProposalBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalBond"); err != nil { + return nil, fmt.Errorf("error getting proposal bond: %w", err) + } + return *value, nil +} +func ProposeProposalBond(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalBondSettingPath), ProposalsSettingsContractName, ProposalBondSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeProposalBondGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalBondSettingPath), ProposalsSettingsContractName, ProposalBondSettingPath, value, blockNumber, treeNodes, opts) +} + +// How much RPL is locked when challenging a proposal +func GetChallengeBond(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getChallengeBond"); err != nil { + return nil, fmt.Errorf("error getting challenge bond: %w", err) + } + return *value, nil +} +func ProposeChallengeBond(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengeBondSettingPath), ProposalsSettingsContractName, ChallengeBondSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeChallengeBondGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengeBondSettingPath), ProposalsSettingsContractName, ChallengeBondSettingPath, value, blockNumber, treeNodes, opts) +} + +// How long a proposer has to respond to a challenge before the proposal is defeated +func GetChallengePeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getChallengePeriod"); err != nil { + return 0, fmt.Errorf("error getting challenge period: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeChallengePeriod(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} +func EstimateProposeChallengePeriodGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +} + +// The minimum amount of voting power a proposal needs to succeed +func GetProposalQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalQuorum"); err != nil { + return 0, fmt.Errorf("error getting proposal quorum: %w", err) + } + return eth.WeiToEth(*value), nil +} +func ProposeProposalQuorum(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeProposalQuorumGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} + +// The amount of voting power vetoing a proposal require to veto it +func GetProposalVetoQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalVetoQuorum"); err != nil { + return 0, fmt.Errorf("error getting proposal veto quorum: %w", err) + } + return eth.WeiToEth(*value), nil +} +func ProposeProposalVetoQuorum(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} +func EstimateProposeProposalVetoQuorumGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +} + +// The maximum number of blocks old a proposal can be submitted for +func GetProposalMaxBlockAge(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalMaxBlockAge"); err != nil { + return 0, fmt.Errorf("error getting proposal max block age: %w", err) + } + return (*value).Uint64(), nil +} +func ProposeProposalMaxBlockAge(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} +func EstimateProposeProposalMaxBlockAgeGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +} + +// Get contracts +var proposalsSettingsContractLock sync.Mutex + +func getProposalsSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + proposalsSettingsContractLock.Lock() + defer proposalsSettingsContractLock.Unlock() + return rp.GetContract(ProposalsSettingsContractName, opts) +} From 02f6ba25311f66e97f93a8da1ef0df9ce22a3007 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 22 Sep 2023 14:55:52 -0400 Subject: [PATCH 647/878] Fixed a typo --- settings/protocol/auction.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index f085ac221..f01bdc7df 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -20,7 +20,7 @@ const ( CreateLotEnabledSettingPath string = "auction.lot.create.enabled" BidOnLotEnabledSettingPath string = "auction.lot.bidding.enabled" LotMinimumEthValueSettingPath string = "auction.lot.value.minimum" - LotMaximumEthValueSettingPath string = "auction.lot.value.maximu" + LotMaximumEthValueSettingPath string = "auction.lot.value.maximum" LotDurationSettingPath string = "auction.lot.duration" LotStartingPriceRatioSettingPath string = "auction.price.start" LotReservePriceRatioSettingPath string = "auction.price.reserve" From 64f96ee80fe3f55cc4ab518f51b288cda64dc7dc Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 00:36:39 -0400 Subject: [PATCH 648/878] Added GetProposalBlock() --- dao/protocol/proposals.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 393bd507e..8ffe22315 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -13,6 +13,19 @@ import ( "github.com/rocket-pool/rocketpool-go/types" ) +// Get the block that was used for voting power calculation in a proposal +func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalBlock", proposalId); err != nil { + return 0, fmt.Errorf("error getting propsal block for proposal %d: %w", proposalId, err) + } + return (*value).Uint64(), nil +} + // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) From d67067f9e544601542980fb1e2b60d9d592bcf36 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 00:53:35 -0400 Subject: [PATCH 649/878] Changed proposal block to uint32 for consistency --- dao/protocol/proposals.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 8ffe22315..0c95fe0b8 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -14,7 +14,7 @@ import ( ) // Get the block that was used for voting power calculation in a proposal -func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint32, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, err @@ -23,7 +23,7 @@ func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalBlock", proposalId); err != nil { return 0, fmt.Errorf("error getting propsal block for proposal %d: %w", proposalId, err) } - return (*value).Uint64(), nil + return uint32((*value).Uint64()), nil } // Estimate the gas of a proposal submission From efd850078ca345771484e78026da5a6f0d8f3ed6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 01:50:22 -0400 Subject: [PATCH 650/878] Removed the cooldown time setting from the pDAO --- settings/protocol/proposals.go | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/settings/protocol/proposals.go b/settings/protocol/proposals.go index 7513b1f56..f590e4065 100644 --- a/settings/protocol/proposals.go +++ b/settings/protocol/proposals.go @@ -17,7 +17,6 @@ import ( // Config const ( ProposalsSettingsContractName string = "rocketDAOProtocolSettingsProposals" - CooldownTimeSettingPath string = "proposal.cooldown.time" VoteTimeSettingPath string = "proposal.vote.time" VoteDelayTimeSettingPath string = "proposal.vote.delay.time" ExecuteTimeSettingPath string = "proposal.execute.time" @@ -29,25 +28,6 @@ const ( ProposalMaxBlockAgeSettingPath string = "proposal.max.block.age" ) -// The cooldown time between submitting new proposals -func GetCooldownTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getCooldownTime"); err != nil { - return 0, fmt.Errorf("error getting cooldown time: %w", err) - } - return time.Duration((*value).Uint64()) * time.Second, nil -} -func ProposeCooldownTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) -} -func EstimateProposeCooldownTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", CooldownTimeSettingPath), ProposalsSettingsContractName, CooldownTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) -} - // How long a proposal can be voted on before expiring func GetVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) From 5c221f12e881c9ea53fdd9bc37919a638f9531ab Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 03:09:24 -0400 Subject: [PATCH 651/878] Added GetNodeRplLocked --- node/staking.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/node/staking.go b/node/staking.go index 7cb54705e..442aa919a 100644 --- a/node/staking.go +++ b/node/staking.go @@ -215,6 +215,19 @@ func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, r return *totalEffectiveRplStake, nil } +// Get the amount of RPL locked as part of active PDAO proposals or challenges +func GetNodeRplLocked(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketNodeStaking.Call(opts, value, "getNodeRPLLocked", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node RPL locked: %w", err) + } + return *value, nil +} + // Get contracts var rocketNodeStakingLock sync.Mutex From b19f183d3da9c690107409b0f90952a4a68f26c2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 22:34:05 -0400 Subject: [PATCH 652/878] Changed pDAO propose / bootstraps to use *big.Int --- settings/protocol/deposit.go | 16 ++++---- settings/protocol/minipool.go | 32 +++++++-------- settings/protocol/network.go | 72 +++++++++++++++++----------------- settings/protocol/node.go | 16 ++++---- settings/protocol/proposals.go | 56 +++++++++++++------------- settings/protocol/rewards.go | 8 ++-- 6 files changed, 100 insertions(+), 100 deletions(-) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 16f46be17..9d816c8b1 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -113,11 +113,11 @@ func GetMaximumDepositAssignments(rp *rocketpool.RocketPool, opts *bind.CallOpts } return (*value).Uint64(), nil } -func ProposeMaximumDepositAssignments(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeMaximumDepositAssignments(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMaximumDepositAssignmentsGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeMaximumDepositAssignmentsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumDepositAssignmentsSettingPath, value, blockNumber, treeNodes, opts) } // Maximum socialized deposit assignments per transaction @@ -132,11 +132,11 @@ func GetMaximumSocializedDepositAssignments(rp *rocketpool.RocketPool, opts *bin } return (*value).Uint64(), nil } -func ProposeMaximumSocializedDepositAssignments(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeMaximumSocializedDepositAssignments(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMaximumSocializedDepositAssignmentsGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeMaximumSocializedDepositAssignmentsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumSocializedDepositAssignmentsSettingPath), DepositSettingsContractName, MaximumSocializedDepositAssignmentsSettingPath, value, blockNumber, treeNodes, opts) } // Current fee taken from user deposits diff --git a/settings/protocol/minipool.go b/settings/protocol/minipool.go index 0a7fea9c1..7aa4e523c 100644 --- a/settings/protocol/minipool.go +++ b/settings/protocol/minipool.go @@ -57,11 +57,11 @@ func GetMinipoolLaunchTimeout(rp *rocketpool.RocketPool, opts *bind.CallOpts) (t seconds := time.Duration((*value).Int64()) * time.Second return seconds, nil } -func ProposeMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeMinipoolLaunchTimeout(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMinipoolLaunchTimeoutGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeMinipoolLaunchTimeoutGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolLaunchTimeoutSettingPath), MinipoolSettingsContractName, MinipoolLaunchTimeoutSettingPath, value, blockNumber, treeNodes, opts) } // Timeout period in seconds for prelaunch minipools to launch @@ -108,11 +108,11 @@ func GetMaximumMinipoolCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (ui } return (*value).Uint64(), nil } -func ProposeMaximumMinipoolCount(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeMaximumMinipoolCount(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMaximumMinipoolCountGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeMaximumMinipoolCountGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumMinipoolCountSettingPath), MinipoolSettingsContractName, MaximumMinipoolCountSettingPath, value, blockNumber, treeNodes, opts) } // The time a user must wait before being able to distribute a minipool @@ -127,11 +127,11 @@ func GetMinipoolUserDistributeWindowStart(rp *rocketpool.RocketPool, opts *bind. } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeMinipoolUserDistributeWindowStart(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeMinipoolUserDistributeWindowStart(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMinipoolUserDistributeWindowStartGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeMinipoolUserDistributeWindowStartGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowStartSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowStartSettingPath, value, blockNumber, treeNodes, opts) } // The time a user has to distribute a minipool after waiting the start length @@ -146,11 +146,11 @@ func GetMinipoolUserDistributeWindowLength(rp *rocketpool.RocketPool, opts *bind } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeMinipoolUserDistributeWindowLength(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeMinipoolUserDistributeWindowLength(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMinipoolUserDistributeWindowLengthGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeMinipoolUserDistributeWindowLengthGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinipoolUserDistributeWindowLengthSettingPath), MinipoolSettingsContractName, MinipoolUserDistributeWindowLengthSettingPath, value, blockNumber, treeNodes, opts) } // Get contracts diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 8fc710a25..3fad0e162 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -44,11 +44,11 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } -func ProposeNodeConsensusThreshold(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeNodeConsensusThreshold(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeNodeConsensusThresholdGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeNodeConsensusThresholdGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, value, blockNumber, treeNodes, opts) } // Network balance submissions currently enabled @@ -82,11 +82,11 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return (*value).Uint64(), nil } -func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitBalancesFrequencyGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeSubmitBalancesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) } // Network price submissions currently enabled @@ -120,11 +120,11 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u } return (*value).Uint64(), nil } -func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitPricesFrequencyGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeSubmitPricesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) } // Minimum node commission rate @@ -139,11 +139,11 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func ProposeMinimumNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeMinimumNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMinimumNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeMinimumNodeFeeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } // Target node commission rate @@ -158,11 +158,11 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func ProposeTargetNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeTargetNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeTargetNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeTargetNodeFeeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } // Maximum node commission rate @@ -177,11 +177,11 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func ProposeMaximumNodeFee(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeMaximumNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMaximumNodeFeeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeMaximumNodeFeeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } // The range of node demand values to base fee calculations on @@ -215,11 +215,11 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func ProposeTargetRethCollateralRate(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeTargetRethCollateralRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeTargetRethCollateralRateGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeTargetRethCollateralRateGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, value, blockNumber, treeNodes, opts) } // The number of oDAO members that have to vote for a penalty expressed as a percentage @@ -234,11 +234,11 @@ func GetNetworkPenaltyThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func ProposeNetworkPenaltyThreshold(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeNetworkPenaltyThreshold(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, value, blockNumber, treeNodes, opts) } -func EstimateProposeNetworkPenaltyThresholdGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeNetworkPenaltyThresholdGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, value, blockNumber, treeNodes, opts) } // The amount a node operator is penalised for each penalty as a percentage @@ -253,11 +253,11 @@ func GetNetworkPenaltyPerRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } -func ProposeNetworkPenaltyPerRate(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeNetworkPenaltyPerRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeNetworkPenaltyPerRateGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeNetworkPenaltyPerRateGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, value, blockNumber, treeNodes, opts) } // Rewards submissions currently enabled diff --git a/settings/protocol/node.go b/settings/protocol/node.go index b81fed6f7..992e36760 100644 --- a/settings/protocol/node.go +++ b/settings/protocol/node.go @@ -113,11 +113,11 @@ func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func ProposeMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMinimumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeMinimumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts) } // The minimum RPL stake per minipool as a fraction of assigned user ETH @@ -145,11 +145,11 @@ func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } -func ProposeMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeMaximumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeMaximumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts) } // The maximum RPL stake per minipool as a fraction of assigned user ETH diff --git a/settings/protocol/proposals.go b/settings/protocol/proposals.go index f590e4065..fbc6e8a25 100644 --- a/settings/protocol/proposals.go +++ b/settings/protocol/proposals.go @@ -40,11 +40,11 @@ func GetVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeVoteTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeVoteTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, value, blockNumber, treeNodes, opts) } // How long before a proposal can be voted on after its created @@ -59,11 +59,11 @@ func GetVoteDelayTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Dura } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeVoteDelayTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeVoteDelayTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeVoteDelayTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeVoteDelayTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteDelayTimeSettingPath), ProposalsSettingsContractName, VoteDelayTimeSettingPath, value, blockNumber, treeNodes, opts) } // How long after a succesful proposal can it be executed before it expires @@ -78,11 +78,11 @@ func GetExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Durati } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeExecuteTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeExecuteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeExecuteTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeExecuteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExecuteTimeSettingPath), ProposalsSettingsContractName, ExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) } // How much RPL is locked when creating a proposal @@ -135,11 +135,11 @@ func GetChallengePeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Du } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeChallengePeriod(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeChallengePeriod(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeChallengePeriodGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeChallengePeriodGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ChallengePeriodSettingPath), ProposalsSettingsContractName, ChallengePeriodSettingPath, value, blockNumber, treeNodes, opts) } // The minimum amount of voting power a proposal needs to succeed @@ -154,11 +154,11 @@ func GetProposalQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } -func ProposeProposalQuorum(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeProposalQuorum(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeProposalQuorumGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeProposalQuorumGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, value, blockNumber, treeNodes, opts) } // The amount of voting power vetoing a proposal require to veto it @@ -173,11 +173,11 @@ func GetProposalVetoQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } return eth.WeiToEth(*value), nil } -func ProposeProposalVetoQuorum(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func ProposeProposalVetoQuorum(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeProposalVetoQuorumGas(rp *rocketpool.RocketPool, value float64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, eth.EthToWei(value), blockNumber, treeNodes, opts) +func EstimateProposeProposalVetoQuorumGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, value, blockNumber, treeNodes, opts) } // The maximum number of blocks old a proposal can be submitted for @@ -192,11 +192,11 @@ func GetProposalMaxBlockAge(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uin } return (*value).Uint64(), nil } -func ProposeProposalMaxBlockAge(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func ProposeProposalMaxBlockAge(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeProposalMaxBlockAgeGas(rp *rocketpool.RocketPool, value uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, big.NewInt(0).SetUint64(value), blockNumber, treeNodes, opts) +func EstimateProposeProposalMaxBlockAgeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ProposalMaxBlockAgeSettingPath), ProposalsSettingsContractName, ProposalMaxBlockAgeSettingPath, value, blockNumber, treeNodes, opts) } // Get contracts diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 5d35b31e6..bfd6cf6a7 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -72,11 +72,11 @@ func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func ProposeRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeRewardsClaimIntervalTimeGas(rp *rocketpool.RocketPool, value time.Duration, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, big.NewInt(0).SetUint64(uint64(value.Seconds())), blockNumber, treeNodes, opts) +func EstimateProposeRewardsClaimIntervalTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, value, blockNumber, treeNodes, opts) } // Get contracts From c63ab29db2366dfad827dbc10d8fca0bda3ae0f1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 25 Sep 2023 22:44:26 -0400 Subject: [PATCH 653/878] Fixed a var name --- settings/protocol/network.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 3fad0e162..9cc86a483 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -27,7 +27,7 @@ const ( MaximumNodeFeeSettingPath string = "network.node.fee.maximum" NodeFeeDemandRangeSettingPath string = "network.node.fee.demand.range" TargetRethCollateralRateSettingPath string = "network.reth.collateral.target" - NetworkPenaltyThreshold string = "network.penalty.threshold" + NetworkPenaltyThresholdSettingPath string = "network.penalty.threshold" NetworkPenaltyPerRateSettingPath string = "network.penalty.per.rate" SubmitRewardsEnabledSettingPath string = "network.submit.rewards.enabled" ) @@ -235,10 +235,10 @@ func GetNetworkPenaltyThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) return eth.WeiToEth(*value), nil } func ProposeNetworkPenaltyThreshold(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, value, blockNumber, treeNodes, opts) + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThresholdSettingPath), NetworkSettingsContractName, NetworkPenaltyThresholdSettingPath, value, blockNumber, treeNodes, opts) } func EstimateProposeNetworkPenaltyThresholdGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyThreshold), NetworkSettingsContractName, NetworkPenaltyThreshold, value, blockNumber, treeNodes, opts) + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", NetworkPenaltyThresholdSettingPath), NetworkSettingsContractName, NetworkPenaltyThresholdSettingPath, value, blockNumber, treeNodes, opts) } // The amount a node operator is penalised for each penalty as a percentage From 98ed39f52ef8570c2550fc23c83f8b83672f0343 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 28 Sep 2023 01:59:43 -0400 Subject: [PATCH 654/878] Removed pDAO cancelling --- dao/protocol/proposals.go | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 0c95fe0b8..725c5e459 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -217,28 +217,6 @@ func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// Estimate the gas of CancelProposal -func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) -} - -// Cancel a submitted proposal -func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocolProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) - if err != nil { - return common.Hash{}, fmt.Errorf("error cancelling Protocol DAO proposal %d: %w", proposalId, err) - } - return tx.Hash(), nil -} - // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) From 9ccbf2270122c155f8bc2ce092b42d2b2843d5de Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 3 Oct 2023 02:40:39 -0400 Subject: [PATCH 655/878] Updated ProposeSetRewardsPercentage with the new triple-percent params --- dao/protocol/proposals.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 725c5e459..ff3a880d6 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -165,28 +165,28 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// Estimate the gas of ProposeSetAddress -func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, percentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +// Estimate the gas of ProposeSetRewardsPercentage +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimer", contractName, percentage) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } -// Submit a proposal to update one of percentage allocations of RPL rewards -func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message, contractName string, percentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +// Submit a proposal to update the allocations of RPL rewards +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimer", contractName, percentage) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimer percent proposal payload: %w", err) + return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) } return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } From c0011e841f1d1855af9404805caaa73854664ca2 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 3 Oct 2023 21:06:24 -0400 Subject: [PATCH 656/878] Updated the rewards stuff for changing percentages --- dao/protocol/proposals.go | 26 ------------------ rewards/rewards.go | 39 -------------------------- settings/protocol/rewards.go | 53 +++++++++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 75 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index ff3a880d6..203d8c8da 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -165,32 +165,6 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// Estimate the gas of ProposeSetRewardsPercentage -func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) -} - -// Submit a proposal to update the allocations of RPL rewards -func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) -} - // Estimate the gas of ProposeSpendTreasury func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) diff --git a/rewards/rewards.go b/rewards/rewards.go index b22aa43ec..a68f930c2 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -100,45 +100,6 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. return time.Duration((*unixTime).Int64()) * time.Second, nil } -// Get the percent of checkpoint rewards that goes to node operators -func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return nil, err - } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { - return nil, fmt.Errorf("error getting node operator rewards percent: %w", err) - } - return *perc, nil -} - -// Get the percent of checkpoint rewards that goes to ODAO members -func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return nil, err - } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { - return nil, fmt.Errorf("error getting trusted node operator rewards percent: %w", err) - } - return *perc, nil -} - -// Get the percent of checkpoint rewards that goes to the PDAO -func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return nil, err - } - perc := new(*big.Int) - if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { - return nil, fmt.Errorf("error getting protocol DAO rewards percent: %w", err) - } - return *perc, nil -} - // Get the amount of RPL rewards that will be provided to node operators func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, opts) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index bfd6cf6a7..672597f5d 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -21,27 +21,60 @@ const ( RewardsClaimIntervalTimeSettingPath string = "rpl.rewards.claim.period.time" ) -// The claim amount for a claimer as a fraction -func GetRewardsClaimerPerc(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (float64, error) { +// Rewards claimer percents +type RplRewardsPercentages struct { + OdaoPercentage *big.Int `abi:"_trustedNodePercent"` + PdaoPercentage *big.Int `abi:"_protocolPercent"` + NodePercentage *big.Int `abi:"_nodePercent"` +} + +// The RPL rewards percentages for the Oracle DAO, Protocol DAO, and node operators +func GetRewardsPercentages(rp *rocketpool.RocketPool, opts *bind.CallOpts) (RplRewardsPercentages, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { - return 0, err + return RplRewardsPercentages{}, err } - value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPerc", contractName); err != nil { - return 0, fmt.Errorf("error getting rewards claimer percent: %w", err) + value := new(RplRewardsPercentages) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersPerc"); err != nil { + return RplRewardsPercentages{}, fmt.Errorf("error getting rewards percentages: %w", err) } - return eth.WeiToEth(*value), nil + return *value, nil +} + +// Estimate the gas of ProposeSetRewardsPercentage +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rewardsSettingsContract.ABI.Pack("setSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) + } + return protocol.EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to update the allocations of RPL rewards +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rewardsSettingsContract.ABI.Pack("setSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) + } + return protocol.SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// The time that a claimer's share was last updated -func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (uint64, error) { +// The time that the RPL rewards percentages were last updated +func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimerPercTimeUpdated", contractName); err != nil { + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersTimeUpdated"); err != nil { return 0, fmt.Errorf("error getting rewards claimer updated time: %w", err) } return (*value).Uint64(), nil From 20ce79757213d90433294483a0c4d9f112d802ce Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 4 Oct 2023 00:40:20 -0400 Subject: [PATCH 657/878] Updated rocketDAOProtocolProposals with the new API --- dao/protocol/proposals.go | 158 +++++++++++++++++++++++++++++++++-- settings/protocol/rewards.go | 26 ------ 2 files changed, 151 insertions(+), 33 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 203d8c8da..519c91f20 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -21,11 +22,24 @@ func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C } value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalBlock", proposalId); err != nil { - return 0, fmt.Errorf("error getting propsal block for proposal %d: %w", proposalId, err) + return 0, fmt.Errorf("error getting proposal block for proposal %d: %w", proposalId, err) } return uint32((*value).Uint64()), nil } +// Get the veto quorum required to veto a proposal +func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalVetoQuorum", proposalId); err != nil { + return nil, fmt.Errorf("error getting proposal veto quorum for proposal %d: %w", proposalId, err) + } + return *value, nil +} + // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) @@ -165,26 +179,52 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// Estimate the gas of ProposeSpendTreasury -func EstimateProposeSpendTreasuryGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +// Estimate the gas of ProposeSetRewardsPercentage +func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to update the allocations of RPL rewards +func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Estimate the gas of ProposeOneTimeTreasurySpend +func EstimateProposeOneTimeTreasurySpendGas(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSpendTreasury", invoiceID, recipient, amount) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryOneTimeSpend", invoiceID, recipient, amount) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } -// Submit a proposal to spend a portion of the Rocket Pool treasury -func ProposeSpendTreasury(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +// Submit a proposal to spend a portion of the Rocket Pool treasury one time +func ProposeOneTimeTreasurySpend(rp *rocketpool.RocketPool, message, invoiceID string, recipient common.Address, amount *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSpendTreasury", invoiceID, recipient, amount) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryOneTimeSpend", invoiceID, recipient, amount) if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } @@ -235,6 +275,110 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr return tx.Hash(), nil } +// Estimate the gas of ProposeRecurringTreasurySpend +func EstimateProposeRecurringTreasurySpendGas(rp *rocketpool.RocketPool, message string, contractName string, recipient common.Address, amountPerPeriod *big.Int, periodLength time.Duration, startTime time.Time, numberOfPeriods uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), numberOfPeriods) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to spend a portion of the Rocket Pool treasury in a recurring manner +func ProposeRecurringTreasurySpend(rp *rocketpool.RocketPool, message string, contractName string, recipient common.Address, amountPerPeriod *big.Int, periodLength time.Duration, startTime time.Time, numberOfPeriods uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), numberOfPeriods) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) + } + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Estimate the gas of ProposeRecurringTreasurySpendUpdate +func EstimateProposeRecurringTreasurySpendUpdateGas(rp *rocketpool.RocketPool, message string, contractName string, recipient common.Address, amountPerPeriod *big.Int, periodLength time.Duration, numberOfPeriods uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), numberOfPeriods) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to update a recurrint Rocket Pool treasury spending plan +func ProposeRecurringTreasurySpendUpdate(rp *rocketpool.RocketPool, message string, contractName string, recipient common.Address, amountPerPeriod *big.Int, periodLength time.Duration, numberOfPeriods uint64, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), numberOfPeriods) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) + } + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Estimate the gas of ProposeInviteToSecurityCouncil +func EstimateProposeInviteToSecurityCouncilGas(rp *rocketpool.RocketPool, message string, id string, address common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityInvite", id, address) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityInvite payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to invite a member to the security council +func ProposeInviteToSecurityCouncil(rp *rocketpool.RocketPool, message string, id string, address common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityInvite", id, address) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityInvite payload: %w", err) + } + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Estimate the gas of ProposeKickFromSecurityCouncil +func EstimateProposeKickFromSecurityCouncilGas(rp *rocketpool.RocketPool, message string, address common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityKick", address) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityKick payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to kick a member from the security council +func ProposeKickFromSecurityCouncil(rp *rocketpool.RocketPool, message string, address common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityKick", address) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityKick payload: %w", err) + } + return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} + // Get the ABI encoding of multiple values for a ProposeSettingMulti call func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any) ([][]byte, error) { // Sanity check the lengths diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 672597f5d..0f47c3f8a 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -41,32 +41,6 @@ func GetRewardsPercentages(rp *rocketpool.RocketPool, opts *bind.CallOpts) (RplR return *value, nil } -// Estimate the gas of ProposeSetRewardsPercentage -func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rewardsSettingsContract.ABI.Pack("setSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) - } - return protocol.EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) -} - -// Submit a proposal to update the allocations of RPL rewards -func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odaoPercentage *big.Int, pdaoPercentage *big.Int, nodePercentage *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rewardsSettingsContract, err := getRewardsSettingsContract(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rewardsSettingsContract.ABI.Pack("setSettingRewardsClaimers", odaoPercentage, pdaoPercentage, nodePercentage) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) - } - return protocol.SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) -} - // The time that the RPL rewards percentages were last updated func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) From 8267c4ae7d01b778e373a0959f0f317f21e6989a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Fri, 6 Oct 2023 22:55:57 -0400 Subject: [PATCH 658/878] Added GetDeployBlock() --- minipool/minipool-contract-v2.go | 5 ++--- minipool/minipool-contract-v3.go | 5 ++--- storage/rocket-storage.go | 13 +++++++++++++ utils/eth/logs.go | 4 ++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/minipool/minipool-contract-v2.go b/minipool/minipool-contract-v2.go index 895080341..c6335370e 100644 --- a/minipool/minipool-contract-v2.go +++ b/minipool/minipool-contract-v2.go @@ -7,7 +7,6 @@ import ( "time" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -15,6 +14,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -554,8 +554,7 @@ func (mp *minipool_v2) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOp } // Grab the lowest block number worth querying from (should never have to go back this far in practice) - deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) - fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) + fromBlockBig, err := storage.GetDeployBlock(mp.RocketPool) if err != nil { return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } diff --git a/minipool/minipool-contract-v3.go b/minipool/minipool-contract-v3.go index 3e71115fa..1f1afdcf3 100644 --- a/minipool/minipool-contract-v3.go +++ b/minipool/minipool-contract-v3.go @@ -7,7 +7,6 @@ import ( "time" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -15,6 +14,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" rptypes "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -595,8 +595,7 @@ func (mp *minipool_v3) GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOp } // Grab the lowest block number worth querying from (should never have to go back this far in practice) - deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) - fromBlockBig, err := mp.RocketPool.RocketStorage.GetUint(nil, deployBlockHash) + fromBlockBig, err := storage.GetDeployBlock(mp.RocketPool) if err != nil { return PrestakeData{}, fmt.Errorf("Error getting deploy block %s: %w", mp.Address.Hex(), err) } diff --git a/storage/rocket-storage.go b/storage/rocket-storage.go index b2704b8bb..2bf466231 100644 --- a/storage/rocket-storage.go +++ b/storage/rocket-storage.go @@ -2,9 +2,11 @@ package storage import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -53,3 +55,14 @@ func ConfirmWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Addr } return tx.Hash(), nil } + +// Get the number of the block that Rocket Pool was deployed on +func GetDeployBlock(rp *rocketpool.RocketPool) (*big.Int, error) { + deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) + deployBlock, err := rp.RocketStorage.GetUint(nil, deployBlockHash) + if err != nil { + return nil, fmt.Errorf("error getting Rocket Pool deployment block: %w", err) + } + + return deployBlock, nil +} diff --git a/utils/eth/logs.go b/utils/eth/logs.go index 3e2834fed..54c7c95f4 100644 --- a/utils/eth/logs.go +++ b/utils/eth/logs.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/storage" ) type FilterQuery struct { @@ -54,8 +55,7 @@ func GetLogs(rp *rocketpool.RocketPool, addressFilter []common.Address, topicFil // Get the block that Rocket Pool was deployed on as the lower bound if one wasn't specified if fromBlock == nil { var err error - deployBlockHash := crypto.Keccak256Hash([]byte("deploy.block")) - fromBlock, err = rp.RocketStorage.GetUint(nil, deployBlockHash) + fromBlock, err = storage.GetDeployBlock(rp) if err != nil { return nil, err } From 9226e1a043efcf235e0608b4a6dc2ce95abf9870 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sat, 7 Oct 2023 00:19:02 -0400 Subject: [PATCH 659/878] Added GetRPLInflationIntervalStartTime() --- tokens/rpl.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tokens/rpl.go b/tokens/rpl.go index e7825567f..319cac87c 100644 --- a/tokens/rpl.go +++ b/tokens/rpl.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -157,6 +158,19 @@ func GetRPLInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) return *rate, nil } +// Get the time that inflation started for this interval +func GetRPLInflationIntervalStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { + rocketTokenRPL, err := getRocketTokenRPL(rp, opts) + if err != nil { + return time.Time{}, err + } + value := new(*big.Int) + if err := rocketTokenRPL.Call(opts, value, "getInflationIntervalStartTime"); err != nil { + return time.Time{}, fmt.Errorf("Could not get RPL inflation interval start time: %w", err) + } + return time.Unix((*value).Int64(), 0), nil +} + // // Contracts // From 0073e823c64668b875e2fe4c2a892727e75a7ae5 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 16 Oct 2023 23:11:01 -0400 Subject: [PATCH 660/878] Added execution simulation to proposals --- dao/protocol/proposals.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 519c91f20..384836b67 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -1,11 +1,13 @@ package protocol import ( + "context" "fmt" "math/big" "sync" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -46,6 +48,10 @@ func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []by if err != nil { return rocketpool.GasInfo{}, err } + err = simulateProposalExecution(rp, payload) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error simulating proposal execution: %w", err) + } return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "propose", message, payload, blockNumber, treeNodes) } @@ -379,6 +385,27 @@ func ProposeKickFromSecurityCouncil(rp *rocketpool.RocketPool, message string, a return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) } +// Simulate a proposal's execution to verify it won't revert +func simulateProposalExecution(rp *rocketpool.RocketPool, payload []byte) error { + rocketDAOProposal, err := getRocketDAOProposal(rp, nil) + if err != nil { + return err + } + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return err + } + + _, err = rp.Client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: *rocketDAOProposal.Address, + To: rocketDAOProtocolProposals.Address, + GasPrice: big.NewInt(0), + Value: nil, + Data: payload, + }) + return err +} + // Get the ABI encoding of multiple values for a ProposeSettingMulti call func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any) ([][]byte, error) { // Sanity check the lengths @@ -431,9 +458,16 @@ func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any // Get contracts var rocketDAOProtocolProposalsLock sync.Mutex +var rocketDAOProposalLock sync.Mutex func getRocketDAOProtocolProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAOProtocolProposalsLock.Lock() defer rocketDAOProtocolProposalsLock.Unlock() return rp.GetContract("rocketDAOProtocolProposals", opts) } + +func getRocketDAOProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProposalLock.Lock() + defer rocketDAOProposalLock.Unlock() + return rp.GetContract("rocketDAOProposal", opts) +} From b262959236442bf5af75587994889c49d80abcb4 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 17 Oct 2023 00:53:59 -0400 Subject: [PATCH 661/878] Added GetChallengeState --- dao/protocol/voting/verify.go | 139 +++++++++++++++++++--------------- types/voting.go | 11 +++ 2 files changed, 90 insertions(+), 60 deletions(-) create mode 100644 types/voting.go diff --git a/dao/protocol/voting/verify.go b/dao/protocol/voting/verify.go index a45dc7f0a..6f07b3994 100644 --- a/dao/protocol/voting/verify.go +++ b/dao/protocol/voting/verify.go @@ -97,12 +97,25 @@ func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witn return tx.Hash(), nil } +// Get the state of a challenge on a proposal and tree node index +func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.CallOpts) (types.ChallengeState, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return types.ChallengeState_Unchallenged, err + } + state := new(types.ChallengeState) + if err := rocketDAOProtocolVerifier.Call(opts, state, "getChallengeState", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { + return types.ChallengeState_Unchallenged, fmt.Errorf("error getting proposal %d / index %d challenge state: %w", proposalId, index, err) + } + return *state, nil +} + // Get RootSubmitted event info -func GetRootSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (bool, RootSubmitted, error) { +func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]RootSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { - return false, RootSubmitted{}, err + return nil, err } // Construct a filter query for relevant logs @@ -116,46 +129,49 @@ func GetRootSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, interva // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { - return false, RootSubmitted{}, err + return nil, err } if len(logs) == 0 { - return false, RootSubmitted{}, nil - } - - // Get the log info values - values, err := rootSubmittedEvent.Inputs.Unpack(logs[0].Data) - if err != nil { - return false, RootSubmitted{}, fmt.Errorf("error unpacking RootSubmitted event data: %w", err) - } - - // Convert to a native struct - var raw rootSubmittedRaw - err = rootSubmittedEvent.Inputs.Copy(&raw, values) - if err != nil { - return false, RootSubmitted{}, fmt.Errorf("error converting RootSubmitted event data to struct: %w", err) - } - - // Get the decoded data - eventData := RootSubmitted{ - ProposalID: raw.ProposalID, - Proposer: raw.Proposer, - BlockNumber: raw.BlockNumber, - Index: raw.Index, - RootHash: raw.RootHash, - Sum: raw.Sum, - TreeNodes: raw.TreeNodes, - Timestamp: time.Unix(raw.Timestamp.Int64(), 0), - } - - return true, eventData, nil + return []RootSubmitted{}, nil + } + + events := make([]RootSubmitted, 0, len(logs)) + for _, log := range logs { + // Get the log info values + values, err := rootSubmittedEvent.Inputs.Unpack(log.Data) + if err != nil { + return nil, fmt.Errorf("error unpacking RootSubmitted event data: %w", err) + } + + // Convert to a native struct + var raw rootSubmittedRaw + err = rootSubmittedEvent.Inputs.Copy(&raw, values) + if err != nil { + return nil, fmt.Errorf("error converting RootSubmitted event data to struct: %w", err) + } + + // Get the decoded data + events = append(events, RootSubmitted{ + ProposalID: raw.ProposalID, + Proposer: raw.Proposer, + BlockNumber: raw.BlockNumber, + Index: raw.Index, + RootHash: raw.RootHash, + Sum: raw.Sum, + TreeNodes: raw.TreeNodes, + Timestamp: time.Unix(raw.Timestamp.Int64(), 0), + }) + } + + return events, nil } // Get ChallengeSubmitted event info -func GetChallengeSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) (bool, ChallengeSubmitted, error) { +func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]ChallengeSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { - return false, ChallengeSubmitted{}, err + return nil, err } // Construct a filter query for relevant logs @@ -169,34 +185,37 @@ func GetChallengeSubmittedEvent(rp *rocketpool.RocketPool, proposalID uint64, in // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) if err != nil { - return false, ChallengeSubmitted{}, err + return nil, err } if len(logs) == 0 { - return false, ChallengeSubmitted{}, nil - } - - // Get the log info values - values, err := challengeSubmittedEvent.Inputs.Unpack(logs[0].Data) - if err != nil { - return false, ChallengeSubmitted{}, fmt.Errorf("error unpacking ChallengeSubmitted event data: %w", err) - } - - // Convert to a native struct - var raw challengeSubmittedRaw - err = challengeSubmittedEvent.Inputs.Copy(&raw, values) - if err != nil { - return false, ChallengeSubmitted{}, fmt.Errorf("error converting ChallengeSubmitted event data to struct: %w", err) - } - - // Get the decoded data - eventData := ChallengeSubmitted{ - ProposalID: raw.ProposalID, - Challenger: raw.Challenger, - Index: raw.Index, - Timestamp: time.Unix(raw.Timestamp.Int64(), 0), - } - - return true, eventData, nil + return []ChallengeSubmitted{}, nil + } + + events := make([]ChallengeSubmitted, 0, len(logs)) + for _, log := range logs { + // Get the log info values + values, err := challengeSubmittedEvent.Inputs.Unpack(log.Data) + if err != nil { + return nil, fmt.Errorf("error unpacking ChallengeSubmitted event data: %w", err) + } + + // Convert to a native struct + var raw challengeSubmittedRaw + err = challengeSubmittedEvent.Inputs.Copy(&raw, values) + if err != nil { + return nil, fmt.Errorf("error converting ChallengeSubmitted event data to struct: %w", err) + } + + // Get the decoded data + events = append(events, ChallengeSubmitted{ + ProposalID: raw.ProposalID, + Challenger: raw.Challenger, + Index: raw.Index, + Timestamp: time.Unix(raw.Timestamp.Int64(), 0), + }) + } + + return events, nil } // Get contracts diff --git a/types/voting.go b/types/voting.go new file mode 100644 index 000000000..b9966accc --- /dev/null +++ b/types/voting.go @@ -0,0 +1,11 @@ +package types + +// Challenge states +type ChallengeState uint8 + +const ( + ChallengeState_Unchallenged ChallengeState = iota + ChallengeState_Challenged + ChallengeState_Responded + ChallengeState_Paid +) From 806e17c762f1698503a4d74d5af1baaa9ccb026c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 17 Oct 2023 02:43:16 -0400 Subject: [PATCH 662/878] Added ConstructProposalTreeLeaves() --- dao/protocol/voting/voting-tree-generator.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/voting-tree-generator.go index f0423dd56..b894bf032 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -37,8 +37,8 @@ func NewVotingTreeGenerator(rp *rocketpool.RocketPool) (*VotingTreeGenerator, er return g, nil } -// Gets a complete Pollard row for a new proposal based on the target block number. -func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { +// Create the complete set of leaves for a new proposal at the specified block number +func (g *VotingTreeGenerator) ConstructProposalTreeLeaves(blockNumber uint32, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { // Get an nxn array of each node's voting power and delegating status votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) if err != nil { @@ -47,23 +47,18 @@ func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, op // Get the leaf nodes of the tree leaves := g.constructLeaves(votingPowers) + return leaves, nil +} +// Gets a complete Pollard row for a new proposal based on the target block number. +func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, leaves []types.VotingTreeNode, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal _, nodes := g.generatePollard(leaves, 1) return nodes, nil } // Gets a complete proof and corresponding Pollard row to challenge an existing proposal. -func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, opts *bind.CallOpts) ([]types.VotingTreeNode, []types.VotingTreeNode, error) { - // Get an nxn array of each node's voting power and delegating status - votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) - if err != nil { - return nil, nil, fmt.Errorf("error getting voting power details: %w", err) - } - - // Get the leaf nodes of the tree - leaves := g.constructLeaves(votingPowers) - +func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, leaves []types.VotingTreeNode, opts *bind.CallOpts) ([]types.VotingTreeNode, []types.VotingTreeNode, error) { // Create the proof and Pollard row from the leaf nodes proof, nodes := g.generatePollard(leaves, targetIndex) return proof, nodes, nil From 581d134b6934e7b6f51c5edbbcf4b47e9bd83f69 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 17 Oct 2023 23:22:38 -0400 Subject: [PATCH 663/878] Switched voting tree gen to multicall --- dao/protocol/voting/voting-tree-generator.go | 232 ++++++++++++------- types/dao.go | 18 ++ types/voting.go | 11 - utils/state/network.go | 2 +- 4 files changed, 172 insertions(+), 91 deletions(-) delete mode 100644 types/voting.go diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/voting-tree-generator.go index b894bf032..fd7cabc27 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "math/big" + "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -12,59 +13,39 @@ import ( "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/multicall" "golang.org/x/sync/errgroup" ) const ( - NodeVotingDetailsBatchSize uint64 = 20 - DepthPerRound uint64 = 5 + nodeVotingDetailsBatchSize uint64 = 250 + nodeAddressBatchSize int = 1000 + depthPerRound uint64 = 5 + threadLimit int = 6 ) -type NodeVotingInfo struct { - NodeAddress common.Address - VotingPower *big.Int - Delegate common.Address -} - +// Struct for generating proposal voting trees and pollards type VotingTreeGenerator struct { - rp *rocketpool.RocketPool + rp *rocketpool.RocketPool + mcAddress common.Address } -func NewVotingTreeGenerator(rp *rocketpool.RocketPool) (*VotingTreeGenerator, error) { +// Creates a new VotingTreeGenerator instance +func NewVotingTreeGenerator(rp *rocketpool.RocketPool, multicallerAddress common.Address) (*VotingTreeGenerator, error) { g := &VotingTreeGenerator{ - rp: rp, + rp: rp, + mcAddress: multicallerAddress, } return g, nil } -// Create the complete set of leaves for a new proposal at the specified block number -func (g *VotingTreeGenerator) ConstructProposalTreeLeaves(blockNumber uint32, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { - // Get an nxn array of each node's voting power and delegating status - votingPowers, err := g.getDelegatedVotingPower(blockNumber, opts) +// Gets the voting power and delegation info for every node at the specified block +func (g *VotingTreeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(g.rp, nil) if err != nil { - return nil, fmt.Errorf("error getting voting power details: %w", err) + return nil, err } - // Get the leaf nodes of the tree - leaves := g.constructLeaves(votingPowers) - return leaves, nil -} - -// Gets a complete Pollard row for a new proposal based on the target block number. -func (g *VotingTreeGenerator) CreatePollardRowForProposal(blockNumber uint32, leaves []types.VotingTreeNode, opts *bind.CallOpts) ([]types.VotingTreeNode, error) { - // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal - _, nodes := g.generatePollard(leaves, 1) - return nodes, nil -} - -// Gets a complete proof and corresponding Pollard row to challenge an existing proposal. -func (g *VotingTreeGenerator) CreatePollardForChallenge(blockNumber uint32, targetIndex uint64, leaves []types.VotingTreeNode, opts *bind.CallOpts) ([]types.VotingTreeNode, []types.VotingTreeNode, error) { - // Create the proof and Pollard row from the leaf nodes - proof, nodes := g.generatePollard(leaves, targetIndex) - return proof, nodes, nil -} - -func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts *bind.CallOpts) ([][]*big.Int, error) { // Get the number of voting nodes nodeCountBig, err := network.GetVotingNodeCount(g.rp, blockNumber, opts) if err != nil { @@ -73,62 +54,88 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts * nodeCount := nodeCountBig.Uint64() // Get the node addresses - nodeAddresses, err := node.GetNodeAddresses(g.rp, opts) + nodeAddresses, err := g.getNodeAddressesFast(opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } - // Load node voting details in batches - votingInfos := make([]NodeVotingInfo, nodeCount) - //delegateIndices := map[common.Address]uint64{} - for bsi := uint64(0); bsi < nodeCount; bsi += NodeVotingDetailsBatchSize { - - // Get batch start & end index - nsi := bsi - nei := bsi + NodeVotingDetailsBatchSize - if nei > nodeCount { - nei = nodeCount + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + + // Run the getters in batches + votingInfos := make([]types.NodeVotingInfo, nodeCount) + for i := uint64(0); i < nodeCount; i += nodeVotingDetailsBatchSize { + i := i + max := i + nodeVotingDetailsBatchSize + if max > nodeCount { + max = nodeCount } // Load details - var wg errgroup.Group - for ni := nsi; ni < nei; ni++ { - ni := ni - wg.Go(func() error { - nodeAddress := nodeAddresses[ni] - votingPower, err := network.GetVotingPower(g.rp, nodeAddress, blockNumber, opts) - if err != nil { - return err - } - delegate, err := network.GetVotingDelegate(g.rp, nodeAddress, blockNumber, opts) - if err != nil { - return err - } - votingInfos[ni] = NodeVotingInfo{ - NodeAddress: nodeAddress, - VotingPower: votingPower, - Delegate: delegate, - } - //delegateIndices[nodeAddress] = ni - return nil - }) - } - if err := wg.Wait(); err != nil { - return nil, err - } - + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(g.rp.Client, g.mcAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + nodeAddress := nodeAddresses[j] + votingInfos[j].NodeAddress = nodeAddress + mc.AddCall(rocketNetworkVoting, &votingInfos[j].VotingPower, "getVotingPower", nodeAddress, blockNumber) + mc.AddCall(rocketNetworkVoting, &votingInfos[j].Delegate, "getDelegate", nodeAddress, blockNumber) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) } + return votingInfos, nil +} + +// Gets a complete Pollard row for a new proposal based on the target block number. +func (g *VotingTreeGenerator) CreatePollardRowForProposal(votingInfo []types.NodeVotingInfo) []types.VotingTreeNode { + // Get the 2D voting power subtree for the main tree + votingPowers := g.getDelegatedVotingPower(votingInfo) + + // Get the leaf nodes of the tree + leaves := g.constructLeaves(votingPowers) + + // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal + _, nodes := g.generatePollard(leaves, 1) + return nodes +} + +// Gets a complete proof and corresponding Pollard row to challenge an existing proposal. +func (g *VotingTreeGenerator) CreatePollardForChallenge(targetIndex uint64, votingInfo []types.NodeVotingInfo) ([]types.VotingTreeNode, []types.VotingTreeNode) { + // Get the 2D voting power subtree for the main tree + votingPowers := g.getDelegatedVotingPower(votingInfo) + + // Get the leaf nodes of the tree + leaves := g.constructLeaves(votingPowers) + + // Create the proof and Pollard row from the leaf nodes + proof, nodes := g.generatePollard(leaves, targetIndex) + return proof, nodes +} + +// Get the 2D array of voting delegation and total power for each node +func (g *VotingTreeGenerator) getDelegatedVotingPower(votingInfo []types.NodeVotingInfo) [][]*big.Int { + nodeCount := uint64(len(votingInfo)) + // For each node, create an array of nodes that have delegated to it votingPowers := make([][]*big.Int, nodeCount) for i := uint64(0); i < nodeCount; i++ { - nodeAddress := nodeAddresses[i] + nodeAddress := votingInfo[i].NodeAddress votingPower := make([]*big.Int, nodeCount) for j := uint64(0); j < nodeCount; j++ { - votingInfo := votingInfos[j] - if votingInfo.Delegate == nodeAddress { - votingPower[j] = votingInfo.VotingPower + info := votingInfo[j] + if info.Delegate == nodeAddress { + votingPower[j] = info.VotingPower } else { votingPower[j] = big.NewInt(0) } @@ -137,7 +144,7 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(blockNumber uint32, opts * } // Return - return votingPowers, nil + return votingPowers } // Create the complete set of subtree leaf nodes @@ -181,7 +188,7 @@ func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []types // For challenges, the index is the index of the node being challenged. // Returns the aggregated proof, and the list of nodes in the pollard row. func (g *VotingTreeGenerator) generatePollard(leafNodes []types.VotingTreeNode, index uint64) ([]types.VotingTreeNode, []types.VotingTreeNode) { - order := DepthPerRound + order := depthPerRound offset := uint64(math.Floor(math.Log2(float64(index)))) // Depth of the node being challenged, if not building a proposal depth := uint64(math.Log2(float64(len(leafNodes)))) // Total depth of the tree @@ -246,6 +253,57 @@ func (g *VotingTreeGenerator) generatePollard(leafNodes []types.VotingTreeNode, return proof, nodes } +// Get all node addresses using a multicaller +func (g *VotingTreeGenerator) getNodeAddressesFast(opts *bind.CallOpts) ([]common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(g.rp, opts) + if err != nil { + return nil, err + } + + // Get minipool count + nodeCount, err := node.GetNodeCount(g.rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + addresses := make([]common.Address, nodeCount) + + // Run the getters in batches + count := int(nodeCount) + for i := 0; i < count; i += nodeAddressBatchSize { + i := i + max := i + nodeAddressBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(g.rp.Client, g.mcAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(rocketNodeManager, &addresses[j], "getNodeAt", big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + + return addresses, nil +} + // Get the keccak hash of a parent node with two children func getParentNodeFromChildren(leftChild types.VotingTreeNode, rightChild types.VotingTreeNode) types.VotingTreeNode { leftBuffer := [32]byte{} @@ -268,3 +326,19 @@ func getHashForBalance(balance *big.Int) common.Hash { hash := crypto.Keccak256Hash(buffer[:]) return hash } + +// Get contracts +var rocketNodeManagerLock sync.Mutex +var rocketNetworkVotingLock sync.Mutex + +func getRocketNodeManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNodeManagerLock.Lock() + defer rocketNodeManagerLock.Unlock() + return rp.GetContract("rocketNodeManager", opts) +} + +func getRocketNetworkVoting(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNetworkVotingLock.Lock() + defer rocketNetworkVotingLock.Unlock() + return rp.GetContract("rocketNetworkVoting", opts) +} diff --git a/types/dao.go b/types/dao.go index e1df2a212..bf374eca4 100644 --- a/types/dao.go +++ b/types/dao.go @@ -32,6 +32,24 @@ const ( ProposalSettingType_Address ) +// Challenge states +type ChallengeState uint8 + +const ( + ChallengeState_Unchallenged ChallengeState = iota + ChallengeState_Challenged + ChallengeState_Responded + ChallengeState_Paid +) + +// Info about a node's voting power +type NodeVotingInfo struct { + NodeAddress common.Address `json:"nodeAddress"` + VotingPower *big.Int `json:"votingPower"` + Delegate common.Address `json:"delegate"` +} + +// A node of the voting Merkle Tree (not a Rocket Pool node) type VotingTreeNode struct { Sum *big.Int `abi:"sum" json:"sum"` Hash common.Hash `abi:"hash" json:"hash"` diff --git a/types/voting.go b/types/voting.go deleted file mode 100644 index b9966accc..000000000 --- a/types/voting.go +++ /dev/null @@ -1,11 +0,0 @@ -package types - -// Challenge states -type ChallengeState uint8 - -const ( - ChallengeState_Unchallenged ChallengeState = iota - ChallengeState_Challenged - ChallengeState_Responded - ChallengeState_Paid -) diff --git a/utils/state/network.go b/utils/state/network.go index 868b7d3fb..8d1525d96 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -180,7 +180,7 @@ func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkCont } // Get the list of node addresses - addresses, err := getNodeAddressesFast(rp, contracts, opts) + addresses, err := GetNodeAddressesFast(rp, contracts, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } From 2f23ab7f931c6e4b18cd287c6c12ca5992fad35c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 18 Oct 2023 03:16:05 -0400 Subject: [PATCH 664/878] Missed a file save --- dao/protocol/voting/voting-tree-generator.go | 10 +++++----- utils/state/network.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/voting-tree-generator.go index fd7cabc27..bf48c2714 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -102,10 +102,10 @@ func (g *VotingTreeGenerator) CreatePollardRowForProposal(votingInfo []types.Nod votingPowers := g.getDelegatedVotingPower(votingInfo) // Get the leaf nodes of the tree - leaves := g.constructLeaves(votingPowers) + leafNodes := g.constructLeafNodes(votingPowers) // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal - _, nodes := g.generatePollard(leaves, 1) + _, nodes := g.generatePollard(leafNodes, 1) return nodes } @@ -115,10 +115,10 @@ func (g *VotingTreeGenerator) CreatePollardForChallenge(targetIndex uint64, voti votingPowers := g.getDelegatedVotingPower(votingInfo) // Get the leaf nodes of the tree - leaves := g.constructLeaves(votingPowers) + leafNodes := g.constructLeafNodes(votingPowers) // Create the proof and Pollard row from the leaf nodes - proof, nodes := g.generatePollard(leaves, targetIndex) + proof, nodes := g.generatePollard(leafNodes, targetIndex) return proof, nodes } @@ -148,7 +148,7 @@ func (g *VotingTreeGenerator) getDelegatedVotingPower(votingInfo []types.NodeVot } // Create the complete set of subtree leaf nodes -func (g *VotingTreeGenerator) constructLeaves(votingPowers [][]*big.Int) []types.VotingTreeNode { +func (g *VotingTreeGenerator) constructLeafNodes(votingPowers [][]*big.Int) []types.VotingTreeNode { nodeCount := uint64(len(votingPowers)) if nodeCount == 0 { return []types.VotingTreeNode{} diff --git a/utils/state/network.go b/utils/state/network.go index 8d1525d96..868b7d3fb 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -180,7 +180,7 @@ func GetTotalEffectiveRplStake(rp *rocketpool.RocketPool, contracts *NetworkCont } // Get the list of node addresses - addresses, err := GetNodeAddressesFast(rp, contracts, opts) + addresses, err := getNodeAddressesFast(rp, contracts, opts) if err != nil { return nil, fmt.Errorf("error getting node addresses: %w", err) } From e8f106c98d1a4a37d58adc7b9ef14c6a0043dc0a Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 18 Oct 2023 22:28:00 -0400 Subject: [PATCH 665/878] Added RPL withdrawal address functions --- node/node.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ node/staking.go | 15 ++++++++- 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/node/node.go b/node/node.go index f29decc0a..ced899ce8 100644 --- a/node/node.go +++ b/node/node.go @@ -544,6 +544,89 @@ func GetSmoothingPoolRegisteredNodeCount(rp *rocketpool.RocketPool, opts *bind.C } +// Check if the RPL-specific withdrawal address has been set +func GetNodeRPLWithdrawalAddressIsSet(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketNodeManager.Call(opts, value, "getNodeRPLWithdrawalAddressIsSet", nodeAddress); err != nil { + return false, fmt.Errorf("error getting node %s's RPL withdrawal address status: %w", nodeAddress.Hex(), err) + } + return *value, nil +} + +// Get the RPL-specific withdrawal address +func GetNodeRPLWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketNodeManager.Call(opts, value, "getNodeRPLWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("error getting node %s's RPL withdrawal address: %w", nodeAddress.Hex(), err) + } + return *value, nil +} + +// Get the pending RPL-specific withdrawal address +func GetNodePendingRPLWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketNodeManager.Call(opts, value, "getNodePendingRPLWithdrawalAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("error getting node %s's pending RPL withdrawal address: %w", nodeAddress.Hex(), err) + } + return *value, nil +} + +// Estimate the gas for setting the RPL-specific withdrawal address +func EstimateSetRPLWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "setRPLWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) +} + +// Set the RPL-specific withdrawal address +func SetRPLWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, withdrawalAddress common.Address, confirm bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeManager.Transact(opts, "setRPLWithdrawalAddress", nodeAddress, withdrawalAddress, confirm) + if err != nil { + return common.Hash{}, fmt.Errorf("error setting RPL withdrawal address: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas for confirming the RPL-specific withdrawal address +func EstimateConfirmRPLWithdrawalAddressGas(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "confirmRPLWithdrawalAddress", nodeAddress) +} + +// Confirm the RPL-specific withdrawal address +func ConfirmRPLWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeManager.Transact(opts, "confirmRPLWithdrawalAddress", nodeAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("error confirming RPL withdrawal address: %w", err) + } + return tx.Hash(), nil +} + // Get contracts var rocketNodeManagerLock sync.Mutex diff --git a/node/staking.go b/node/staking.go index 442aa919a..1686b1ca3 100644 --- a/node/staking.go +++ b/node/staking.go @@ -216,7 +216,7 @@ func CalculateTotalEffectiveRPLStake(rp *rocketpool.RocketPool, offset, limit, r } // Get the amount of RPL locked as part of active PDAO proposals or challenges -func GetNodeRplLocked(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { +func GetNodeRPLLocked(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { return nil, err @@ -228,6 +228,19 @@ func GetNodeRplLocked(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return *value, nil } +// Check if the RPL-specific withdrawal address has been set +func GetNodeRPLWithdrawalAddressIsSet(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketNodeStaking.Call(opts, value, "getNodeRPLWithdrawalAddressIsSet", nodeAddress); err != nil { + return false, fmt.Errorf("error getting node RPL withdrawal address status: %w", err) + } + return *value, nil +} + // Get contracts var rocketNodeStakingLock sync.Mutex From f36a9141e1f4102cda9308a423288ad73d389445 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 18 Oct 2023 22:44:05 -0400 Subject: [PATCH 666/878] Added RPL withdrawal address to NodeDetails --- node/node.go | 52 ++++++++++++++++++++++++++++++----------- node/staking.go | 13 ----------- tests/node/node_test.go | 4 ++-- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/node/node.go b/node/node.go index ced899ce8..c30be3036 100644 --- a/node/node.go +++ b/node/node.go @@ -27,11 +27,14 @@ const ( // Node details type NodeDetails struct { - Address common.Address `json:"address"` - Exists bool `json:"exists"` - WithdrawalAddress common.Address `json:"withdrawalAddress"` - PendingWithdrawalAddress common.Address `json:"pendingWithdrawalAddress"` - TimezoneLocation string `json:"timezoneLocation"` + Address common.Address `json:"address"` + Exists bool `json:"exists"` + PrimaryWithdrawalAddress common.Address `json:"primaryWithdrawalAddress"` + PendingPrimaryWithdrawalAddress common.Address `json:"pendingPrimaryWithdrawalAddress"` + IsRPLWithdrawalAddressSet bool `json:"isRPLWithdrawalAddressSet"` + RPLWithdrawalAddress common.Address `json:"rplWithdrawalAddress"` + PendingRPLWithdrawalAddress common.Address `json:"pendingRPLWithdrawalAddress"` + TimezoneLocation string `json:"timezoneLocation"` } // Count of nodes belonging to a timezone @@ -153,8 +156,11 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Data var wg errgroup.Group var exists bool - var withdrawalAddress common.Address - var pendingWithdrawalAddress common.Address + var primaryWithdrawalAddress common.Address + var pendingPrimaryWithdrawalAddress common.Address + var isRPLWithdrawalAddressSet bool + var rplWithdrawalAddress common.Address + var pendingRPLWithdrawalAddress common.Address var timezoneLocation string // Load data @@ -165,12 +171,27 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts }) wg.Go(func() error { var err error - withdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) + primaryWithdrawalAddress, err = storage.GetNodeWithdrawalAddress(rp, nodeAddress, opts) return err }) wg.Go(func() error { var err error - pendingWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) + pendingPrimaryWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + isRPLWithdrawalAddressSet, err = GetNodeRPLWithdrawalAddressIsSet(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + rplWithdrawalAddress, err = GetNodeRPLWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + pendingRPLWithdrawalAddress, err = GetNodePendingRPLWithdrawalAddress(rp, nodeAddress, opts) return err }) wg.Go(func() error { @@ -186,11 +207,14 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts // Return return NodeDetails{ - Address: nodeAddress, - Exists: exists, - WithdrawalAddress: withdrawalAddress, - PendingWithdrawalAddress: pendingWithdrawalAddress, - TimezoneLocation: timezoneLocation, + Address: nodeAddress, + Exists: exists, + PrimaryWithdrawalAddress: primaryWithdrawalAddress, + PendingPrimaryWithdrawalAddress: pendingPrimaryWithdrawalAddress, + IsRPLWithdrawalAddressSet: isRPLWithdrawalAddressSet, + RPLWithdrawalAddress: rplWithdrawalAddress, + PendingRPLWithdrawalAddress: pendingRPLWithdrawalAddress, + TimezoneLocation: timezoneLocation, }, nil } diff --git a/node/staking.go b/node/staking.go index 1686b1ca3..92ac31da6 100644 --- a/node/staking.go +++ b/node/staking.go @@ -228,19 +228,6 @@ func GetNodeRPLLocked(rp *rocketpool.RocketPool, nodeAddress common.Address, opt return *value, nil } -// Check if the RPL-specific withdrawal address has been set -func GetNodeRPLWithdrawalAddressIsSet(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { - rocketNodeStaking, err := getRocketNodeStaking(rp, opts) - if err != nil { - return false, err - } - value := new(bool) - if err := rocketNodeStaking.Call(opts, value, "getNodeRPLWithdrawalAddressIsSet", nodeAddress); err != nil { - return false, fmt.Errorf("error getting node RPL withdrawal address status: %w", err) - } - return *value, nil -} - // Get contracts var rocketNodeStakingLock sync.Mutex diff --git a/tests/node/node_test.go b/tests/node/node_test.go index 59874b63e..b822b8122 100644 --- a/tests/node/node_test.go +++ b/tests/node/node_test.go @@ -57,8 +57,8 @@ func TestRegisterNode(t *testing.T) { if !nodeDetails.Exists { t.Error("Incorrect node exists status") } - if !bytes.Equal(nodeDetails.WithdrawalAddress.Bytes(), nodeAccount.Address.Bytes()) { - t.Errorf("Incorrect node withdrawal address '%s'", nodeDetails.WithdrawalAddress.Hex()) + if !bytes.Equal(nodeDetails.PrimaryWithdrawalAddress.Bytes(), nodeAccount.Address.Bytes()) { + t.Errorf("Incorrect node withdrawal address '%s'", nodeDetails.PrimaryWithdrawalAddress.Hex()) } if nodeDetails.TimezoneLocation != timezoneLocation { t.Errorf("Incorrect node timezone location '%s'", nodeDetails.TimezoneLocation) From 1f4f845550aa3c80e1ddc149913de6da5626a40e Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 24 Oct 2023 22:28:04 -0400 Subject: [PATCH 667/878] Added views for individual rewards percentages --- rewards/rewards.go | 39 ++++++++++++++++++++++++++++++++++++ settings/protocol/rewards.go | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/rewards/rewards.go b/rewards/rewards.go index a68f930c2..b22aa43ec 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -100,6 +100,45 @@ func GetClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time. return time.Duration((*unixTime).Int64()) * time.Second, nil } +// Get the percent of checkpoint rewards that goes to node operators +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimNode"); err != nil { + return nil, fmt.Errorf("error getting node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the percent of checkpoint rewards that goes to ODAO members +func GetTrustedNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimTrustedNode"); err != nil { + return nil, fmt.Errorf("error getting trusted node operator rewards percent: %w", err) + } + return *perc, nil +} + +// Get the percent of checkpoint rewards that goes to the PDAO +func GetProtocolDaoRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return nil, err + } + perc := new(*big.Int) + if err := rocketRewardsPool.Call(opts, perc, "getClaimingContractPerc", "rocketClaimDAO"); err != nil { + return nil, fmt.Errorf("error getting protocol DAO rewards percent: %w", err) + } + return *perc, nil +} + // Get the amount of RPL rewards that will be provided to node operators func GetPendingRPLRewards(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, opts) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 0f47c3f8a..dcabb3a83 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -41,6 +41,45 @@ func GetRewardsPercentages(rp *rocketpool.RocketPool, opts *bind.CallOpts) (RplR return *value, nil } +// The total RPL rewards percentage for node operator collateral +func GetNodeOperatorRewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersNodePerc"); err != nil { + return nil, fmt.Errorf("error getting node operator rewards percent: %w", err) + } + return *value, nil +} + +// The total RPL rewards percentage for Oracle DAO members +func GetOracleDAORewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersTrustedNodePerc"); err != nil { + return nil, fmt.Errorf("error getting oracle DAO rewards percent: %w", err) + } + return *value, nil +} + +// The total RPL rewards percentage for the Protocol DAO treasury +func GetProtocolDAORewardsPercent(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rewardsSettingsContract.Call(opts, value, "getRewardsClaimersProtocolPerc"); err != nil { + return nil, fmt.Errorf("error getting protocol DAO rewards percent: %w", err) + } + return *value, nil +} + // The time that the RPL rewards percentages were last updated func GetRewardsClaimerPercTimeUpdated(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rewardsSettingsContract, err := getRewardsSettingsContract(rp, opts) From 90d1d2e61034a167ba57f821b8684fff076eb095 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 24 Oct 2023 23:26:42 -0400 Subject: [PATCH 668/878] Added backwards compatibility for Atlas and a Houston version check --- node/node.go | 40 ++++++++++++++++++++++------------------ utils/version-checker.go | 20 +++++++++++++------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/node/node.go b/node/node.go index c30be3036..2445b6063 100644 --- a/node/node.go +++ b/node/node.go @@ -64,7 +64,8 @@ func GetNodeManagerVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint } // Get all node details -func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, error) { +// The 'includeRplWithdrawalAddress' flag is used for backwards compatibility with Atlas, - set it to `false` if Houston hasn't been deployed yet +func GetNodes(rp *rocketpool.RocketPool, includeRplWithdrawalAddress bool, opts *bind.CallOpts) ([]NodeDetails, error) { // Get node addresses nodeAddresses, err := GetNodeAddresses(rp, opts) @@ -89,7 +90,7 @@ func GetNodes(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]NodeDetails, er ni := ni wg.Go(func() error { nodeAddress := nodeAddresses[ni] - nodeDetails, err := GetNodeDetails(rp, nodeAddress, opts) + nodeDetails, err := GetNodeDetails(rp, nodeAddress, includeRplWithdrawalAddress, opts) if err == nil { details[ni] = nodeDetails } @@ -151,7 +152,8 @@ func GetNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common. } // Get a node's details -func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (NodeDetails, error) { +// The 'includeRplWithdrawalAddress' flag is used for backwards compatibility with Atlas, - set it to `false` if Houston hasn't been deployed yet +func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, includeRplWithdrawalAddress bool, opts *bind.CallOpts) (NodeDetails, error) { // Data var wg errgroup.Group @@ -179,21 +181,23 @@ func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, opts pendingPrimaryWithdrawalAddress, err = storage.GetNodePendingWithdrawalAddress(rp, nodeAddress, opts) return err }) - wg.Go(func() error { - var err error - isRPLWithdrawalAddressSet, err = GetNodeRPLWithdrawalAddressIsSet(rp, nodeAddress, opts) - return err - }) - wg.Go(func() error { - var err error - rplWithdrawalAddress, err = GetNodeRPLWithdrawalAddress(rp, nodeAddress, opts) - return err - }) - wg.Go(func() error { - var err error - pendingRPLWithdrawalAddress, err = GetNodePendingRPLWithdrawalAddress(rp, nodeAddress, opts) - return err - }) + if includeRplWithdrawalAddress { + wg.Go(func() error { + var err error + isRPLWithdrawalAddressSet, err = GetNodeRPLWithdrawalAddressIsSet(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + rplWithdrawalAddress, err = GetNodeRPLWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + wg.Go(func() error { + var err error + pendingRPLWithdrawalAddress, err = GetNodePendingRPLWithdrawalAddress(rp, nodeAddress, opts) + return err + }) + } wg.Go(func() error { var err error timezoneLocation, err = GetNodeTimezoneLocation(rp, nodeAddress, opts) diff --git a/utils/version-checker.go b/utils/version-checker.go index 8a4988a6b..46c660ff9 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -11,7 +11,17 @@ import ( func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { - // Check for v1.2 + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) + if err != nil { + return nil, fmt.Errorf("error checking node manager version: %w", err) + } + + // Check for v1.3 (Houston) + if nodeMgrVersion > 3 { + return version.NewSemver("1.3.0") + } + + // Check for v1.2 (Atlas) nodeStakingVersion, err := node.GetNodeStakingVersion(rp, opts) if err != nil { return nil, fmt.Errorf("error checking node staking version: %w", err) @@ -20,16 +30,12 @@ func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version return version.NewSemver("1.2.0") } - // Check for v1.1 - nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) - if err != nil { - return nil, fmt.Errorf("error checking node manager version: %w", err) - } + // Check for v1.1 (Redstone) if nodeMgrVersion > 1 { return version.NewSemver("1.1.0") } - // v1.0 + // v1.0 (Classic) return version.NewSemver("1.0.0") } From e8df2c70fde2dbe3798c64af2a17b04527835e51 Mon Sep 17 00:00:00 2001 From: fornax Date: Wed, 25 Oct 2023 23:50:52 -0300 Subject: [PATCH 669/878] Remove last reportable block. --- network/balances.go | 13 ------------- network/prices.go | 13 ------------- utils/state/network.go | 8 -------- 3 files changed, 34 deletions(-) diff --git a/network/balances.go b/network/balances.go index 68921088c..0ae3e68a0 100644 --- a/network/balances.go +++ b/network/balances.go @@ -118,19 +118,6 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt return tx.Hash(), nil } -// Returns the latest block number that oracles should be reporting balances for -func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) - if err != nil { - return nil, err - } - latestReportableBlock := new(*big.Int) - if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("error getting latest reportable block: %w", err) - } - return *latestReportableBlock, nil -} - // Returns an array of block numbers for balances submissions the given trusted node has submitted since fromBlock func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { // Get contracts diff --git a/network/prices.go b/network/prices.go index b4c89785a..49092033a 100644 --- a/network/prices.go +++ b/network/prices.go @@ -66,19 +66,6 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, op return tx.Hash(), nil } -// Returns the latest block number that oracles should be reporting prices for -func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) - if err != nil { - return nil, err - } - latestReportableBlock := new(*big.Int) - if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { - return nil, fmt.Errorf("error getting latest reportable block: %w", err) - } - return *latestReportableBlock, nil -} - // Returns an array of block numbers for prices submissions the given trusted node has submitted since fromBlock func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, fromBlock uint64, intervalSize *big.Int, opts *bind.CallOpts) (*[]uint64, error) { // Get contracts diff --git a/utils/state/network.go b/utils/state/network.go index 868b7d3fb..7bdccc655 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -39,7 +39,6 @@ type NetworkDetails struct { RPLInflationIntervalRate *big.Int RPLTotalSupply *big.Int PricesBlock uint64 - LatestReportablePricesBlock uint64 ETHUtilizationRate float64 StakingETHBalance *big.Int RETHExchangeRate float64 @@ -50,7 +49,6 @@ type NetworkDetails struct { SmoothingPoolBalance *big.Int NodeFee float64 BalancesBlock *big.Int - LatestReportableBalancesBlock *big.Int SubmitBalancesEnabled bool SubmitPricesEnabled bool MinipoolLaunchTimeout *big.Int @@ -79,12 +77,10 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( var effectiveQueueCapacity *big.Int var totalQueueLength *big.Int var pricesBlock *big.Int - var latestReportablePricesBlock *big.Int var ethUtilizationRate *big.Int var rETHExchangeRate *big.Int var nodeFee *big.Int var balancesBlock *big.Int - var latestReportableBalancesBlock *big.Int var minipoolLaunchTimeout *big.Int var promotionScrubPeriodSeconds *big.Int var windowStartRaw *big.Int @@ -110,7 +106,6 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") - contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") @@ -119,7 +114,6 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") contracts.Multicaller.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") - contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") @@ -147,12 +141,10 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() - details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) details.BalancesBlock = balancesBlock - details.LatestReportableBalancesBlock = latestReportableBalancesBlock details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From 644fd4d9a35ad2eaaa7bf39332f560f05d68c99d Mon Sep 17 00:00:00 2001 From: fornax Date: Mon, 30 Oct 2023 17:31:19 -0300 Subject: [PATCH 670/878] Change frequency to epochs. --- settings/protocol/network.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 9cc86a483..d6b78385e 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -19,9 +19,9 @@ const ( NetworkSettingsContractName string = "rocketDAOProtocolSettingsNetwork" NodeConsensusThresholdSettingPath string = "network.consensus.threshold" SubmitBalancesEnabledSettingPath string = "network.submit.balances.enabled" - SubmitBalancesFrequencySettingPath string = "network.submit.balances.frequency" + SubmitBalancesEpochsSettingPath string = "network.submit.balances.epochs" SubmitPricesEnabledSettingPath string = "network.submit.prices.enabled" - SubmitPricesFrequencySettingPath string = "network.submit.prices.frequency" + SubmitPricesEpochsSettingPath string = "network.submit.prices.epochs" MinimumNodeFeeSettingPath string = "network.node.fee.minimum" TargetNodeFeeSettingPath string = "network.node.fee.target" MaximumNodeFeeSettingPath string = "network.node.fee.maximum" @@ -70,23 +70,23 @@ func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bo return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitBalancesEnabledSettingPath), NetworkSettingsContractName, SubmitBalancesEnabledSettingPath, value, blockNumber, treeNodes, opts) } -// The frequency in blocks at which network balances should be submitted by trusted nodes -func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The frequency in epochs at which network balances should be submitted by trusted nodes +func GetSubmitBalancesEpochs(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEpochs"); err != nil { return 0, fmt.Errorf("error getting network balance submission frequency: %w", err) } return (*value).Uint64(), nil } -func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) +func ProposeSubmitBalancesEpochs(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesEpochsSettingPath), NetworkSettingsContractName, SubmitBalancesEpochsSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitBalancesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSubmitBalancesEpochsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesEpochsSettingPath), NetworkSettingsContractName, SubmitBalancesEpochsSettingPath, value, blockNumber, treeNodes, opts) } // Network price submissions currently enabled @@ -108,23 +108,23 @@ func EstimateProposeSubmitPricesEnabledGas(rp *rocketpool.RocketPool, value bool return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitPricesEnabledSettingPath), NetworkSettingsContractName, SubmitPricesEnabledSettingPath, value, blockNumber, treeNodes, opts) } -// The frequency in blocks at which network prices should be submitted by trusted nodes -func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The frequency in epochs at which network prices should be submitted by trusted nodes +func GetSubmitPricesEpochs(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEpochs"); err != nil { return 0, fmt.Errorf("error getting network price submission frequency: %w", err) } return (*value).Uint64(), nil } -func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) +func ProposeSubmitPricesEpochs(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesEpochsSettingPath), NetworkSettingsContractName, SubmitPricesEpochsSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitPricesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSubmitPricesEpochsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesEpochsSettingPath), NetworkSettingsContractName, SubmitPricesEpochsSettingPath, value, blockNumber, treeNodes, opts) } // Minimum node commission rate From ea3bfa4778ec9576b12eb28656ceae84214084f0 Mon Sep 17 00:00:00 2001 From: fornax Date: Tue, 31 Oct 2023 01:08:37 -0300 Subject: [PATCH 671/878] Add interval epochs. --- network/balances.go | 6 ++++-- network/prices.go | 6 ++++-- utils/state/network.go | 8 ++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/network/balances.go b/network/balances.go index 0ae3e68a0..312184626 100644 --- a/network/balances.go +++ b/network/balances.go @@ -173,10 +173,11 @@ func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, i return results, nil } +// TODO: will be adjusted/removed // Returns a mapping of members and whether they have submitted balances this interval or not func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + updateBalancesFrequency, err := protocol.GetSubmitBalancesEpochs(rp, opts) if err != nil { return nil, err } @@ -208,10 +209,11 @@ func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, interv return participationTable, nil } +// TODO: will be adjusted/removed // Calculates the participation rate of every trusted node on balance submission since the last block that member count changed func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) + updateBalancesFrequency, err := protocol.GetSubmitBalancesEpochs(rp, opts) if err != nil { return nil, err } diff --git a/network/prices.go b/network/prices.go index 49092033a..4932d6a5e 100644 --- a/network/prices.go +++ b/network/prices.go @@ -120,10 +120,11 @@ func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, int return results, nil } +// TODO: will be adjusted/removed // Returns a mapping of members and whether they have submitted prices this interval or not func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + updatePricesFrequency, err := protocol.GetSubmitPricesEpochs(rp, opts) if err != nil { return nil, err } @@ -155,10 +156,11 @@ func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, interval return participationTable, nil } +// TODO: needs adjustments // Calculates the participation rate of every trusted node on price submission since the last block that member count changed func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) + updatePricesFrequency, err := protocol.GetSubmitPricesEpochs(rp, opts) // if err != nil { return nil, err } diff --git a/utils/state/network.go b/utils/state/network.go index 7bdccc655..d9b6c2aa9 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -39,6 +39,7 @@ type NetworkDetails struct { RPLInflationIntervalRate *big.Int RPLTotalSupply *big.Int PricesBlock uint64 + PricesIntervalEpochs uint64 ETHUtilizationRate float64 StakingETHBalance *big.Int RETHExchangeRate float64 @@ -49,6 +50,7 @@ type NetworkDetails struct { SmoothingPoolBalance *big.Int NodeFee float64 BalancesBlock *big.Int + BalancesIntervalEpochs uint64 SubmitBalancesEnabled bool SubmitPricesEnabled bool MinipoolLaunchTimeout *big.Int @@ -77,10 +79,12 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( var effectiveQueueCapacity *big.Int var totalQueueLength *big.Int var pricesBlock *big.Int + var pricesIntervalEpochs *big.Int var ethUtilizationRate *big.Int var rETHExchangeRate *big.Int var nodeFee *big.Int var balancesBlock *big.Int + var balancesIntervalEpochs *big.Int var minipoolLaunchTimeout *big.Int var promotionScrubPeriodSeconds *big.Int var windowStartRaw *big.Int @@ -106,6 +110,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesIntervalEpochs, "getSubmitPricesEpochs") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") @@ -114,6 +119,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") contracts.Multicaller.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesIntervalEpochs, "getSubmitBalancesEpochs") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") @@ -141,10 +147,12 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() + details.PricesIntervalEpochs = pricesIntervalEpochs.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) details.BalancesBlock = balancesBlock + details.BalancesIntervalEpochs = balancesIntervalEpochs.Uint64() details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From adb42776533381a55a0d7399bfc7d104fe9e31a1 Mon Sep 17 00:00:00 2001 From: fornax Date: Wed, 1 Nov 2023 01:20:40 -0300 Subject: [PATCH 672/878] Adding the slotTimestamp --- network/balances.go | 8 ++++---- network/prices.go | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/network/balances.go b/network/balances.go index 312184626..3871246ee 100644 --- a/network/balances.go +++ b/network/balances.go @@ -97,21 +97,21 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } // Estimate the gas of SubmitBalances -func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), totalEth, stakingEth, rethSupply) } // Submit network balances for an epoch -func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), stakingEth, rethSupply) if err != nil { return common.Hash{}, fmt.Errorf("error submitting network balances: %w", err) } diff --git a/network/prices.go b/network/prices.go index 4932d6a5e..84498948f 100644 --- a/network/prices.go +++ b/network/prices.go @@ -45,21 +45,21 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } // Estimate the gas of SubmitPrices -func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), rplPrice) } // Submit network prices and total effective RPL stake for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)),big.NewInt(int64(slotTimestamp)), rplPrice) if err != nil { return common.Hash{}, fmt.Errorf("error submitting network prices: %w", err) } From d8fee467acfba2979bc2adb76068fbb2af7cae6e Mon Sep 17 00:00:00 2001 From: fornax Date: Wed, 1 Nov 2023 18:23:35 -0300 Subject: [PATCH 673/878] Fetch price/balances update events --- network/balances.go | 46 ++++++++++++++++++++++++++++++++++++++++++ network/prices.go | 49 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/network/balances.go b/network/balances.go index 3871246ee..825ce1d39 100644 --- a/network/balances.go +++ b/network/balances.go @@ -18,6 +18,14 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Info for a balances updated event +type BalancesUpdatedEvent struct { + BlockNumber *big.Int `json:"blockNumber"` + SlotTimestamp *big.Int `json:"slotTimestamp"` + RplPrice *big.Int `json:"rplPrice"` + Time *big.Int `json:"time"` +} + // Get the block number which network balances are current for func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) @@ -173,6 +181,44 @@ func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, i return results, nil } +func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, BalancesUpdatedEvent, error) { + // Get contracts + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return false, BalancesUpdatedEvent{}, err + } + + // Construct a filter query for relevant logs + balancesUpdatedEvent := rocketNetworkBalances.ABI.Events["BalancesUpdated"] + currentAddress := *rocketNetworkBalances.Address + indexBytes := [32]byte{} + topicFilter := [][]common.Hash{{balancesUpdatedEvent.ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, []common.Address{currentAddress}, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) + if err != nil { + return false, BalancesUpdatedEvent{}, err + } + if len(logs) == 0 { + return false, BalancesUpdatedEvent{}, nil + } + + // Get the log info values + values, err := balancesUpdatedEvent.Inputs.Unpack(logs[0].Data) + if err != nil { + return false, BalancesUpdatedEvent{}, fmt.Errorf("error unpacking price updated event data: %w", err) + } + + // Convert to a native struct + var eventData BalancesUpdatedEvent + err = balancesUpdatedEvent.Inputs.Copy(&eventData, values) + if err != nil { + return false, BalancesUpdatedEvent{}, fmt.Errorf("error converting price updated event data to struct: %w", err) + } + + return true, eventData, nil +} + // TODO: will be adjusted/removed // Returns a mapping of members and whether they have submitted balances this interval or not func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { diff --git a/network/prices.go b/network/prices.go index 84498948f..1dfaf1c47 100644 --- a/network/prices.go +++ b/network/prices.go @@ -18,6 +18,14 @@ import ( "github.com/rocket-pool/rocketpool-go/utils/eth" ) +// Info for a price updated event +type PriceUpdatedEvent struct { + BlockNumber *big.Int `json:"blockNumber"` + SlotTimestamp *big.Int `json:"slotTimestamp"` + RplPrice *big.Int `json:"rplPrice"` + Time *big.Int `json:"time"` +} + // Get the block number which network prices are current for func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) @@ -59,7 +67,7 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint64, if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)),big.NewInt(int64(slotTimestamp)), rplPrice) + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), rplPrice) if err != nil { return common.Hash{}, fmt.Errorf("error submitting network prices: %w", err) } @@ -120,6 +128,45 @@ func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, int return results, nil } +// Get the event info for a price update +func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, PriceUpdatedEvent, error) { + // Get contracts + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return false, PriceUpdatedEvent{}, err + } + + // Construct a filter query for relevant logs + pricesUpdatedEvent := rocketNetworkPrices.ABI.Events["PricesUpdated"] + currentAddress := *rocketNetworkPrices.Address + indexBytes := [32]byte{} + topicFilter := [][]common.Hash{{pricesUpdatedEvent.ID}, {indexBytes}} + + // Get the event logs + logs, err := eth.GetLogs(rp, []common.Address{currentAddress}, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) + if err != nil { + return false, PriceUpdatedEvent{}, err + } + if len(logs) == 0 { + return false, PriceUpdatedEvent{}, nil + } + + // Get the log info values + values, err := pricesUpdatedEvent.Inputs.Unpack(logs[0].Data) + if err != nil { + return false, PriceUpdatedEvent{}, fmt.Errorf("error unpacking price updated event data: %w", err) + } + + // Convert to a native struct + var eventData PriceUpdatedEvent + err = pricesUpdatedEvent.Inputs.Copy(&eventData, values) + if err != nil { + return false, PriceUpdatedEvent{}, fmt.Errorf("error converting price updated event data to struct: %w", err) + } + + return true, eventData, nil +} + // TODO: will be adjusted/removed // Returns a mapping of members and whether they have submitted prices this interval or not func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { From 1d750b99c96be2f4ad33589e472bda0f4dc45bfc Mon Sep 17 00:00:00 2001 From: fornax Date: Wed, 1 Nov 2023 18:31:49 -0300 Subject: [PATCH 674/878] Fix BalancesUpdatedEvent --- network/balances.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/network/balances.go b/network/balances.go index 825ce1d39..86770dd31 100644 --- a/network/balances.go +++ b/network/balances.go @@ -20,10 +20,12 @@ import ( // Info for a balances updated event type BalancesUpdatedEvent struct { - BlockNumber *big.Int `json:"blockNumber"` - SlotTimestamp *big.Int `json:"slotTimestamp"` - RplPrice *big.Int `json:"rplPrice"` - Time *big.Int `json:"time"` + BlockNumber *big.Int `json:"blockNumber"` + SlotTimestamp *big.Int `json:"slotTimestamp"` + TotalEth *big.Int `json:"totalEth"` + StakingEth *big.Int `json:"stakingEth"` + RethSupply *big.Int `json:"rethSupply"` + BlockTimestamp *big.Int `json:"blockTimestamp"` } // Get the block number which network balances are current for From 0405b97020ae41c283d7b7d68904ed762471a0a7 Mon Sep 17 00:00:00 2001 From: fornax Date: Thu, 2 Nov 2023 02:04:27 -0300 Subject: [PATCH 675/878] Using old addresses to fetch the last event --- network/balances.go | 23 ++++++++++++++++++++--- network/prices.go | 23 ++++++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/network/balances.go b/network/balances.go index 86770dd31..412ae383d 100644 --- a/network/balances.go +++ b/network/balances.go @@ -183,21 +183,38 @@ func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, i return results, nil } -func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, BalancesUpdatedEvent, error) { +func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketNetworkBalancesAddresses []common.Address, opts *bind.CallOpts) (bool, BalancesUpdatedEvent, error) { // Get contracts rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { return false, BalancesUpdatedEvent{}, err } + // Create the list of addresses to check + currentAddress := *rocketNetworkBalances.Address + if rocketNetworkBalancesAddresses == nil { + rocketNetworkBalancesAddresses = []common.Address{currentAddress} + } else { + found := false + for _, address := range rocketNetworkBalancesAddresses { + if address == currentAddress { + found = true + break + } + } + if !found { + rocketNetworkBalancesAddresses = append(rocketNetworkBalancesAddresses, currentAddress) + } + } + // Construct a filter query for relevant logs balancesUpdatedEvent := rocketNetworkBalances.ABI.Events["BalancesUpdated"] - currentAddress := *rocketNetworkBalances.Address indexBytes := [32]byte{} + addressFilter := rocketNetworkBalancesAddresses topicFilter := [][]common.Hash{{balancesUpdatedEvent.ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, []common.Address{currentAddress}, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) if err != nil { return false, BalancesUpdatedEvent{}, err } diff --git a/network/prices.go b/network/prices.go index 1dfaf1c47..41f4c0fa3 100644 --- a/network/prices.go +++ b/network/prices.go @@ -129,21 +129,38 @@ func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, int } // Get the event info for a price update -func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, PriceUpdatedEvent, error) { +func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketNetworkPricesAddresses []common.Address, opts *bind.CallOpts) (bool, PriceUpdatedEvent, error) { // Get contracts rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { return false, PriceUpdatedEvent{}, err } + // Create the list of addresses to check + currentAddress := *rocketNetworkPrices.Address + if rocketNetworkPricesAddresses == nil { + rocketNetworkPricesAddresses = []common.Address{currentAddress} + } else { + found := false + for _, address := range rocketNetworkPricesAddresses { + if address == currentAddress { + found = true + break + } + } + if !found { + rocketNetworkPricesAddresses = append(rocketNetworkPricesAddresses, currentAddress) + } + } + // Construct a filter query for relevant logs pricesUpdatedEvent := rocketNetworkPrices.ABI.Events["PricesUpdated"] - currentAddress := *rocketNetworkPrices.Address indexBytes := [32]byte{} + addressFilter := rocketNetworkPricesAddresses topicFilter := [][]common.Hash{{pricesUpdatedEvent.ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, []common.Address{currentAddress}, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) if err != nil { return false, PriceUpdatedEvent{}, err } From a9eae414f1ec7993ce1653e0e877f0234439e10e Mon Sep 17 00:00:00 2001 From: fornax Date: Fri, 3 Nov 2023 16:02:20 -0300 Subject: [PATCH 676/878] Epochs -> frequency --- network/balances.go | 4 ++-- network/prices.go | 4 ++-- settings/protocol/network.go | 32 ++++++++++++++++---------------- utils/state/network.go | 16 ++++++++-------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/network/balances.go b/network/balances.go index 412ae383d..42f52973a 100644 --- a/network/balances.go +++ b/network/balances.go @@ -242,7 +242,7 @@ func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rock // Returns a mapping of members and whether they have submitted balances this interval or not func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesEpochs(rp, opts) + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) if err != nil { return nil, err } @@ -278,7 +278,7 @@ func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, interv // Calculates the participation rate of every trusted node on balance submission since the last block that member count changed func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesEpochs(rp, opts) + updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) if err != nil { return nil, err } diff --git a/network/prices.go b/network/prices.go index 41f4c0fa3..154783b5f 100644 --- a/network/prices.go +++ b/network/prices.go @@ -188,7 +188,7 @@ func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketN // Returns a mapping of members and whether they have submitted prices this interval or not func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesEpochs(rp, opts) + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) if err != nil { return nil, err } @@ -224,7 +224,7 @@ func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, interval // Calculates the participation rate of every trusted node on price submission since the last block that member count changed func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesEpochs(rp, opts) // + updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) // if err != nil { return nil, err } diff --git a/settings/protocol/network.go b/settings/protocol/network.go index d6b78385e..7bd7d0b8d 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -19,9 +19,9 @@ const ( NetworkSettingsContractName string = "rocketDAOProtocolSettingsNetwork" NodeConsensusThresholdSettingPath string = "network.consensus.threshold" SubmitBalancesEnabledSettingPath string = "network.submit.balances.enabled" - SubmitBalancesEpochsSettingPath string = "network.submit.balances.epochs" + SubmitBalancesFrequencySettingPath string = "network.submit.balances.frequency" SubmitPricesEnabledSettingPath string = "network.submit.prices.enabled" - SubmitPricesEpochsSettingPath string = "network.submit.prices.epochs" + SubmitPricesFrequencySettingPath string = "network.submit.prices.frequency" MinimumNodeFeeSettingPath string = "network.node.fee.minimum" TargetNodeFeeSettingPath string = "network.node.fee.target" MaximumNodeFeeSettingPath string = "network.node.fee.maximum" @@ -70,23 +70,23 @@ func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bo return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitBalancesEnabledSettingPath), NetworkSettingsContractName, SubmitBalancesEnabledSettingPath, value, blockNumber, treeNodes, opts) } -// The frequency in epochs at which network balances should be submitted by trusted nodes -func GetSubmitBalancesEpochs(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The frequency in seconds at which network balances should be submitted by trusted nodes +func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesEpochs"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("error getting network balance submission frequency: %w", err) } return (*value).Uint64(), nil } -func ProposeSubmitBalancesEpochs(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesEpochsSettingPath), NetworkSettingsContractName, SubmitBalancesEpochsSettingPath, value, blockNumber, treeNodes, opts) +func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitBalancesEpochsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesEpochsSettingPath), NetworkSettingsContractName, SubmitBalancesEpochsSettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSubmitBalancesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) } // Network price submissions currently enabled @@ -108,23 +108,23 @@ func EstimateProposeSubmitPricesEnabledGas(rp *rocketpool.RocketPool, value bool return protocol.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", SubmitPricesEnabledSettingPath), NetworkSettingsContractName, SubmitPricesEnabledSettingPath, value, blockNumber, treeNodes, opts) } -// The frequency in epochs at which network prices should be submitted by trusted nodes -func GetSubmitPricesEpochs(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// The frequency in seconds at which network prices should be submitted by trusted nodes +func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := networkSettingsContract.Call(opts, value, "getSubmitPricesEpochs"); err != nil { + if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { return 0, fmt.Errorf("error getting network price submission frequency: %w", err) } return (*value).Uint64(), nil } -func ProposeSubmitPricesEpochs(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesEpochsSettingPath), NetworkSettingsContractName, SubmitPricesEpochsSettingPath, value, blockNumber, treeNodes, opts) +func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSubmitPricesEpochsGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesEpochsSettingPath), NetworkSettingsContractName, SubmitPricesEpochsSettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSubmitPricesFrequencyGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) } // Minimum node commission rate diff --git a/utils/state/network.go b/utils/state/network.go index d9b6c2aa9..13b5311c8 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -39,7 +39,7 @@ type NetworkDetails struct { RPLInflationIntervalRate *big.Int RPLTotalSupply *big.Int PricesBlock uint64 - PricesIntervalEpochs uint64 + PricesIntervalFrequency uint64 ETHUtilizationRate float64 StakingETHBalance *big.Int RETHExchangeRate float64 @@ -50,7 +50,7 @@ type NetworkDetails struct { SmoothingPoolBalance *big.Int NodeFee float64 BalancesBlock *big.Int - BalancesIntervalEpochs uint64 + BalancesIntervalFrequency uint64 SubmitBalancesEnabled bool SubmitPricesEnabled bool MinipoolLaunchTimeout *big.Int @@ -79,12 +79,12 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( var effectiveQueueCapacity *big.Int var totalQueueLength *big.Int var pricesBlock *big.Int - var pricesIntervalEpochs *big.Int + var pricesIntervalFrequency *big.Int var ethUtilizationRate *big.Int var rETHExchangeRate *big.Int var nodeFee *big.Int var balancesBlock *big.Int - var balancesIntervalEpochs *big.Int + var balancesIntervalFrequency *big.Int var minipoolLaunchTimeout *big.Int var promotionScrubPeriodSeconds *big.Int var windowStartRaw *big.Int @@ -110,7 +110,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesIntervalEpochs, "getSubmitPricesEpochs") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesIntervalFrequency, "getSubmitPricesFrequency") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") @@ -119,7 +119,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") contracts.Multicaller.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesIntervalEpochs, "getSubmitBalancesEpochs") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesIntervalFrequency, "getSubmitBalancesFrequency") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") @@ -147,12 +147,12 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() - details.PricesIntervalEpochs = pricesIntervalEpochs.Uint64() + details.PricesIntervalFrequency = pricesIntervalFrequency.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) details.BalancesBlock = balancesBlock - details.BalancesIntervalEpochs = balancesIntervalEpochs.Uint64() + details.BalancesIntervalFrequency = balancesIntervalFrequency.Uint64() details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From 590109d81707422998f15884cc94c6c9128c4c4c Mon Sep 17 00:00:00 2001 From: fornax Date: Mon, 6 Nov 2023 18:33:42 -0300 Subject: [PATCH 677/878] Fix tests --- tests/network/balances_test.go | 3 ++- tests/network/prices_test.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/network/balances_test.go b/tests/network/balances_test.go index 1e7ff97f3..7fbe6d000 100644 --- a/tests/network/balances_test.go +++ b/tests/network/balances_test.go @@ -29,10 +29,11 @@ func TestSubmitBalances(t *testing.T) { // Submit balances var balancesBlock uint64 = 100 + var slotTimestamp uint64 = 16000000 totalEth := eth.EthToWei(100) stakingEth := eth.EthToWei(80) rethSupply := eth.EthToWei(70) - if _, err := network.SubmitBalances(rp, balancesBlock, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { + if _, err := network.SubmitBalances(rp, balancesBlock, slotTimestamp, totalEth, stakingEth, rethSupply, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } diff --git a/tests/network/prices_test.go b/tests/network/prices_test.go index 3dea55441..7b676709c 100644 --- a/tests/network/prices_test.go +++ b/tests/network/prices_test.go @@ -29,9 +29,10 @@ func TestSubmitPrices(t *testing.T) { // Submit prices var pricesBlock uint64 = 100 + var slotTimestamp uint64 = 16000000 rplPrice := eth.EthToWei(1000) effectiveRplStake := eth.EthToWei(24000) - if _, err := network.SubmitPrices(rp, pricesBlock, rplPrice, effectiveRplStake, trustedNodeAccount.GetTransactor()); err != nil { + if _, err := network.SubmitPrices(rp, pricesBlock, slotTimestamp, rplPrice, effectiveRplStake, trustedNodeAccount.GetTransactor()); err != nil { t.Fatal(err) } From a1385e520172e1db7d3b536cca7a77a902e33a4d Mon Sep 17 00:00:00 2001 From: fornax Date: Mon, 6 Nov 2023 21:58:42 -0300 Subject: [PATCH 678/878] Adding v1.2.0 to the version manager --- legacy/v1.2.0/network/balances.go | 135 ++++++++++++++++++++++++++++++ legacy/v1.2.0/network/prices.go | 82 ++++++++++++++++++ rocketpool/v1.2.0-manager.go | 57 +++++++++++++ rocketpool/version-manager.go | 2 + 4 files changed, 276 insertions(+) create mode 100644 legacy/v1.2.0/network/balances.go create mode 100644 legacy/v1.2.0/network/prices.go create mode 100644 rocketpool/v1.2.0-manager.go diff --git a/legacy/v1.2.0/network/balances.go b/legacy/v1.2.0/network/balances.go new file mode 100644 index 000000000..ce4eaf3b6 --- /dev/null +++ b/legacy/v1.2.0/network/balances.go @@ -0,0 +1,135 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Get the block number which network balances are current for +func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return 0, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network balances block: %w", err) + } + return (*balancesBlock).Uint64(), nil +} + +// Get the block number which network balances are current for +func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + balancesBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, balancesBlock, "getBalancesBlock"); err != nil { + return nil, fmt.Errorf("Could not get network balances block: %w", err) + } + return *balancesBlock, nil +} + +// Get the current network total ETH balance +func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + totalEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalEthBalance, "getTotalETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network total ETH balance: %w", err) + } + return *totalEthBalance, nil +} + +// Get the current network staking ETH balance +func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + stakingEthBalance := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, stakingEthBalance, "getStakingETHBalance"); err != nil { + return nil, fmt.Errorf("Could not get network staking ETH balance: %w", err) + } + return *stakingEthBalance, nil +} + +// Get the current network total rETH supply +func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + totalRethSupply := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, totalRethSupply, "getTotalRETHSupply"); err != nil { + return nil, fmt.Errorf("Could not get network total rETH supply: %w", err) + } + return *totalRethSupply, nil +} + +// Get the current network ETH utilization rate +func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return 0, err + } + ethUtilizationRate := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, ethUtilizationRate, "getETHUtilizationRate"); err != nil { + return 0, fmt.Errorf("Could not get network ETH utilization rate: %w", err) + } + return eth.WeiToEth(*ethUtilizationRate), nil +} + +// Estimate the gas of SubmitBalances +func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkBalances.GetTransactionGasInfo(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) +} + +// Submit network balances for an epoch +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), totalEth, stakingEth, rethSupply) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit network balances: %w", err) + } + return tx.Hash(), nil +} + +// Returns the latest block number that oracles should be reporting balances for +func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkBalances.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil +} + +// Get contracts +var rocketNetworkBalancesLock sync.Mutex + +func getRocketNetworkBalances(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNetworkBalancesLock.Lock() + defer rocketNetworkBalancesLock.Unlock() + return rp.GetContract("rocketNetworkBalances", opts) +} diff --git a/legacy/v1.2.0/network/prices.go b/legacy/v1.2.0/network/prices.go new file mode 100644 index 000000000..e718b1dc2 --- /dev/null +++ b/legacy/v1.2.0/network/prices.go @@ -0,0 +1,82 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get the block number which network prices are current for +func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return 0, err + } + pricesBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, pricesBlock, "getPricesBlock"); err != nil { + return 0, fmt.Errorf("Could not get network prices block: %w", err) + } + return (*pricesBlock).Uint64(), nil +} + +// Get the current network RPL price in ETH +func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return nil, err + } + rplPrice := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, rplPrice, "getRPLPrice"); err != nil { + return nil, fmt.Errorf("Could not get network RPL price: %w", err) + } + return *rplPrice, nil +} + +// Estimate the gas of SubmitPrices +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkPrices.GetTransactionGasInfo(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) +} + +// Submit network prices and total effective RPL stake for an epoch +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkPrices.Transact(opts, "submitPrices", big.NewInt(int64(block)), rplPrice) + if err != nil { + return common.Hash{}, fmt.Errorf("Could not submit network prices: %w", err) + } + return tx.Hash(), nil +} + +// Returns the latest block number that oracles should be reporting prices for +func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) + if err != nil { + return nil, err + } + latestReportableBlock := new(*big.Int) + if err := rocketNetworkPrices.Call(opts, latestReportableBlock, "getLatestReportableBlock"); err != nil { + return nil, fmt.Errorf("Could not get latest reportable block: %w", err) + } + return *latestReportableBlock, nil +} + +// Get contracts +var rocketNetworkPricesLock sync.Mutex + +func getRocketNetworkPrices(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNetworkPricesLock.Lock() + defer rocketNetworkPricesLock.Unlock() + return rp.GetContract("rocketNetworkPrices", opts) +} diff --git a/rocketpool/v1.2.0-manager.go b/rocketpool/v1.2.0-manager.go new file mode 100644 index 000000000..e72810787 --- /dev/null +++ b/rocketpool/v1.2.0-manager.go @@ -0,0 +1,57 @@ +package rocketpool + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/hashicorp/go-version" +) + +// A wrapper that holds the updated contract information for this version +type LegacyVersionWrapper_v1_2_0 struct { + rp *RocketPool + rpVersion *version.Version + contractNameMap map[string]string + abiMap map[string]string +} + +// Creates a new wrapper for this version +func newLegacyVersionWrapper_v1_2_0(rp *RocketPool) *LegacyVersionWrapper_v1_2_0 { + rpVersion, _ := version.NewSemver("1.2.0") + return &LegacyVersionWrapper_v1_2_0{ + rp: rp, + rpVersion: rpVersion, + contractNameMap: map[string]string{ + "rocketNetworkPrices": "rocketNetworkPrices.v2", + "rocketNetworkBalances": "rocketNetworkBalances.v2", + }, + abiMap: map[string]string{ + "rocketNetworkPrices": "", + "rocketNetworkBalances": "", + }, + } +} + +// Get the version for this manager +func (m *LegacyVersionWrapper_v1_2_0) GetVersion() *version.Version { + return m.rpVersion +} + +// Get the versioned name of the contract if it was upgraded as part of this deployment +func (m *LegacyVersionWrapper_v1_2_0) GetVersionedContractName(contractName string) (string, bool) { + legacyName, exists := m.contractNameMap[contractName] + return legacyName, exists +} + +// Get the ABI for the provided contract +func (m *LegacyVersionWrapper_v1_2_0) GetEncodedABI(contractName string) string { + return m.abiMap[contractName] +} + +// Get the contract with the provided name for this version of Rocket Pool +func (m *LegacyVersionWrapper_v1_2_0) GetContract(contractName string, opts *bind.CallOpts) (*Contract, error) { + return getLegacyContract(m.rp, contractName, m, opts) +} + +func (m *LegacyVersionWrapper_v1_2_0) GetContractWithAddress(contractName string, address common.Address) (*Contract, error) { + return getLegacyContractWithAddress(m.rp, contractName, address, m) +} diff --git a/rocketpool/version-manager.go b/rocketpool/version-manager.go index e87724543..d4f52e097 100644 --- a/rocketpool/version-manager.go +++ b/rocketpool/version-manager.go @@ -23,6 +23,7 @@ type VersionManager struct { V1_0_0 LegacyVersionWrapper V1_1_0_RC1 LegacyVersionWrapper V1_1_0 LegacyVersionWrapper + V1_2_0 LegacyVersionWrapper rp *RocketPool } @@ -32,6 +33,7 @@ func NewVersionManager(rp *RocketPool) *VersionManager { V1_0_0: newLegacyVersionWrapper_v1_0_0(rp), V1_1_0_RC1: newLegacyVersionWrapper_v1_1_0_rc1(rp), V1_1_0: newLegacyVersionWrapper_v1_1_0(rp), + V1_2_0: newLegacyVersionWrapper_v1_2_0(rp), rp: rp, } } From 6ea266dd2d49669d1ae0948dcec3a78c9e8ebb4f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 8 Nov 2023 12:40:56 -0500 Subject: [PATCH 679/878] Updated pDAO proposal bindings --- dao/protocol/proposals.go | 455 ++++++++++++++++++++++++++++++++++++++ types/dao.go | 31 +++ 2 files changed, 486 insertions(+) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index 384836b67..d530407b6 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -2,20 +2,172 @@ package protocol import ( "context" + "encoding/hex" "fmt" "math/big" + "strings" "sync" "time" "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/types" + strutils "github.com/rocket-pool/rocketpool-go/utils/strings" + "golang.org/x/sync/errgroup" ) +// Settings +const ( + ProposalDAONamesBatchSize = 50 + ProposalDetailsBatchSize = 10 +) + +// Proposal details +type ProposalDetails struct { + ID uint64 `json:"id"` + ProposerAddress common.Address `json:"proposerAddress"` + Message string `json:"message"` + StartBlock uint64 `json:"startBlock"` + Phase1EndBlock uint64 `json:"phase1EndBlock"` + Phase2EndBlock uint64 `json:"phase2EndBlock"` + ExpiryBlock uint64 `json:"expiryBlock"` + CreatedTime time.Time `json:"createdTime"` + VotingPowerRequired *big.Int `json:"votingPowerRequired"` + VotingPowerFor *big.Int `json:"votingPowerFor"` + VotingPowerAgainst *big.Int `json:"votingPowerAgainst"` + VotingPowerAbstained *big.Int `json:"votingPowerAbstained"` + VotingPowerToVeto *big.Int `json:"votingPowerVeto"` + IsDestroyed bool `json:"isDestroyed"` + IsFinalized bool `json:"isFinalized"` + IsExecuted bool `json:"isExecuted"` + IsVetoed bool `json:"isVetoed"` + VetoQuorum *big.Int `json:"vetoQuorum"` + Payload []byte `json:"payload"` + PayloadStr string `json:"payloadStr"` + State types.ProtocolDaoProposalState `json:"state"` +} + +// Get a proposal's details +func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { + var wg errgroup.Group + var prop ProposalDetails + + // Load data + wg.Go(func() error { + var err error + prop.ProposerAddress, err = GetProposalProposer(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Message, err = GetProposalMessage(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.StartBlock, err = GetProposalStartBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Phase1EndBlock, err = GetProposalPhase1EndBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Phase2EndBlock, err = GetProposalPhase2EndBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.ExpiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.CreatedTime, err = GetProposalCreationTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerRequired, err = GetProposalVotingPowerRequired(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerFor, err = GetProposalVotingPowerFor(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerAgainst, err = GetProposalVotingPowerAgainst(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerAbstained, err = GetProposalVotingPowerAbstained(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerToVeto, err = GetProposalVotingPowerVetoed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsDestroyed, err = GetProposalIsDestroyed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsFinalized, err = GetProposalIsFinalized(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsVetoed, err = GetProposalIsVetoed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VetoQuorum, err = GetProposalVetoQuorum(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Payload, err = GetProposalPayload(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.State, err = GetProposalState(rp, proposalId, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProposalDetails{}, err + } + + // Get proposal payload string + payloadStr, err := GetProposalPayloadString(rp, prop.Payload, opts) + if err != nil { + payloadStr = "(unknown)" + } + prop.PayloadStr = payloadStr + return prop, nil +} + // Get the block that was used for voting power calculation in a proposal func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint32, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) @@ -42,6 +194,309 @@ func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *b return *value, nil } +// The total number of Protocol DAO proposals +func GetTotalProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getTotal"); err != nil { + return nil, fmt.Errorf("error getting total proposal count: %w", err) + } + return *value, nil +} + +// Get the address of the proposer +func GetProposalProposer(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketDAOProtocolProposals.Call(opts, value, "getProposer", proposalId); err != nil { + return common.Address{}, fmt.Errorf("error getting proposer for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the proposal's message +func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return "", err + } + value := new(string) + if err := rocketDAOProtocolProposals.Call(opts, value, "getMessage", proposalId); err != nil { + return "", fmt.Errorf("error getting message for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the start block of this proposal +func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, err + } + value := new(uint64) + if err := rocketDAOProtocolProposals.Call(opts, value, "getStart", proposalId); err != nil { + return 0, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the phase 1 end block of this proposal +func GetProposalPhase1EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, err + } + value := new(uint64) + if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase1End", proposalId); err != nil { + return 0, fmt.Errorf("error getting phase 1 end block for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the phase 2 end block of this proposal +func GetProposalPhase2EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, err + } + value := new(uint64) + if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase2End", proposalId); err != nil { + return 0, fmt.Errorf("error getting phase 2 end block for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the block where the proposal expires and can no longer be executed if it is successful +func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, err + } + value := new(uint64) + if err := rocketDAOProtocolProposals.Call(opts, value, "getExpires", proposalId); err != nil { + return 0, fmt.Errorf("error getting expiry block for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the time the proposal was created +func GetProposalCreationTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return time.Time{}, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getCreated", proposalId); err != nil { + return time.Time{}, fmt.Errorf("error getting creation time for proposal %d: %w", proposalId, err) + } + return time.Unix((*value).Int64(), 0), nil +} + +// Get the cumulative amount of voting power voting in favor of this proposal +func GetProposalVotingPowerFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesFor", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'for' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power voting against this proposal +func GetProposalVotingPowerAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesAgainst", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'against' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that vetoed this proposal +func GetProposalVotingPowerVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesVeto", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'veto' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that abstained from this proposal +func GetProposalVotingPowerAbstained(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesAbstained", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'abstained' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that must vote on this proposal for it to be eligible for execution if it succeeds +func GetProposalVotingPowerRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesRequired", proposalId); err != nil { + return nil, fmt.Errorf("error getting required voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been destroyed +func GetProposalIsDestroyed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposals.Call(opts, value, "getDestroyed", proposalId); err != nil { + return false, fmt.Errorf("error getting destroyed status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been finalized +func GetProposalIsFinalized(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposals.Call(opts, value, "getFinalised", proposalId); err != nil { + return false, fmt.Errorf("error getting finalized status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been executed +func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposals.Call(opts, value, "getExecuted", proposalId); err != nil { + return false, fmt.Errorf("error getting executed status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal's veto quorum has been met and it has been vetoed +func GetProposalIsVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposals.Call(opts, value, "getVetoed", proposalId); err != nil { + return false, fmt.Errorf("error getting veto status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the proposal's payload +func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return nil, err + } + value := new([]byte) + if err := rocketDAOProtocolProposals.Call(opts, value, "getPayload", proposalId); err != nil { + return nil, fmt.Errorf("error getting payload of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get a proposal's payload as a human-readable string +func GetProposalPayloadString(rp *rocketpool.RocketPool, payload []byte, opts *bind.CallOpts) (string, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return "", err + } + + // Get proposal DAO contract ABI + daoContractAbi := rocketDAOProtocolProposals.ABI + + // Get proposal payload method + method, err := daoContractAbi.MethodById(payload) + if err != nil { + return "", fmt.Errorf("error getting proposal payload method: %w", err) + } + + // Get proposal payload argument values + args, err := method.Inputs.UnpackValues(payload[4:]) + if err != nil { + return "", fmt.Errorf("error getting proposal payload arguments: %w", err) + } + + // Format argument values as strings + argStrs := []string{} + for ai, arg := range args { + switch method.Inputs[ai].Type.T { + case abi.AddressTy: + argStrs = append(argStrs, arg.(common.Address).Hex()) + case abi.HashTy: + argStrs = append(argStrs, arg.(common.Hash).Hex()) + case abi.FixedBytesTy: + fallthrough + case abi.BytesTy: + argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) + default: + argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + } + } + + // Build & return payload string + return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil +} + +// Get the proposal's state +func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (types.ProtocolDaoProposalState, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return types.ProtocolDaoProposalState_Pending, err + } + value := new(types.ProtocolDaoProposalState) + if err := rocketDAOProtocolProposals.Call(opts, value, "getState", proposalId); err != nil { + return types.ProtocolDaoProposalState_Pending, fmt.Errorf("error getting state of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the option that the address voted on for the proposal, and whether or not it's voted yet +func GetAddressVoteDirection(rp *rocketpool.RocketPool, proposalId uint64, address common.Address, opts *bind.CallOpts) (types.VoteDirection, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return types.VoteDirection_NoVote, err + } + value := new(types.VoteDirection) + if err := rocketDAOProtocolProposals.Call(opts, value, "getReceiptDirection", proposalId, address); err != nil { + return types.VoteDirection_NoVote, fmt.Errorf("error getting voting status of proposal %d by address %s: %w", proposalId, address.Hex(), err) + } + return *value, nil +} + // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) diff --git a/types/dao.go b/types/dao.go index bf374eca4..e3fce1b11 100644 --- a/types/dao.go +++ b/types/dao.go @@ -23,6 +23,37 @@ const ( var ProposalStates = []string{"Pending", "Active", "Cancelled", "Defeated", "Succeeded", "Expired", "Executed"} +// pDAO proposal states +type ProtocolDaoProposalState uint8 + +const ( + ProtocolDaoProposalState_Pending ProtocolDaoProposalState = iota + ProtocolDaoProposalState_ActivePhase1 + ProtocolDaoProposalState_ActivePhase2 + ProtocolDaoProposalState_Destroyed + ProtocolDaoProposalState_Vetoed + ProtocolDaoProposalState_QuorumNotMet + ProtocolDaoProposalState_Defeated + ProtocolDaoProposalState_Succeeded + ProtocolDaoProposalState_Expired + ProtocolDaoProposalState_Executed +) + +var ProtocolDaoProposalStates = []string{"Pending", "Active (Phase 1)", "Active (Phase 2)", "Destroyed", "Vetoed", "Quorum not Met", "Defeated", "Succeeded", "Expired", "Executed"} + +// pDAO voting direction +type VoteDirection uint8 + +const ( + VoteDirection_NoVote VoteDirection = iota + VoteDirection_Abstain + VoteDirection_For + VoteDirection_Against + VoteDirection_AgainstWithVeto +) + +var VoteDirections = []string{"Not Voted", "Abstain", "In Favor", "Against", "Against with Veto"} + // DAO setting types type ProposalSettingType uint8 From a439ca950f679d3303afe83551139c0d5df924f3 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 8 Nov 2023 12:47:18 -0500 Subject: [PATCH 680/878] Minor cleanup --- dao/protocol/proposals.go | 65 +++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index d530407b6..a77f96a16 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -52,6 +52,47 @@ type ProposalDetails struct { State types.ProtocolDaoProposalState `json:"state"` } +// Get all proposal details +func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { + // Get proposal count + proposalCount, err := GetTotalProposalCount(rp, opts) + if err != nil { + return []ProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProposalDetails, proposalCount) + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { + pei = proposalCount + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, pi+1, opts) // Proposals are 1-indexed + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProposalDetails{}, err + } + + } + + // Return + return details, nil +} + // Get a proposal's details func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { var wg errgroup.Group @@ -195,16 +236,16 @@ func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *b } // The total number of Protocol DAO proposals -func GetTotalProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetTotalProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getTotal"); err != nil { - return nil, fmt.Errorf("error getting total proposal count: %w", err) + return 0, fmt.Errorf("error getting total proposal count: %w", err) } - return *value, nil + return (*value).Uint64(), nil } // Get the address of the proposer @@ -239,11 +280,11 @@ func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *b if err != nil { return 0, err } - value := new(uint64) + value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getStart", proposalId); err != nil { return 0, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) } - return *value, nil + return (*value).Uint64(), nil } // Get the phase 1 end block of this proposal @@ -252,11 +293,11 @@ func GetProposalPhase1EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opt if err != nil { return 0, err } - value := new(uint64) + value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase1End", proposalId); err != nil { return 0, fmt.Errorf("error getting phase 1 end block for proposal %d: %w", proposalId, err) } - return *value, nil + return (*value).Uint64(), nil } // Get the phase 2 end block of this proposal @@ -265,11 +306,11 @@ func GetProposalPhase2EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opt if err != nil { return 0, err } - value := new(uint64) + value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase2End", proposalId); err != nil { return 0, fmt.Errorf("error getting phase 2 end block for proposal %d: %w", proposalId, err) } - return *value, nil + return (*value).Uint64(), nil } // Get the block where the proposal expires and can no longer be executed if it is successful @@ -278,11 +319,11 @@ func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts * if err != nil { return 0, err } - value := new(uint64) + value := new(*big.Int) if err := rocketDAOProtocolProposals.Call(opts, value, "getExpires", proposalId); err != nil { return 0, fmt.Errorf("error getting expiry block for proposal %d: %w", proposalId, err) } - return *value, nil + return (*value).Uint64(), nil } // Get the time the proposal was created From f75d92199c39e566a1bfb136619f83df8d0deac1 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 9 Nov 2023 21:10:53 -0300 Subject: [PATCH 681/878] Add encoded abis --- rocketpool/v1.2.0-manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rocketpool/v1.2.0-manager.go b/rocketpool/v1.2.0-manager.go index e72810787..6291dc899 100644 --- a/rocketpool/v1.2.0-manager.go +++ b/rocketpool/v1.2.0-manager.go @@ -25,8 +25,8 @@ func newLegacyVersionWrapper_v1_2_0(rp *RocketPool) *LegacyVersionWrapper_v1_2_0 "rocketNetworkBalances": "rocketNetworkBalances.v2", }, abiMap: map[string]string{ - "rocketNetworkPrices": "", - "rocketNetworkBalances": "", + "rocketNetworkPrices": "eJzlVE1v2zAM/SuDzznIimRLuW23AR1QpNupKApKogNjjm1IdNag6H+fkrhx890NHRBgN1skH997lHj/nJR121FIJverT0JfQ/V92WIySWxTkwdLn6aN/Yl0R42HGX5dJRVgMRklNcxXiY/+bcJn5zyGEMO0wYH+4OVhlAQCwm8dgSmrkpYxWjd1C0swFQ4VsXMg39kIGA9DOauBOr8feRk9JxDLl/OmiwIKqAKOdvU4fEKXTGLFOrIjD7Y8exmFb+ZHWI/eAG177CB18Z/LbEAyVTRkgHqN/w2Ub6tbX1r8GDQq58eQHrYJ617hrjPzkigCb3NxgTXtDYM98VyqtDBGaa0BlRijhkwxlaHBnGVKKJSFVpKhcxpAa25S7kCIXI9jZ/sHM/xPrP/ROniH8ZAZNWYmFyi5y12aCoZ5xiUvOJfO5gYdV7niMtVKyIwxY9w4VXwsUmfTVPYSTj39A/aPZ329UHvGyEF+NNN2hBv9Gy9iftNRz/Hdy6PoaktlUx94pguTiULrXe0DgxnSTWwQaIpt42mF+qVXPdC4LPe4ykPuixJ/HWW93nEQh97vrb3Ja2PSLN6Q0yo27l0hd1agYMae4z69vXm9K1dEPOfCCWD6+p5NWK/qf/JeuEanGYdT01qgD5u6C5NSp+akPnZKUhROOMki6m+WhvGX", + "rocketNetworkBalances": "eJztVk1vm0AQ/SsVZx/4XMC3RoqUSu3Fdk6RFc3uzjooGBAMbtwo/71jm5g4tiGpXIlDfMK7M2/e2zfscPdsJVlRU2WN7zaPhGUG6WxdoDW2VJ5RCYq+TXL1iDSlvIQF/tgEGVBojawMlpvA+/JtwHetS6wq3qYdDjQLL/ORVREQ/qoJZJImtObdLM8KWINMsc3gyhWVtWJAXqySRQZUl+93XkbPFnD6epnXLMBAWuHoUI/GJ9TWmDO2OwfyYM+zkWHKfHmC9egN0L7GAVLN/91AtEgy5QNpoV73/wWKcoL0mh4ug8bH/5hki4vhlUgP07oo0vWF1CZLPIE03wdcQQqZwmpay2VCxND7aFxhRu/axX5CEYQgtIiD0PgGpPRCGQnta153MHK1sYUjtasj8FBjoJ04lLaMIwiA180nuuyrOQbSHLeFhg+0Rij553ih0aB9z9PCEZF0VBio0PFV6MoIJEbaDn1hG1vZkoNs4WEojWO82G9EnLs+j/jfdzrfk9tndU96v7c9AJ1mthawoaom3Dnw6gdn5DU15/ThIWDqTFGSZ0e+BcIYT7jB4fm3HBZIr5WvmhNvy/dLPa3vmPMqwd8n2W5nFHDDNXPnkH3s2LZyPN3B/np2c0tc5g9sECdceGAStAQhwHRI+MmlKppgkZe0sXWARkDMb7/ALiOmzVszu2kaalgKjIMahOd3KJhtr42B8o+Fr23fVX38Jyxgf/cMiL/yFY8H0F+D4HgQVNsPtP80ATxXy8AP7XONs8Ky2uX1dEt0rleiy3ZK4Bv+5AyY8PwvSEB9Dw==", }, } } From 987f627c18e7e0df8f3bcb7f136c58264c3e6d0a Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 9 Nov 2023 21:17:07 -0300 Subject: [PATCH 682/878] Get contracts using legacy address --- legacy/v1.2.0/network/balances.go | 43 +++++++++++++++++-------------- legacy/v1.2.0/network/prices.go | 27 ++++++++++--------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/legacy/v1.2.0/network/balances.go b/legacy/v1.2.0/network/balances.go index ce4eaf3b6..a505fd6cc 100644 --- a/legacy/v1.2.0/network/balances.go +++ b/legacy/v1.2.0/network/balances.go @@ -13,8 +13,8 @@ import ( ) // Get the block number which network balances are current for -func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (uint64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return 0, err } @@ -26,8 +26,8 @@ func GetBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, e } // Get the block number which network balances are current for -func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return nil, err } @@ -39,8 +39,8 @@ func GetBalancesBlockRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.I } // Get the current network total ETH balance -func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return nil, err } @@ -52,8 +52,8 @@ func GetTotalETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } // Get the current network staking ETH balance -func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return nil, err } @@ -65,8 +65,8 @@ func GetStakingETHBalance(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big. } // Get the current network total rETH supply -func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return nil, err } @@ -78,8 +78,8 @@ func GetTotalRETHSupply(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.In } // Get the current network ETH utilization rate -func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (float64, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return 0, err } @@ -91,8 +91,8 @@ func GetETHUtilizationRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } // Estimate the gas of SubmitBalances -func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) +func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts, legacyRocketNetworkBalancesAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -100,8 +100,8 @@ func EstimateSubmitBalancesGas(rp *rocketpool.RocketPool, block uint64, totalEth } // Submit network balances for an epoch -func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, nil) +func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEth, rethSupply *big.Int, opts *bind.TransactOpts, legacyRocketNetworkBalancesAddress *common.Address) (common.Hash, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, nil) if err != nil { return common.Hash{}, err } @@ -113,8 +113,8 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, totalEth, stakingEt } // Returns the latest block number that oracles should be reporting balances for -func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) +func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkBalancesAddress *common.Address) (*big.Int, error) { + rocketNetworkBalances, err := getRocketNetworkBalances(rp, legacyRocketNetworkBalancesAddress, opts) if err != nil { return nil, err } @@ -128,8 +128,11 @@ func GetLatestReportableBalancesBlock(rp *rocketpool.RocketPool, opts *bind.Call // Get contracts var rocketNetworkBalancesLock sync.Mutex -func getRocketNetworkBalances(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { +func getRocketNetworkBalances(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkBalancesLock.Lock() defer rocketNetworkBalancesLock.Unlock() - return rp.GetContract("rocketNetworkBalances", opts) + if address != nil { + return rp.VersionManager.V1_2_0.GetContract("rocketNetworkBalances", opts) + } + return rp.VersionManager.V1_2_0.GetContractWithAddress("rocketNetworkBalances", *address) } diff --git a/legacy/v1.2.0/network/prices.go b/legacy/v1.2.0/network/prices.go index e718b1dc2..92d3f4da0 100644 --- a/legacy/v1.2.0/network/prices.go +++ b/legacy/v1.2.0/network/prices.go @@ -12,8 +12,8 @@ import ( ) // Get the block number which network prices are current for -func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) +func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (uint64, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress, opts) if err != nil { return 0, err } @@ -25,8 +25,8 @@ func GetPricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err } // Get the current network RPL price in ETH -func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) +func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress, opts) if err != nil { return nil, err } @@ -38,8 +38,8 @@ func GetRPLPrice(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, erro } // Estimate the gas of SubmitPrices -func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) +func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts, legacyRocketNetworkPricesAddress *common.Address) (rocketpool.GasInfo, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress, nil) if err != nil { return rocketpool.GasInfo{}, err } @@ -47,8 +47,8 @@ func EstimateSubmitPricesGas(rp *rocketpool.RocketPool, block uint64, rplPrice * } // Submit network prices and total effective RPL stake for an epoch -func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts) (common.Hash, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, nil) +func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, opts *bind.TransactOpts, legacyRocketNetworkPricesAddress *common.Address) (common.Hash, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress, nil) if err != nil { return common.Hash{}, err } @@ -60,8 +60,8 @@ func SubmitPrices(rp *rocketpool.RocketPool, block uint64, rplPrice *big.Int, op } // Returns the latest block number that oracles should be reporting prices for -func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) +func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOpts, legacyRocketNetworkPricesAddress *common.Address) (*big.Int, error) { + rocketNetworkPrices, err := getRocketNetworkPrices(rp, legacyRocketNetworkPricesAddress, opts) if err != nil { return nil, err } @@ -75,8 +75,11 @@ func GetLatestReportablePricesBlock(rp *rocketpool.RocketPool, opts *bind.CallOp // Get contracts var rocketNetworkPricesLock sync.Mutex -func getRocketNetworkPrices(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { +func getRocketNetworkPrices(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkPricesLock.Lock() defer rocketNetworkPricesLock.Unlock() - return rp.GetContract("rocketNetworkPrices", opts) + if address != nil { + return rp.VersionManager.V1_2_0.GetContract("rocketNetworkPrices", opts) + } + return rp.VersionManager.V1_2_0.GetContractWithAddress("rocketNetworkPrices", *address) } From 03d0865f17153d58d9083a7bc85c6cdabac47777 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 9 Nov 2023 22:18:48 -0300 Subject: [PATCH 683/878] Using isHoustonDeployed to load state --- utils/state/network.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/utils/state/network.go b/utils/state/network.go index 13b5311c8..2ce1721e7 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -39,7 +39,7 @@ type NetworkDetails struct { RPLInflationIntervalRate *big.Int RPLTotalSupply *big.Int PricesBlock uint64 - PricesIntervalFrequency uint64 + LatestReportablePricesBlock uint64 ETHUtilizationRate float64 StakingETHBalance *big.Int RETHExchangeRate float64 @@ -50,7 +50,7 @@ type NetworkDetails struct { SmoothingPoolBalance *big.Int NodeFee float64 BalancesBlock *big.Int - BalancesIntervalFrequency uint64 + LatestReportableBalancesBlock uint64 SubmitBalancesEnabled bool SubmitPricesEnabled bool MinipoolLaunchTimeout *big.Int @@ -60,10 +60,14 @@ type NetworkDetails struct { BondReductionWindowStart time.Duration BondReductionWindowLength time.Duration DepositPoolUserBalance *big.Int + + // Houston + PricesSubmissionFrequency uint64 + BalancesSubmissionFrequency uint64 } // Create a snapshot of all of the network's details -func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) (*NetworkDetails, error) { +func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isHoustonDeployed bool) (*NetworkDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } @@ -79,12 +83,14 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( var effectiveQueueCapacity *big.Int var totalQueueLength *big.Int var pricesBlock *big.Int - var pricesIntervalFrequency *big.Int + var latestReportablePricesBlock *big.Int + var pricesSubmissionFrequency *big.Int var ethUtilizationRate *big.Int var rETHExchangeRate *big.Int var nodeFee *big.Int var balancesBlock *big.Int - var balancesIntervalFrequency *big.Int + var latestReportableBalancesBlock *big.Int + var balancesSubmissionFrequency *big.Int var minipoolLaunchTimeout *big.Int var promotionScrubPeriodSeconds *big.Int var windowStartRaw *big.Int @@ -110,7 +116,6 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLInflationIntervalRate, "getInflationIntervalRate") contracts.Multicaller.AddCall(contracts.RocketTokenRPL, &details.RPLTotalSupply, "totalSupply") contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &pricesBlock, "getPricesBlock") - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesIntervalFrequency, "getSubmitPricesFrequency") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, ðUtilizationRate, "getETHUtilizationRate") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &details.StakingETHBalance, "getStakingETHBalance") contracts.Multicaller.AddCall(contracts.RocketTokenRETH, &rETHExchangeRate, "getExchangeRate") @@ -119,7 +124,6 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketNodeStaking, &details.TotalRPLStake, "getTotalRPLStake") contracts.Multicaller.AddCall(contracts.RocketNetworkFees, &nodeFee, "getNodeFee") contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &balancesBlock, "getBalancesBlock") - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesIntervalFrequency, "getSubmitBalancesFrequency") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitBalancesEnabled, "getSubmitBalancesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &details.SubmitPricesEnabled, "getSubmitPricesEnabled") contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsMinipool, &minipoolLaunchTimeout, "getLaunchTimeout") @@ -130,6 +134,16 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( contracts.Multicaller.AddCall(contracts.RocketDAONodeTrustedSettingsMinipool, &windowLengthRaw, "getBondReductionWindowLength") contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") + // Houston + if isHoustonDeployed { + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesSubmissionFrequency, "getSubmitPricesFrequency") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesSubmissionFrequency, "getSubmitBalancesFrequency") + } else { + // getLatestReportableBlock was deprecated on Houston + contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") + contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") + } + _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { return nil, fmt.Errorf("error executing multicall: %w", err) @@ -147,12 +161,14 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() - details.PricesIntervalFrequency = pricesIntervalFrequency.Uint64() + details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() + details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) details.BalancesBlock = balancesBlock - details.BalancesIntervalFrequency = balancesIntervalFrequency.Uint64() + details.LatestReportableBalancesBlock = latestReportableBalancesBlock.Uint64() + details.BalancesSubmissionFrequency = balancesSubmissionFrequency.Uint64() details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From 274e78ca910139c4f120350588ba5defef15e99f Mon Sep 17 00:00:00 2001 From: fornax Date: Fri, 10 Nov 2023 15:51:12 -0300 Subject: [PATCH 684/878] Search for event only from the current address --- network/balances.go | 19 +++---------------- network/prices.go | 19 +++---------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/network/balances.go b/network/balances.go index 42f52973a..6fe290853 100644 --- a/network/balances.go +++ b/network/balances.go @@ -183,7 +183,7 @@ func GetLatestBalancesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, i return results, nil } -func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketNetworkBalancesAddresses []common.Address, opts *bind.CallOpts) (bool, BalancesUpdatedEvent, error) { +func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, BalancesUpdatedEvent, error) { // Get contracts rocketNetworkBalances, err := getRocketNetworkBalances(rp, opts) if err != nil { @@ -192,25 +192,12 @@ func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rock // Create the list of addresses to check currentAddress := *rocketNetworkBalances.Address - if rocketNetworkBalancesAddresses == nil { - rocketNetworkBalancesAddresses = []common.Address{currentAddress} - } else { - found := false - for _, address := range rocketNetworkBalancesAddresses { - if address == currentAddress { - found = true - break - } - } - if !found { - rocketNetworkBalancesAddresses = append(rocketNetworkBalancesAddresses, currentAddress) - } - } + rocketNetworkBalancesAddress := []common.Address{currentAddress} // Construct a filter query for relevant logs balancesUpdatedEvent := rocketNetworkBalances.ABI.Events["BalancesUpdated"] indexBytes := [32]byte{} - addressFilter := rocketNetworkBalancesAddresses + addressFilter := rocketNetworkBalancesAddress topicFilter := [][]common.Hash{{balancesUpdatedEvent.ID}, {indexBytes}} // Get the event logs diff --git a/network/prices.go b/network/prices.go index 154783b5f..64682b5a1 100644 --- a/network/prices.go +++ b/network/prices.go @@ -129,7 +129,7 @@ func GetLatestPricesSubmissions(rp *rocketpool.RocketPool, fromBlock uint64, int } // Get the event info for a price update -func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketNetworkPricesAddresses []common.Address, opts *bind.CallOpts) (bool, PriceUpdatedEvent, error) { +func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *bind.CallOpts) (bool, PriceUpdatedEvent, error) { // Get contracts rocketNetworkPrices, err := getRocketNetworkPrices(rp, opts) if err != nil { @@ -138,25 +138,12 @@ func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, rocketN // Create the list of addresses to check currentAddress := *rocketNetworkPrices.Address - if rocketNetworkPricesAddresses == nil { - rocketNetworkPricesAddresses = []common.Address{currentAddress} - } else { - found := false - for _, address := range rocketNetworkPricesAddresses { - if address == currentAddress { - found = true - break - } - } - if !found { - rocketNetworkPricesAddresses = append(rocketNetworkPricesAddresses, currentAddress) - } - } + rocketNetworkPricesAddress := []common.Address{currentAddress} // Construct a filter query for relevant logs pricesUpdatedEvent := rocketNetworkPrices.ABI.Events["PricesUpdated"] indexBytes := [32]byte{} - addressFilter := rocketNetworkPricesAddresses + addressFilter := rocketNetworkPricesAddress topicFilter := [][]common.Hash{{pricesUpdatedEvent.ID}, {indexBytes}} // Get the event logs From 1f2421709fa4965e8c05e9f440d044f58c5ca872 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 14 Nov 2023 10:23:03 -0500 Subject: [PATCH 685/878] Added rocketDAOProtocolProposal --- dao/protocol/proposal.go | 702 +++++++++++++++++++++++++++++++++++++ dao/protocol/proposals.go | 704 ++++---------------------------------- 2 files changed, 766 insertions(+), 640 deletions(-) create mode 100644 dao/protocol/proposal.go diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go new file mode 100644 index 000000000..4a5b205b2 --- /dev/null +++ b/dao/protocol/proposal.go @@ -0,0 +1,702 @@ +package protocol + +import ( + "context" + "encoding/hex" + "fmt" + "math/big" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" + strutils "github.com/rocket-pool/rocketpool-go/utils/strings" + "golang.org/x/sync/errgroup" +) + +// Settings +const ( + ProposalDAONamesBatchSize = 50 + ProposalDetailsBatchSize = 10 +) + +// ===================== +// === Proposal Info === +// ===================== + +// Proposal details +type ProtocolDaoProposalDetails struct { + ID uint64 `json:"id"` + ProposerAddress common.Address `json:"proposerAddress"` + Message string `json:"message"` + StartBlock uint64 `json:"startBlock"` + Phase1EndBlock uint64 `json:"phase1EndBlock"` + Phase2EndBlock uint64 `json:"phase2EndBlock"` + ExpiryBlock uint64 `json:"expiryBlock"` + CreatedTime time.Time `json:"createdTime"` + VotingPowerRequired *big.Int `json:"votingPowerRequired"` + VotingPowerFor *big.Int `json:"votingPowerFor"` + VotingPowerAgainst *big.Int `json:"votingPowerAgainst"` + VotingPowerAbstained *big.Int `json:"votingPowerAbstained"` + VotingPowerToVeto *big.Int `json:"votingPowerVeto"` + IsDestroyed bool `json:"isDestroyed"` + IsFinalized bool `json:"isFinalized"` + IsExecuted bool `json:"isExecuted"` + IsVetoed bool `json:"isVetoed"` + VetoQuorum *big.Int `json:"vetoQuorum"` + Payload []byte `json:"payload"` + PayloadStr string `json:"payloadStr"` + State types.ProtocolDaoProposalState `json:"state"` +} + +// Get all proposal details +func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProtocolDaoProposalDetails, error) { + // Get proposal count + proposalCount, err := GetTotalProposalCount(rp, opts) + if err != nil { + return []ProtocolDaoProposalDetails{}, err + } + + // Load proposal details in batches + details := make([]ProtocolDaoProposalDetails, proposalCount) + for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { + + // Get batch start & end index + psi := bsi + pei := bsi + ProposalDetailsBatchSize + if pei > proposalCount { + pei = proposalCount + } + + // Load details + var wg errgroup.Group + for pi := psi; pi < pei; pi++ { + pi := pi + wg.Go(func() error { + proposalDetails, err := GetProposalDetails(rp, pi+1, opts) // Proposals are 1-indexed + if err == nil { + details[pi] = proposalDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []ProtocolDaoProposalDetails{}, err + } + + } + + // Return + return details, nil +} + +// Get a proposal's details +func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProtocolDaoProposalDetails, error) { + var wg errgroup.Group + var prop ProtocolDaoProposalDetails + + // Load data + wg.Go(func() error { + var err error + prop.ProposerAddress, err = GetProposalProposer(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Message, err = GetProposalMessage(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.StartBlock, err = GetProposalStartBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Phase1EndBlock, err = GetProposalPhase1EndBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Phase2EndBlock, err = GetProposalPhase2EndBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.ExpiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.CreatedTime, err = GetProposalCreationTime(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerRequired, err = GetProposalVotingPowerRequired(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerFor, err = GetProposalVotingPowerFor(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerAgainst, err = GetProposalVotingPowerAgainst(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerAbstained, err = GetProposalVotingPowerAbstained(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VotingPowerToVeto, err = GetProposalVotingPowerVetoed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsDestroyed, err = GetProposalIsDestroyed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsFinalized, err = GetProposalIsFinalized(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.IsVetoed, err = GetProposalIsVetoed(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.VetoQuorum, err = GetProposalVetoQuorum(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.Payload, err = GetProposalPayload(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.State, err = GetProposalState(rp, proposalId, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return ProtocolDaoProposalDetails{}, err + } + + // Get proposal payload string + payloadStr, err := GetProposalPayloadString(rp, prop.Payload, opts) + if err != nil { + payloadStr = "(unknown)" + } + prop.PayloadStr = payloadStr + return prop, nil +} + +// Get the block that was used for voting power calculation in a proposal +func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint32, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalBlock", proposalId); err != nil { + return 0, fmt.Errorf("error getting proposal block for proposal %d: %w", proposalId, err) + } + return uint32((*value).Uint64()), nil +} + +// Get the veto quorum required to veto a proposal +func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalVetoQuorum", proposalId); err != nil { + return nil, fmt.Errorf("error getting proposal veto quorum for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// The total number of Protocol DAO proposals +func GetTotalProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getTotal"); err != nil { + return 0, fmt.Errorf("error getting total proposal count: %w", err) + } + return (*value).Uint64(), nil +} + +// Get the address of the proposer +func GetProposalProposer(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Address{}, err + } + value := new(common.Address) + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposer", proposalId); err != nil { + return common.Address{}, fmt.Errorf("error getting proposer for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the proposal's message +func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return "", err + } + value := new(string) + if err := rocketDAOProtocolProposal.Call(opts, value, "getMessage", proposalId); err != nil { + return "", fmt.Errorf("error getting message for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the start block of this proposal +func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getStart", proposalId); err != nil { + return 0, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) + } + return (*value).Uint64(), nil +} + +// Get the phase 1 end block of this proposal +func GetProposalPhase1EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase1End", proposalId); err != nil { + return 0, fmt.Errorf("error getting phase 1 end block for proposal %d: %w", proposalId, err) + } + return (*value).Uint64(), nil +} + +// Get the phase 2 end block of this proposal +func GetProposalPhase2EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase2End", proposalId); err != nil { + return 0, fmt.Errorf("error getting phase 2 end block for proposal %d: %w", proposalId, err) + } + return (*value).Uint64(), nil +} + +// Get the block where the proposal expires and can no longer be executed if it is successful +func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getExpires", proposalId); err != nil { + return 0, fmt.Errorf("error getting expiry block for proposal %d: %w", proposalId, err) + } + return (*value).Uint64(), nil +} + +// Get the time the proposal was created +func GetProposalCreationTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return time.Time{}, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getCreated", proposalId); err != nil { + return time.Time{}, fmt.Errorf("error getting creation time for proposal %d: %w", proposalId, err) + } + return time.Unix((*value).Int64(), 0), nil +} + +// Get the cumulative amount of voting power voting in favor of this proposal +func GetProposalVotingPowerFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesFor", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'for' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power voting against this proposal +func GetProposalVotingPowerAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAgainst", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'against' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that vetoed this proposal +func GetProposalVotingPowerVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesVeto", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'veto' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that abstained from this proposal +func GetProposalVotingPowerAbstained(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAbstained", proposalId); err != nil { + return nil, fmt.Errorf("error getting total 'abstained' voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the cumulative amount of voting power that must vote on this proposal for it to be eligible for execution if it succeeds +func GetProposalVotingPowerRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesRequired", proposalId); err != nil { + return nil, fmt.Errorf("error getting required voting power for proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been destroyed +func GetProposalIsDestroyed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposal.Call(opts, value, "getDestroyed", proposalId); err != nil { + return false, fmt.Errorf("error getting destroyed status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been finalized +func GetProposalIsFinalized(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposal.Call(opts, value, "getFinalised", proposalId); err != nil { + return false, fmt.Errorf("error getting finalized status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal has been executed +func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposal.Call(opts, value, "getExecuted", proposalId); err != nil { + return false, fmt.Errorf("error getting executed status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get whether or not the proposal's veto quorum has been met and it has been vetoed +func GetProposalIsVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return false, err + } + value := new(bool) + if err := rocketDAOProtocolProposal.Call(opts, value, "getVetoed", proposalId); err != nil { + return false, fmt.Errorf("error getting veto status of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the proposal's payload +func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return nil, err + } + value := new([]byte) + if err := rocketDAOProtocolProposal.Call(opts, value, "getPayload", proposalId); err != nil { + return nil, fmt.Errorf("error getting payload of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get a proposal's payload as a human-readable string +func GetProposalPayloadString(rp *rocketpool.RocketPool, payload []byte, opts *bind.CallOpts) (string, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return "", err + } + + // Get proposal DAO contract ABI + daoContractAbi := rocketDAOProtocolProposal.ABI + + // Get proposal payload method + method, err := daoContractAbi.MethodById(payload) + if err != nil { + return "", fmt.Errorf("error getting proposal payload method: %w", err) + } + + // Get proposal payload argument values + args, err := method.Inputs.UnpackValues(payload[4:]) + if err != nil { + return "", fmt.Errorf("error getting proposal payload arguments: %w", err) + } + + // Format argument values as strings + argStrs := []string{} + for ai, arg := range args { + switch method.Inputs[ai].Type.T { + case abi.AddressTy: + argStrs = append(argStrs, arg.(common.Address).Hex()) + case abi.HashTy: + argStrs = append(argStrs, arg.(common.Hash).Hex()) + case abi.FixedBytesTy: + fallthrough + case abi.BytesTy: + argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) + default: + argStrs = append(argStrs, fmt.Sprintf("%v", arg)) + } + } + + // Build & return payload string + return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil +} + +// Get the proposal's state +func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (types.ProtocolDaoProposalState, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return types.ProtocolDaoProposalState_Pending, err + } + value := new(types.ProtocolDaoProposalState) + if err := rocketDAOProtocolProposal.Call(opts, value, "getState", proposalId); err != nil { + return types.ProtocolDaoProposalState_Pending, fmt.Errorf("error getting state of proposal %d: %w", proposalId, err) + } + return *value, nil +} + +// Get the option that the address voted on for the proposal, and whether or not it's voted yet +func GetAddressVoteDirection(rp *rocketpool.RocketPool, proposalId uint64, address common.Address, opts *bind.CallOpts) (types.VoteDirection, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return types.VoteDirection_NoVote, err + } + value := new(types.VoteDirection) + if err := rocketDAOProtocolProposal.Call(opts, value, "getReceiptDirection", proposalId, address); err != nil { + return types.VoteDirection_NoVote, fmt.Errorf("error getting voting status of proposal %d by address %s: %w", proposalId, address.Hex(), err) + } + return *value, nil +} + +// ==================== +// === Transactions === +// ==================== + +// Estimate the gas of a proposal submission +func estimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + err = simulateProposalExecution(rp, payload) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error simulating proposal execution: %w", err) + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "propose", message, payload, blockNumber, treeNodes) +} + +// Submit a trusted node DAO proposal +// Returns the ID of the new proposal +func submitProposal(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + proposalCount, err := dao.GetProposalCount(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "propose", message, payload, blockNumber, treeNodes) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error submitting Protocol DAO proposal: %w", err) + } + return proposalCount + 1, tx.Hash(), nil +} + +// Estimate the gas of VoteOnProposal +func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, votingPower *big.Int, nodeIndex uint64, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), voteDirection, votingPower, big.NewInt(int64(nodeIndex)), witness) +} + +// Vote on a submitted proposal +func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, votingPower *big.Int, nodeIndex uint64, witness []types.VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "vote", big.NewInt(int64(proposalId)), voteDirection, votingPower, big.NewInt(int64(nodeIndex)), witness) + if err != nil { + return common.Hash{}, fmt.Errorf("error voting on Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of OverrideVote +func EstimateOverrideVoteGas(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "overrideVote", big.NewInt(int64(proposalId)), voteDirection) +} + +// Override a delegate's vote during pDAO voting phase 2 +func OverrideVote(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "overrideVote", big.NewInt(int64(proposalId)), voteDirection) + if err != nil { + return common.Hash{}, fmt.Errorf("error overriding vote on Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Finalize +func EstimateFinalizeGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "finalise", big.NewInt(int64(proposalId))) +} + +// Finalizes a vetoed proposal by burning the proposer's bond +func Finalize(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "finalise", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error finalizing Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of ExecuteProposal +func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) +} + +// Execute a submitted proposal +func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "execute", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error executing Protocol DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Simulate a proposal's execution to verify it won't revert +func simulateProposalExecution(rp *rocketpool.RocketPool, payload []byte) error { + rocketDAOProposal, err := getRocketDAOProposal(rp, nil) + if err != nil { + return err + } + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return err + } + + _, err = rp.Client.EstimateGas(context.Background(), ethereum.CallMsg{ + From: *rocketDAOProposal.Address, + To: rocketDAOProtocolProposal.Address, + GasPrice: big.NewInt(0), + Value: nil, + Data: payload, + }) + return err +} + +// Get contracts +var rocketDAOProtocolProposalLock sync.Mutex +var rocketDAOProposalLock sync.Mutex + +func getRocketDAOProtocolProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProtocolProposalLock.Lock() + defer rocketDAOProtocolProposalLock.Unlock() + return rp.GetContract("rocketDAOProtocolProposal", opts) +} + +func getRocketDAOProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOProposalLock.Lock() + defer rocketDAOProposalLock.Unlock() + return rp.GetContract("rocketDAOProposal", opts) +} diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index a77f96a16..db614f88c 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -1,574 +1,18 @@ package protocol import ( - "context" - "encoding/hex" "fmt" "math/big" - "strings" "sync" "time" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" - "github.com/rocket-pool/rocketpool-go/dao" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/types" - strutils "github.com/rocket-pool/rocketpool-go/utils/strings" - "golang.org/x/sync/errgroup" ) -// Settings -const ( - ProposalDAONamesBatchSize = 50 - ProposalDetailsBatchSize = 10 -) - -// Proposal details -type ProposalDetails struct { - ID uint64 `json:"id"` - ProposerAddress common.Address `json:"proposerAddress"` - Message string `json:"message"` - StartBlock uint64 `json:"startBlock"` - Phase1EndBlock uint64 `json:"phase1EndBlock"` - Phase2EndBlock uint64 `json:"phase2EndBlock"` - ExpiryBlock uint64 `json:"expiryBlock"` - CreatedTime time.Time `json:"createdTime"` - VotingPowerRequired *big.Int `json:"votingPowerRequired"` - VotingPowerFor *big.Int `json:"votingPowerFor"` - VotingPowerAgainst *big.Int `json:"votingPowerAgainst"` - VotingPowerAbstained *big.Int `json:"votingPowerAbstained"` - VotingPowerToVeto *big.Int `json:"votingPowerVeto"` - IsDestroyed bool `json:"isDestroyed"` - IsFinalized bool `json:"isFinalized"` - IsExecuted bool `json:"isExecuted"` - IsVetoed bool `json:"isVetoed"` - VetoQuorum *big.Int `json:"vetoQuorum"` - Payload []byte `json:"payload"` - PayloadStr string `json:"payloadStr"` - State types.ProtocolDaoProposalState `json:"state"` -} - -// Get all proposal details -func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProposalDetails, error) { - // Get proposal count - proposalCount, err := GetTotalProposalCount(rp, opts) - if err != nil { - return []ProposalDetails{}, err - } - - // Load proposal details in batches - details := make([]ProposalDetails, proposalCount) - for bsi := uint64(0); bsi < proposalCount; bsi += ProposalDetailsBatchSize { - - // Get batch start & end index - psi := bsi - pei := bsi + ProposalDetailsBatchSize - if pei > proposalCount { - pei = proposalCount - } - - // Load details - var wg errgroup.Group - for pi := psi; pi < pei; pi++ { - pi := pi - wg.Go(func() error { - proposalDetails, err := GetProposalDetails(rp, pi+1, opts) // Proposals are 1-indexed - if err == nil { - details[pi] = proposalDetails - } - return err - }) - } - if err := wg.Wait(); err != nil { - return []ProposalDetails{}, err - } - - } - - // Return - return details, nil -} - -// Get a proposal's details -func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProposalDetails, error) { - var wg errgroup.Group - var prop ProposalDetails - - // Load data - wg.Go(func() error { - var err error - prop.ProposerAddress, err = GetProposalProposer(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.Message, err = GetProposalMessage(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.StartBlock, err = GetProposalStartBlock(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.Phase1EndBlock, err = GetProposalPhase1EndBlock(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.Phase2EndBlock, err = GetProposalPhase2EndBlock(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.ExpiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.CreatedTime, err = GetProposalCreationTime(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VotingPowerRequired, err = GetProposalVotingPowerRequired(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VotingPowerFor, err = GetProposalVotingPowerFor(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VotingPowerAgainst, err = GetProposalVotingPowerAgainst(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VotingPowerAbstained, err = GetProposalVotingPowerAbstained(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VotingPowerToVeto, err = GetProposalVotingPowerVetoed(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.IsDestroyed, err = GetProposalIsDestroyed(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.IsFinalized, err = GetProposalIsFinalized(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.IsExecuted, err = GetProposalIsExecuted(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.IsVetoed, err = GetProposalIsVetoed(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.VetoQuorum, err = GetProposalVetoQuorum(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.Payload, err = GetProposalPayload(rp, proposalId, opts) - return err - }) - wg.Go(func() error { - var err error - prop.State, err = GetProposalState(rp, proposalId, opts) - return err - }) - - // Wait for data - if err := wg.Wait(); err != nil { - return ProposalDetails{}, err - } - - // Get proposal payload string - payloadStr, err := GetProposalPayloadString(rp, prop.Payload, opts) - if err != nil { - payloadStr = "(unknown)" - } - prop.PayloadStr = payloadStr - return prop, nil -} - -// Get the block that was used for voting power calculation in a proposal -func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint32, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalBlock", proposalId); err != nil { - return 0, fmt.Errorf("error getting proposal block for proposal %d: %w", proposalId, err) - } - return uint32((*value).Uint64()), nil -} - -// Get the veto quorum required to veto a proposal -func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getProposalVetoQuorum", proposalId); err != nil { - return nil, fmt.Errorf("error getting proposal veto quorum for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// The total number of Protocol DAO proposals -func GetTotalProposalCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getTotal"); err != nil { - return 0, fmt.Errorf("error getting total proposal count: %w", err) - } - return (*value).Uint64(), nil -} - -// Get the address of the proposer -func GetProposalProposer(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (common.Address, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return common.Address{}, err - } - value := new(common.Address) - if err := rocketDAOProtocolProposals.Call(opts, value, "getProposer", proposalId); err != nil { - return common.Address{}, fmt.Errorf("error getting proposer for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the proposal's message -func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (string, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return "", err - } - value := new(string) - if err := rocketDAOProtocolProposals.Call(opts, value, "getMessage", proposalId); err != nil { - return "", fmt.Errorf("error getting message for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the start block of this proposal -func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getStart", proposalId); err != nil { - return 0, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) - } - return (*value).Uint64(), nil -} - -// Get the phase 1 end block of this proposal -func GetProposalPhase1EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase1End", proposalId); err != nil { - return 0, fmt.Errorf("error getting phase 1 end block for proposal %d: %w", proposalId, err) - } - return (*value).Uint64(), nil -} - -// Get the phase 2 end block of this proposal -func GetProposalPhase2EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getPhase2End", proposalId); err != nil { - return 0, fmt.Errorf("error getting phase 2 end block for proposal %d: %w", proposalId, err) - } - return (*value).Uint64(), nil -} - -// Get the block where the proposal expires and can no longer be executed if it is successful -func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getExpires", proposalId); err != nil { - return 0, fmt.Errorf("error getting expiry block for proposal %d: %w", proposalId, err) - } - return (*value).Uint64(), nil -} - -// Get the time the proposal was created -func GetProposalCreationTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return time.Time{}, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getCreated", proposalId); err != nil { - return time.Time{}, fmt.Errorf("error getting creation time for proposal %d: %w", proposalId, err) - } - return time.Unix((*value).Int64(), 0), nil -} - -// Get the cumulative amount of voting power voting in favor of this proposal -func GetProposalVotingPowerFor(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesFor", proposalId); err != nil { - return nil, fmt.Errorf("error getting total 'for' voting power for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the cumulative amount of voting power voting against this proposal -func GetProposalVotingPowerAgainst(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesAgainst", proposalId); err != nil { - return nil, fmt.Errorf("error getting total 'against' voting power for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the cumulative amount of voting power that vetoed this proposal -func GetProposalVotingPowerVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesVeto", proposalId); err != nil { - return nil, fmt.Errorf("error getting total 'veto' voting power for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the cumulative amount of voting power that abstained from this proposal -func GetProposalVotingPowerAbstained(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesAbstained", proposalId); err != nil { - return nil, fmt.Errorf("error getting total 'abstained' voting power for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the cumulative amount of voting power that must vote on this proposal for it to be eligible for execution if it succeeds -func GetProposalVotingPowerRequired(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new(*big.Int) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVotesRequired", proposalId); err != nil { - return nil, fmt.Errorf("error getting required voting power for proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get whether or not the proposal has been destroyed -func GetProposalIsDestroyed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return false, err - } - value := new(bool) - if err := rocketDAOProtocolProposals.Call(opts, value, "getDestroyed", proposalId); err != nil { - return false, fmt.Errorf("error getting destroyed status of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get whether or not the proposal has been finalized -func GetProposalIsFinalized(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return false, err - } - value := new(bool) - if err := rocketDAOProtocolProposals.Call(opts, value, "getFinalised", proposalId); err != nil { - return false, fmt.Errorf("error getting finalized status of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get whether or not the proposal has been executed -func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return false, err - } - value := new(bool) - if err := rocketDAOProtocolProposals.Call(opts, value, "getExecuted", proposalId); err != nil { - return false, fmt.Errorf("error getting executed status of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get whether or not the proposal's veto quorum has been met and it has been vetoed -func GetProposalIsVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (bool, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return false, err - } - value := new(bool) - if err := rocketDAOProtocolProposals.Call(opts, value, "getVetoed", proposalId); err != nil { - return false, fmt.Errorf("error getting veto status of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the proposal's payload -func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) ([]byte, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return nil, err - } - value := new([]byte) - if err := rocketDAOProtocolProposals.Call(opts, value, "getPayload", proposalId); err != nil { - return nil, fmt.Errorf("error getting payload of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get a proposal's payload as a human-readable string -func GetProposalPayloadString(rp *rocketpool.RocketPool, payload []byte, opts *bind.CallOpts) (string, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return "", err - } - - // Get proposal DAO contract ABI - daoContractAbi := rocketDAOProtocolProposals.ABI - - // Get proposal payload method - method, err := daoContractAbi.MethodById(payload) - if err != nil { - return "", fmt.Errorf("error getting proposal payload method: %w", err) - } - - // Get proposal payload argument values - args, err := method.Inputs.UnpackValues(payload[4:]) - if err != nil { - return "", fmt.Errorf("error getting proposal payload arguments: %w", err) - } - - // Format argument values as strings - argStrs := []string{} - for ai, arg := range args { - switch method.Inputs[ai].Type.T { - case abi.AddressTy: - argStrs = append(argStrs, arg.(common.Address).Hex()) - case abi.HashTy: - argStrs = append(argStrs, arg.(common.Hash).Hex()) - case abi.FixedBytesTy: - fallthrough - case abi.BytesTy: - argStrs = append(argStrs, hex.EncodeToString(arg.([]byte))) - default: - argStrs = append(argStrs, fmt.Sprintf("%v", arg)) - } - } - - // Build & return payload string - return strutils.Sanitize(fmt.Sprintf("%s(%s)", method.RawName, strings.Join(argStrs, ","))), nil -} - -// Get the proposal's state -func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (types.ProtocolDaoProposalState, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return types.ProtocolDaoProposalState_Pending, err - } - value := new(types.ProtocolDaoProposalState) - if err := rocketDAOProtocolProposals.Call(opts, value, "getState", proposalId); err != nil { - return types.ProtocolDaoProposalState_Pending, fmt.Errorf("error getting state of proposal %d: %w", proposalId, err) - } - return *value, nil -} - -// Get the option that the address voted on for the proposal, and whether or not it's voted yet -func GetAddressVoteDirection(rp *rocketpool.RocketPool, proposalId uint64, address common.Address, opts *bind.CallOpts) (types.VoteDirection, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return types.VoteDirection_NoVote, err - } - value := new(types.VoteDirection) - if err := rocketDAOProtocolProposals.Call(opts, value, "getReceiptDirection", proposalId, address); err != nil { - return types.VoteDirection_NoVote, fmt.Errorf("error getting voting status of proposal %d by address %s: %w", proposalId, address.Hex(), err) - } - return *value, nil -} - -// Estimate the gas of a proposal submission -func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - err = simulateProposalExecution(rp, payload) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error simulating proposal execution: %w", err) - } - return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "propose", message, payload, blockNumber, treeNodes) -} - -// Submit a trusted node DAO proposal -// Returns the ID of the new proposal -func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - proposalCount, err := dao.GetProposalCount(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - tx, err := rocketDAOProtocolProposals.Transact(opts, "propose", message, payload, blockNumber, treeNodes) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error submitting Protocol DAO proposal: %w", err) - } - return proposalCount + 1, tx.Hash(), nil -} - // Estimate the gas of ProposeSetMulti func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contractNames []string, settingPaths []string, settingTypes []types.ProposalSettingType, values []any, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) @@ -583,7 +27,7 @@ func EstimateProposeSetMultiGas(rp *rocketpool.RocketPool, message string, contr if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update multiple Protocol DAO settings at once @@ -600,7 +44,7 @@ func ProposeSetMulti(rp *rocketpool.RocketPool, message string, contractNames [] if err != nil { return 0, common.Hash{}, fmt.Errorf("error setting multi-set proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetBool @@ -613,7 +57,7 @@ func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update a bool Protocol DAO setting @@ -626,7 +70,7 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat if err != nil { return 0, common.Hash{}, fmt.Errorf("error setting bool setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetUint @@ -639,7 +83,7 @@ func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update a uint Protocol DAO setting @@ -652,7 +96,7 @@ func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPat if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetAddress @@ -665,7 +109,7 @@ func EstimateProposeSetAddressGas(rp *rocketpool.RocketPool, message, contractNa if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update an address Protocol DAO setting @@ -678,7 +122,7 @@ func ProposeSetAddress(rp *rocketpool.RocketPool, message, contractName, setting if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set address setting proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeSetRewardsPercentage @@ -691,7 +135,7 @@ func EstimateProposeSetRewardsPercentageGas(rp *rocketpool.RocketPool, message s if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update the allocations of RPL rewards @@ -704,7 +148,7 @@ func ProposeSetRewardsPercentage(rp *rocketpool.RocketPool, message string, odao if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set rewards-claimers percent proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeOneTimeTreasurySpend @@ -717,7 +161,7 @@ func EstimateProposeOneTimeTreasurySpendGas(rp *rocketpool.RocketPool, message, if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to spend a portion of the Rocket Pool treasury one time @@ -730,51 +174,7 @@ func ProposeOneTimeTreasurySpend(rp *rocketpool.RocketPool, message, invoiceID s if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding set spend-treasury percent proposal payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) -} - -// Estimate the gas of VoteOnProposal -func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) -} - -// Vote on a submitted proposal -func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocolProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) - if err != nil { - return common.Hash{}, fmt.Errorf("error voting on Protocol DAO proposal %d: %w", proposalId, err) - } - return tx.Hash(), nil -} - -// Estimate the gas of ExecuteProposal -func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocolProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) -} - -// Execute a submitted proposal -func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocolProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) - if err != nil { - return common.Hash{}, fmt.Errorf("error executing Protocol DAO proposal %d: %w", proposalId, err) - } - return tx.Hash(), nil + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeRecurringTreasurySpend @@ -787,7 +187,7 @@ func EstimateProposeRecurringTreasurySpendGas(rp *rocketpool.RocketPool, message if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to spend a portion of the Rocket Pool treasury in a recurring manner @@ -800,7 +200,7 @@ func ProposeRecurringTreasurySpend(rp *rocketpool.RocketPool, message string, co if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeRecurringTreasurySpendUpdate @@ -813,7 +213,7 @@ func EstimateProposeRecurringTreasurySpendUpdateGas(rp *rocketpool.RocketPool, m if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to update a recurrint Rocket Pool treasury spending plan @@ -826,7 +226,7 @@ func ProposeRecurringTreasurySpendUpdate(rp *rocketpool.RocketPool, message stri if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeInviteToSecurityCouncil @@ -839,7 +239,7 @@ func EstimateProposeInviteToSecurityCouncilGas(rp *rocketpool.RocketPool, messag if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityInvite payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to invite a member to the security council @@ -852,7 +252,7 @@ func ProposeInviteToSecurityCouncil(rp *rocketpool.RocketPool, message string, i if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityInvite payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Estimate the gas of ProposeKickFromSecurityCouncil @@ -865,7 +265,7 @@ func EstimateProposeKickFromSecurityCouncilGas(rp *rocketpool.RocketPool, messag if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityKick payload: %w", err) } - return EstimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) } // Submit a proposal to kick a member from the security council @@ -878,28 +278,59 @@ func ProposeKickFromSecurityCouncil(rp *rocketpool.RocketPool, message string, a if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityKick payload: %w", err) } - return SubmitProposal(rp, message, payload, blockNumber, treeNodes, opts) + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } -// Simulate a proposal's execution to verify it won't revert -func simulateProposalExecution(rp *rocketpool.RocketPool, payload []byte) error { - rocketDAOProposal, err := getRocketDAOProposal(rp, nil) +// Estimate the gas of ProposeKickMultiFromSecurityCouncil +func EstimateProposeKickMultiFromSecurityCouncilGas(rp *rocketpool.RocketPool, message string, addresses []common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { - return err + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityKickMulti", addresses) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityKickMulti payload: %w", err) } + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to kick multiple members from the security council +func ProposeKickMultiFromSecurityCouncil(rp *rocketpool.RocketPool, message string, addresses []common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { - return err + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityKickMulti", addresses) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityKickMulti payload: %w", err) } + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) +} - _, err = rp.Client.EstimateGas(context.Background(), ethereum.CallMsg{ - From: *rocketDAOProposal.Address, - To: rocketDAOProtocolProposals.Address, - GasPrice: big.NewInt(0), - Value: nil, - Data: payload, - }) - return err +// Estimate the gas of ProposeReplaceSecurityCouncilMember +func EstimateProposeReplaceSecurityCouncilMemberGas(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityReplace", existingMemberAddress, newMemberID, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalSecurityReplace payload: %w", err) + } + return estimateProposalGas(rp, message, payload, blockNumber, treeNodes, opts) +} + +// Submit a proposal to replace a member of the security council with another one in a single TX +func ProposeReplaceSecurityCouncilMember(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalSecurityReplace", existingMemberAddress, newMemberID, newMemberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding proposalSecurityReplace payload: %w", err) + } + return submitProposal(rp, message, payload, blockNumber, treeNodes, opts) } // Get the ABI encoding of multiple values for a ProposeSettingMulti call @@ -954,16 +385,9 @@ func abiEncodeMultiValues(settingTypes []types.ProposalSettingType, values []any // Get contracts var rocketDAOProtocolProposalsLock sync.Mutex -var rocketDAOProposalLock sync.Mutex func getRocketDAOProtocolProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAOProtocolProposalsLock.Lock() defer rocketDAOProtocolProposalsLock.Unlock() return rp.GetContract("rocketDAOProtocolProposals", opts) } - -func getRocketDAOProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketDAOProposalLock.Lock() - defer rocketDAOProposalLock.Unlock() - return rp.GetContract("rocketDAOProposal", opts) -} From fca34dd8edbc355eebd36bea258bfeeeeb766a34 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 15 Nov 2023 12:44:02 -0500 Subject: [PATCH 686/878] Implemented the security DAO bindings --- .../voting/network-voting-power-tree.go | 138 +++++++++ dao/protocol/voting/verify.go | 9 +- dao/protocol/voting/voting-tree-generator.go | 141 ++++----- dao/security/actions.go | 130 +++++++++ dao/security/proposals.go | 270 ++++++++++++++++++ dao/security/security.go | 249 ++++++++++++++++ dao/trustednode/dao.go | 2 +- 7 files changed, 846 insertions(+), 93 deletions(-) create mode 100644 dao/protocol/voting/network-voting-power-tree.go create mode 100644 dao/security/actions.go create mode 100644 dao/security/proposals.go create mode 100644 dao/security/security.go diff --git a/dao/protocol/voting/network-voting-power-tree.go b/dao/protocol/voting/network-voting-power-tree.go new file mode 100644 index 000000000..15c50df0d --- /dev/null +++ b/dao/protocol/voting/network-voting-power-tree.go @@ -0,0 +1,138 @@ +package voting + +import ( + "math" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rocket-pool/rocketpool-go/types" +) + +const ( + depthPerRound uint64 = 5 +) + +type NetworkVotingPowerTree struct { + nodes []*types.VotingTreeNode + depth uint64 + virtualRootIndex uint64 +} + +// Creates a new NetworkVotingPowerTree instance from leaf nodes. +func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint64) *NetworkVotingPowerTree { + // Determine the total number of nodes from the leaf count + originalPower := math.Log2(float64(len(leaves))) + ceilingPower := int(math.Ceil(originalPower)) + totalLeafNodes := int(math.Pow(2.0, float64(ceilingPower))) + + // Create the new tree, which is internally managed as an array since it never changes and that provides the fastest indexing + nodes := make([]*types.VotingTreeNode, totalLeafNodes*2-1) + + // Copy the leaves to the end of the tree + leafStart := totalLeafNodes - 1 + copy(nodes[leafStart:], leaves) + + // Add padding to the end if the size of leaves isn't a power of 2 + if totalLeafNodes != len(leaves) { + zeroHash := getHashForBalance(common.Big0) + for i := leafStart + len(leaves); i < len(nodes); i++ { + nodes[i] = &types.VotingTreeNode{ + Sum: big.NewInt(0), + Hash: zeroHash, + } + } + } + + // Make the tree from the leaves + currentLevel := ceilingPower - 1 + for i := currentLevel; i >= 0; i-- { + // Go through each level (row) of the tree linearly + levelLength := int(math.Pow(2.0, float64(i))) + startIndex := levelLength - 1 + endIndex := startIndex + levelLength + for j := startIndex; j < endIndex; j++ { + // Create the node from its children below + leftChildIndex := j*2 + 1 + rightChildIndex := leftChildIndex + 1 + nodes[j] = getParentNodeFromChildren(nodes[leftChildIndex], nodes[rightChildIndex]) + } + } + + return &NetworkVotingPowerTree{ + nodes: nodes, + depth: uint64(math.Floor(originalPower)), + virtualRootIndex: virtualRootIndex, + } +} + +func (t *NetworkVotingPowerTree) GetPollardForProposal() []*types.VotingTreeNode { + return t.generatePollard(1) +} + +func (t *NetworkVotingPowerTree) GetArtifactsForChallenge(targetIndex uint64) ([]types.VotingTreeNode, []types.VotingTreeNode) { + +} + +func (t *NetworkVotingPowerTree) generatePollard(index uint64) []*types.VotingTreeNode { + rootLevel := uint64(math.Floor(math.Log2(float64(index)))) // The level of the root node + absoluteDepth := rootLevel + depthPerRound // The actual level in the tree that this pollard must come from + if absoluteDepth > t.depth { + absoluteDepth = t.depth // Clamp it to the level of the leaf nodes + } + relativeDepth := absoluteDepth - rootLevel // How far the pollard level is below the root node level + + // Get the indices of the pollard + pollardSize := uint64(math.Pow(2, float64(relativeDepth))) + firstIndex := index * pollardSize + lastIndex := firstIndex + pollardSize + return t.nodes[firstIndex:lastIndex] +} + +func (t *NetworkVotingPowerTree) createProofForIndex(index uint64) []*types.VotingTreeNode { + // Create the proof for the index, starting from the bottom up + proof := []*types.VotingTreeNode{} + for index > 1 { + var partnerIndex uint64 + if index%2 == 0 { + // The target is even so grab the node to the right + partnerIndex = index + 1 + } else { + // The target is odd so grab the node to the left + partnerIndex = index - 1 + } + node := t.nodes[partnerIndex-1] // Indices in the real array are 0-indexed + proof = append(proof, node) + + // Go up a level + index = index / 2 + } + return proof +} + +func (t *NetworkVotingPowerTree) getPhysicalIndexFromVirtualIndex(virtualIndex uint64) uint64 { + +} + +// Get the keccak hash of a parent node with two children +func getParentNodeFromChildren(leftChild *types.VotingTreeNode, rightChild *types.VotingTreeNode) *types.VotingTreeNode { + leftBuffer := [32]byte{} + rightBuffer := [32]byte{} + leftChild.Sum.FillBytes(leftBuffer[:]) + rightChild.Sum.FillBytes(rightBuffer[:]) + hash := crypto.Keccak256Hash(leftChild.Hash[:], leftBuffer[:], rightChild.Hash[:], rightBuffer[:]) + + sum := big.NewInt(0).Add(leftChild.Sum, rightChild.Sum) + return &types.VotingTreeNode{ + Hash: hash, + Sum: sum, + } +} + +// Get the keccak hash of a balance as a uint256 +func getHashForBalance(balance *big.Int) common.Hash { + buffer := [32]byte{} + balance.FillBytes(buffer[:]) + hash := crypto.Keccak256Hash(buffer[:]) + return hash +} diff --git a/dao/protocol/voting/verify.go b/dao/protocol/voting/verify.go index 6f07b3994..312259163 100644 --- a/dao/protocol/voting/verify.go +++ b/dao/protocol/voting/verify.go @@ -19,8 +19,7 @@ type RootSubmitted struct { Proposer common.Address `json:"proposer"` BlockNumber uint32 `json:"blockNumber"` Index *big.Int `json:"index"` - RootHash common.Hash `json:"rootHash"` - Sum *big.Int `json:"sum"` + Root types.VotingTreeNode `json:"root"` TreeNodes []types.VotingTreeNode `json:"treeNodes"` Timestamp time.Time `json:"timestamp"` } @@ -31,8 +30,7 @@ type rootSubmittedRaw struct { Proposer common.Address `json:"proposer"` BlockNumber uint32 `json:"blockNumber"` Index *big.Int `json:"index"` - RootHash common.Hash `json:"rootHash"` - Sum *big.Int `json:"sum"` + Root types.VotingTreeNode `json:"root"` TreeNodes []types.VotingTreeNode `json:"treeNodes"` Timestamp *big.Int `json:"timestamp"` } @@ -156,8 +154,7 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, interv Proposer: raw.Proposer, BlockNumber: raw.BlockNumber, Index: raw.Index, - RootHash: raw.RootHash, - Sum: raw.Sum, + Root: raw.Root, TreeNodes: raw.TreeNodes, Timestamp: time.Unix(raw.Timestamp.Int64(), 0), }) diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/voting-tree-generator.go index bf48c2714..6d1a8ace5 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/voting-tree-generator.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" @@ -20,7 +19,6 @@ import ( const ( nodeVotingDetailsBatchSize uint64 = 250 nodeAddressBatchSize int = 1000 - depthPerRound uint64 = 5 threadLimit int = 6 ) @@ -96,6 +94,61 @@ func (g *VotingTreeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.C return votingInfos, nil } +// Get the leaves of a Network Voting Power tree based on node voting info +func (g *VotingTreeGenerator) CreateLeavesForNetwork(infos []types.NodeVotingInfo) []*types.VotingTreeNode { + // Create a map of the voting power of each node, accounting for delegation + votingPower := map[common.Address]*big.Int{} + for _, info := range infos { + delegateVp, exists := votingPower[info.Delegate] + if !exists { + delegateVp = big.NewInt(0) + votingPower[info.Delegate] = delegateVp + } + delegateVp.Add(delegateVp, info.VotingPower) + } + + // Make the tree leaves + leaves := make([]*types.VotingTreeNode, len(infos)) + zeroHash := getHashForBalance(common.Big0) + for i, info := range infos { + vp, exists := votingPower[info.NodeAddress] + if !exists || vp.Cmp(common.Big0) == 0 { + leaves[i] = &types.VotingTreeNode{ + Sum: big.NewInt(0), + Hash: zeroHash, + } + } else { + leaves[i] = &types.VotingTreeNode{ + Sum: big.NewInt(0).Set(vp), + Hash: getHashForBalance(vp), + } + } + } + return leaves +} + +// Get the leaves of a Node Voting Power tree based on node voting info +func (g *VotingTreeGenerator) CreateLeavesForNode(infos []types.NodeVotingInfo, address common.Address) []*types.VotingTreeNode { + leaves := make([]*types.VotingTreeNode, len(infos)) + zeroHash := getHashForBalance(common.Big0) + for i, info := range infos { + if info.Delegate == address { + leaves[i] = &types.VotingTreeNode{ + Sum: info.VotingPower, + Hash: getHashForBalance(info.VotingPower), + } + } else { + leaves[i] = &types.VotingTreeNode{ + Sum: big.NewInt(0), + Hash: zeroHash, + } + } + } + return leaves +} + +// =============== + // Gets a complete Pollard row for a new proposal based on the target block number. func (g *VotingTreeGenerator) CreatePollardRowForProposal(votingInfo []types.NodeVotingInfo) []types.VotingTreeNode { // Get the 2D voting power subtree for the main tree @@ -122,67 +175,6 @@ func (g *VotingTreeGenerator) CreatePollardForChallenge(targetIndex uint64, voti return proof, nodes } -// Get the 2D array of voting delegation and total power for each node -func (g *VotingTreeGenerator) getDelegatedVotingPower(votingInfo []types.NodeVotingInfo) [][]*big.Int { - nodeCount := uint64(len(votingInfo)) - - // For each node, create an array of nodes that have delegated to it - votingPowers := make([][]*big.Int, nodeCount) - for i := uint64(0); i < nodeCount; i++ { - nodeAddress := votingInfo[i].NodeAddress - - votingPower := make([]*big.Int, nodeCount) - for j := uint64(0); j < nodeCount; j++ { - info := votingInfo[j] - if info.Delegate == nodeAddress { - votingPower[j] = info.VotingPower - } else { - votingPower[j] = big.NewInt(0) - } - } - votingPowers[i] = votingPower - } - - // Return - return votingPowers -} - -// Create the complete set of subtree leaf nodes -func (g *VotingTreeGenerator) constructLeafNodes(votingPowers [][]*big.Int) []types.VotingTreeNode { - nodeCount := uint64(len(votingPowers)) - if nodeCount == 0 { - return []types.VotingTreeNode{} - } - - // Create the slice of leaf nodes for the subtree - subTreeDepth := uint64(math.Ceil(math.Log2(float64(nodeCount)))) // First power of 2 greater than nodeCount - subTreeLeafCountPerMainTreeNode := uint64(math.Pow(2, float64(subTreeDepth))) // Number of leaf nodes in the sub-tree that correspond to a single leaf of the main tree - totalSubTreeLeafNodes := subTreeLeafCountPerMainTreeNode * subTreeLeafCountPerMainTreeNode - - // Create the leaf nodes - leafNodes := make([]types.VotingTreeNode, totalSubTreeLeafNodes) - for i := uint64(0); i < subTreeLeafCountPerMainTreeNode; i++ { - for j := uint64(0); j < subTreeLeafCountPerMainTreeNode; j++ { - index := i*subTreeLeafCountPerMainTreeNode + j - var balance *big.Int - - // Get the balance if i and j are both in-bounds - if i < nodeCount && j < nodeCount { - balance = votingPowers[i][j] - } else { - balance = big.NewInt(0) - } - - leafNode := types.VotingTreeNode{ - Sum: balance, - Hash: getHashForBalance(balance), - } - leafNodes[index] = leafNode - } - } - return leafNodes -} - // Generates a complete Pollard, either for a new proposal or for a challenge. // For new proposals use index = 1. // For challenges, the index is the index of the node being challenged. @@ -304,29 +296,6 @@ func (g *VotingTreeGenerator) getNodeAddressesFast(opts *bind.CallOpts) ([]commo return addresses, nil } -// Get the keccak hash of a parent node with two children -func getParentNodeFromChildren(leftChild types.VotingTreeNode, rightChild types.VotingTreeNode) types.VotingTreeNode { - leftBuffer := [32]byte{} - rightBuffer := [32]byte{} - leftChild.Sum.FillBytes(leftBuffer[:]) - rightChild.Sum.FillBytes(rightBuffer[:]) - hash := crypto.Keccak256Hash(leftChild.Hash[:], leftBuffer[:], rightChild.Hash[:], rightBuffer[:]) - - sum := big.NewInt(0).Add(leftChild.Sum, rightChild.Sum) - return types.VotingTreeNode{ - Hash: hash, - Sum: sum, - } -} - -// Get the keccak hash of a balance as a uint256 -func getHashForBalance(balance *big.Int) common.Hash { - buffer := [32]byte{} - balance.FillBytes(buffer[:]) - hash := crypto.Keccak256Hash(buffer[:]) - return hash -} - // Get contracts var rocketNodeManagerLock sync.Mutex var rocketNetworkVotingLock sync.Mutex diff --git a/dao/security/actions.go b/dao/security/actions.go new file mode 100644 index 000000000..e49f86b74 --- /dev/null +++ b/dao/security/actions.go @@ -0,0 +1,130 @@ +package security + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Estimate the gas of Join +func EstimateJoinGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityActions.GetTransactionGasInfo(opts, "actionJoin") +} + +// Join the security DAO +// Requires an executed invite proposal +func Join(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityActions.Transact(opts, "actionJoin") + if err != nil { + return common.Hash{}, fmt.Errorf("error joining the security DAO: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Kick +func EstimateKickGas(rp *rocketpool.RocketPool, address common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityActions.GetTransactionGasInfo(opts, "actionKick", address) +} + +// Removes a member from the security DAO +func Kick(rp *rocketpool.RocketPool, address common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityActions.Transact(opts, "actionKick", address) + if err != nil { + return common.Hash{}, fmt.Errorf("error kicking %s from the security DAO: %w", address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of KickMulti +func EstimateKickMultiGas(rp *rocketpool.RocketPool, addresses []common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityActions.GetTransactionGasInfo(opts, "actionKickMulti", addresses) +} + +// Removes multiple members from the security DAO +func KickMulti(rp *rocketpool.RocketPool, addresses []common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityActions.Transact(opts, "actionKickMulti", addresses) + if err != nil { + return common.Hash{}, fmt.Errorf("error kicking members from the security DAO: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas of RequestLeave +func EstimateRequestLeaveGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityActions.GetTransactionGasInfo(opts, "actionRequestLeave") +} + +// A member who wishes to leave the security council can call this method to initiate the process +func RequestLeave(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityActions.Transact(opts, "actionRequestLeave") + if err != nil { + return common.Hash{}, fmt.Errorf("error requesting to leave the security DAO: %w", err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Leave +func EstimateLeaveGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityActions.GetTransactionGasInfo(opts, "actionLeave") +} + +// A member who has asked to leave and waited the required time can call this method to formally leave the security council +func Leave(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityActions, err := getRocketDAOSecurityActions(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityActions.Transact(opts, "actionLeave") + if err != nil { + return common.Hash{}, fmt.Errorf("error leaving the security DAO: %w", err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketDAOSecurityActionsLock sync.Mutex + +func getRocketDAOSecurityActions(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOSecurityActionsLock.Lock() + defer rocketDAOSecurityActionsLock.Unlock() + return rp.GetContract("rocketDAOSecurityActions", opts) +} diff --git a/dao/security/proposals.go b/dao/security/proposals.go new file mode 100644 index 000000000..10e5ef138 --- /dev/null +++ b/dao/security/proposals.go @@ -0,0 +1,270 @@ +package security + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Estimate the gas of ProposeSetUint +func EstimateProposeSetUintGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update a uint trusted node DAO setting +func ProposeSetUint(rp *rocketpool.RocketPool, message, contractName, settingPath string, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalSettingUint", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set uint setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeSetBool +func EstimateProposeSetBoolGas(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding set bool setting proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to update a bool trusted node DAO setting +func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPath string, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalSettingBool", contractName, settingPath, value) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding set bool setting proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeInviteMember +func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberId string, newMemberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalInvite", newMemberId, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to invite a new member to the security DAO +func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberId string, newMemberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalInvite", newMemberId, newMemberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeKick +func EstimateProposeKickGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKick", memberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding kick proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to kick a member from the security DAO +func ProposeKick(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKick", memberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding kick proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeKickMulti +func EstimateProposeKickMultiGas(rp *rocketpool.RocketPool, message string, memberAddresses []common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKickMulti", memberAddresses) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding kick multi proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to kick multiple members from the security DAO +func ProposeKickMulti(rp *rocketpool.RocketPool, message string, memberAddresses []common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKickMulti", memberAddresses) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding kick multi proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of ProposeReplace +func EstimateProposeReplaceGas(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalReplace", existingMemberAddress, newMemberID, newMemberAddress) + if err != nil { + return rocketpool.GasInfo{}, fmt.Errorf("error encoding replace proposal payload: %w", err) + } + return EstimateProposalGas(rp, message, payload, opts) +} + +// Submit a proposal to kick a member from the security DAO and replace it with a new member +func ProposeReplace(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalReplace", existingMemberAddress, newMemberID, newMemberAddress) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error encoding replace proposal payload: %w", err) + } + return SubmitProposal(rp, message, payload, opts) +} + +// Estimate the gas of a proposal submission +func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityProposals.GetTransactionGasInfo(opts, "propose", message, payload) +} + +// Submit a security DAO proposal +// Returns the ID of the new proposal +func SubmitProposal(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (uint64, common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + proposalCount, err := dao.GetProposalCount(rp, nil) + if err != nil { + return 0, common.Hash{}, err + } + tx, err := rocketDAOSecurityProposals.Transact(opts, "propose", message, payload) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error submitting security DAO proposal: %w", err) + } + return proposalCount + 1, tx.Hash(), nil +} + +// Estimate the gas of VoteOnProposal +func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityProposals.GetTransactionGasInfo(opts, "vote", big.NewInt(int64(proposalId)), support) +} + +// Vote on a submitted proposal +func VoteOnProposal(rp *rocketpool.RocketPool, proposalId uint64, support bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityProposals.Transact(opts, "vote", big.NewInt(int64(proposalId)), support) + if err != nil { + return common.Hash{}, fmt.Errorf("error voting on security DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of CancelProposal +func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityProposals.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) +} + +// Cancel a submitted proposal +func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityProposals.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error cancelling security DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Estimate the gas of ExecuteProposal +func EstimateExecuteProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOSecurityProposals.GetTransactionGasInfo(opts, "execute", big.NewInt(int64(proposalId))) +} + +// Execute a submitted proposal +func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOSecurityProposals.Transact(opts, "execute", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error executing security DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketDAOSecurityProposalsLock sync.Mutex + +func getRocketDAOSecurityProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOSecurityProposalsLock.Lock() + defer rocketDAOSecurityProposalsLock.Unlock() + return rp.GetContract("rocketDAOSecurityProposals", opts) +} diff --git a/dao/security/security.go b/dao/security/security.go new file mode 100644 index 000000000..056fdf479 --- /dev/null +++ b/dao/security/security.go @@ -0,0 +1,249 @@ +package security + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/utils/strings" + "golang.org/x/sync/errgroup" +) + +// Settings +const ( + MemberAddressBatchSize = 50 + MemberDetailsBatchSize = 20 +) + +// Member details +type SecurityDAOMemberDetails struct { + Address common.Address `json:"address"` + Exists bool `json:"exists"` + ID string `json:"id"` + JoinedTime uint64 `json:"joinedTime"` +} + +// Get all member details +func GetMembers(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]SecurityDAOMemberDetails, error) { + // Get member addresses + memberAddresses, err := GetMemberAddresses(rp, opts) + if err != nil { + return []SecurityDAOMemberDetails{}, err + } + + // Load member details in batches + details := make([]SecurityDAOMemberDetails, len(memberAddresses)) + for bsi := 0; bsi < len(memberAddresses); bsi += MemberDetailsBatchSize { + // Get batch start & end index + msi := bsi + mei := bsi + MemberDetailsBatchSize + if mei > len(memberAddresses) { + mei = len(memberAddresses) + } + + // Load details + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + memberAddress := memberAddresses[mi] + memberDetails, err := GetMemberDetails(rp, memberAddress, opts) + if err == nil { + details[mi] = memberDetails + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []SecurityDAOMemberDetails{}, err + } + } + + // Return + return details, nil +} + +// Get all member addresses +func GetMemberAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common.Address, error) { + // Get member count + memberCount, err := GetMemberCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Load member addresses in batches + addresses := make([]common.Address, memberCount) + for bsi := uint64(0); bsi < memberCount; bsi += MemberAddressBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + MemberAddressBatchSize + if mei > memberCount { + mei = memberCount + } + + // Load addresses + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + address, err := GetMemberAt(rp, mi, opts) + if err == nil { + addresses[mi] = address + } + return err + }) + } + if err := wg.Wait(); err != nil { + return []common.Address{}, err + } + + } + + // Return + return addresses, nil +} + +// Get a member's details +func GetMemberDetails(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (SecurityDAOMemberDetails, error) { + // Data + var wg errgroup.Group + var exists bool + var id string + var joinedTime uint64 + + // Load data + wg.Go(func() error { + var err error + exists, err = GetMemberExists(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + id, err = GetMemberID(rp, memberAddress, opts) + return err + }) + wg.Go(func() error { + var err error + joinedTime, err = GetMemberJoinedTime(rp, memberAddress, opts) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return SecurityDAOMemberDetails{}, err + } + + // Return + return SecurityDAOMemberDetails{ + Address: memberAddress, + Exists: exists, + ID: id, + JoinedTime: joinedTime, + }, nil +} + +// Get the amount of member votes need for a proposal to pass (as a fraction of 1e18) +func GetMemberQuorumVotesRequired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOSecurity.Call(opts, value, "getMemberQuorumVotesRequired"); err != nil { + return nil, fmt.Errorf("error getting security DAO quorum votes required: %w", err) + } + return *value, nil +} + +// Get the member count +func GetMemberCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return 0, err + } + memberCount := new(*big.Int) + if err := rocketDAOSecurity.Call(opts, memberCount, "getMemberCount"); err != nil { + return 0, fmt.Errorf("error getting security DAO member count: %w", err) + } + return (*memberCount).Uint64(), nil +} + +// Get a member address by index +func GetMemberAt(rp *rocketpool.RocketPool, index uint64, opts *bind.CallOpts) (common.Address, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return common.Address{}, err + } + memberAddress := new(common.Address) + if err := rocketDAOSecurity.Call(opts, memberAddress, "getMemberAt", big.NewInt(int64(index))); err != nil { + return common.Address{}, fmt.Errorf("error getting security DAO member %d address: %w", index, err) + } + return *memberAddress, nil +} + +// Member details +func GetMemberExists(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return false, err + } + exists := new(bool) + if err := rocketDAOSecurity.Call(opts, exists, "getMemberIsValid", memberAddress); err != nil { + return false, fmt.Errorf("error getting security DAO member %s exists status: %w", memberAddress.Hex(), err) + } + return *exists, nil +} +func GetMemberID(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (string, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return "", err + } + id := new(string) + if err := rocketDAOSecurity.Call(opts, id, "getMemberID", memberAddress); err != nil { + return "", fmt.Errorf("error getting security DAO member %s ID: %w", memberAddress.Hex(), err) + } + return strings.Sanitize(*id), nil +} +func GetMemberJoinedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return 0, err + } + joinedTime := new(*big.Int) + if err := rocketDAOSecurity.Call(opts, joinedTime, "getMemberJoinedTime", memberAddress); err != nil { + return 0, fmt.Errorf("error getting security DAO member %s joined time: %w", memberAddress.Hex(), err) + } + return (*joinedTime).Uint64(), nil +} + +// Get the time that a proposal for a member was executed at +func GetMemberInviteProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + return GetMemberProposalExecutedTime(rp, "invited", memberAddress, opts) +} +func GetMemberLeaveProposalExecutedTime(rp *rocketpool.RocketPool, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + return GetMemberProposalExecutedTime(rp, "leave", memberAddress, opts) +} +func GetMemberProposalExecutedTime(rp *rocketpool.RocketPool, proposalType string, memberAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketDAOSecurity, err := getRocketDAOSecurity(rp, opts) + if err != nil { + return 0, err + } + proposalExecutedTime := new(*big.Int) + if err := rocketDAOSecurity.Call(opts, proposalExecutedTime, "getMemberProposalExecutedTime", proposalType, memberAddress); err != nil { + return 0, fmt.Errorf("error getting security DAO %s proposal executed time for member %s: %w", proposalType, memberAddress.Hex(), err) + } + return (*proposalExecutedTime).Uint64(), nil +} + +// Get contracts +var rocketDAOSecurityLock sync.Mutex + +func getRocketDAOSecurity(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDAOSecurityLock.Lock() + defer rocketDAOSecurityLock.Unlock() + return rp.GetContract("rocketDAOSecurity", opts) +} diff --git a/dao/trustednode/dao.go b/dao/trustednode/dao.go index 4abb5d521..194d9db63 100644 --- a/dao/trustednode/dao.go +++ b/dao/trustednode/dao.go @@ -19,7 +19,7 @@ const ( MemberDetailsBatchSize = 20 ) -// Proposal details +// Member details type MemberDetails struct { Address common.Address `json:"address"` Exists bool `json:"exists"` From 9fba73e5f7261b93c02439bad8344436fa11617c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 15 Nov 2023 15:41:09 -0500 Subject: [PATCH 687/878] Started redoing voting trees --- ...ee-generator.go => leaf-node-generator.go} | 117 ++---------------- ...rk-voting-power-tree.go => voting-tree.go} | 104 ++++++++++++---- 2 files changed, 90 insertions(+), 131 deletions(-) rename dao/protocol/voting/{voting-tree-generator.go => leaf-node-generator.go} (52%) rename dao/protocol/voting/{network-voting-power-tree.go => voting-tree.go} (51%) diff --git a/dao/protocol/voting/voting-tree-generator.go b/dao/protocol/voting/leaf-node-generator.go similarity index 52% rename from dao/protocol/voting/voting-tree-generator.go rename to dao/protocol/voting/leaf-node-generator.go index 6d1a8ace5..53728bf80 100644 --- a/dao/protocol/voting/voting-tree-generator.go +++ b/dao/protocol/voting/leaf-node-generator.go @@ -2,7 +2,6 @@ package voting import ( "fmt" - "math" "math/big" "sync" @@ -22,15 +21,15 @@ const ( threadLimit int = 6 ) -// Struct for generating proposal voting trees and pollards -type VotingTreeGenerator struct { +// Struct for generating the leaf nodes required to create voting trees +type LeafNodeGenerator struct { rp *rocketpool.RocketPool mcAddress common.Address } -// Creates a new VotingTreeGenerator instance -func NewVotingTreeGenerator(rp *rocketpool.RocketPool, multicallerAddress common.Address) (*VotingTreeGenerator, error) { - g := &VotingTreeGenerator{ +// Creates a new LeafNodeGenerator instance +func NewLeafNodeGenerator(rp *rocketpool.RocketPool, multicallerAddress common.Address) (*LeafNodeGenerator, error) { + g := &LeafNodeGenerator{ rp: rp, mcAddress: multicallerAddress, } @@ -38,7 +37,7 @@ func NewVotingTreeGenerator(rp *rocketpool.RocketPool, multicallerAddress common } // Gets the voting power and delegation info for every node at the specified block -func (g *VotingTreeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { +func (g *LeafNodeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(g.rp, nil) if err != nil { return nil, err @@ -95,7 +94,7 @@ func (g *VotingTreeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.C } // Get the leaves of a Network Voting Power tree based on node voting info -func (g *VotingTreeGenerator) CreateLeavesForNetwork(infos []types.NodeVotingInfo) []*types.VotingTreeNode { +func (g *LeafNodeGenerator) CreateLeavesForNetwork(infos []types.NodeVotingInfo) []*types.VotingTreeNode { // Create a map of the voting power of each node, accounting for delegation votingPower := map[common.Address]*big.Int{} for _, info := range infos { @@ -128,7 +127,7 @@ func (g *VotingTreeGenerator) CreateLeavesForNetwork(infos []types.NodeVotingInf } // Get the leaves of a Node Voting Power tree based on node voting info -func (g *VotingTreeGenerator) CreateLeavesForNode(infos []types.NodeVotingInfo, address common.Address) []*types.VotingTreeNode { +func (g *LeafNodeGenerator) CreateLeavesForNode(infos []types.NodeVotingInfo, address common.Address) []*types.VotingTreeNode { leaves := make([]*types.VotingTreeNode, len(infos)) zeroHash := getHashForBalance(common.Big0) for i, info := range infos { @@ -147,106 +146,8 @@ func (g *VotingTreeGenerator) CreateLeavesForNode(infos []types.NodeVotingInfo, return leaves } -// =============== - -// Gets a complete Pollard row for a new proposal based on the target block number. -func (g *VotingTreeGenerator) CreatePollardRowForProposal(votingInfo []types.NodeVotingInfo) []types.VotingTreeNode { - // Get the 2D voting power subtree for the main tree - votingPowers := g.getDelegatedVotingPower(votingInfo) - - // Get the leaf nodes of the tree - leafNodes := g.constructLeafNodes(votingPowers) - - // Create the Pollard row from the leaf nodes - don't need a proof just for the proposal - _, nodes := g.generatePollard(leafNodes, 1) - return nodes -} - -// Gets a complete proof and corresponding Pollard row to challenge an existing proposal. -func (g *VotingTreeGenerator) CreatePollardForChallenge(targetIndex uint64, votingInfo []types.NodeVotingInfo) ([]types.VotingTreeNode, []types.VotingTreeNode) { - // Get the 2D voting power subtree for the main tree - votingPowers := g.getDelegatedVotingPower(votingInfo) - - // Get the leaf nodes of the tree - leafNodes := g.constructLeafNodes(votingPowers) - - // Create the proof and Pollard row from the leaf nodes - proof, nodes := g.generatePollard(leafNodes, targetIndex) - return proof, nodes -} - -// Generates a complete Pollard, either for a new proposal or for a challenge. -// For new proposals use index = 1. -// For challenges, the index is the index of the node being challenged. -// Returns the aggregated proof, and the list of nodes in the pollard row. -func (g *VotingTreeGenerator) generatePollard(leafNodes []types.VotingTreeNode, index uint64) ([]types.VotingTreeNode, []types.VotingTreeNode) { - order := depthPerRound - offset := uint64(math.Floor(math.Log2(float64(index)))) // Depth of the node being challenged, if not building a proposal - depth := uint64(math.Log2(float64(len(leafNodes)))) // Total depth of the tree - - // If the target is out of bounds, bring the order up enough levels to make the target a leaf node - if order+offset > depth { - order = depth - offset - } - - // Get the pollard parameters - pollardSize := uint64(math.Pow(2, float64(order))) - pollardDepth := offset + order - pollardOffset := index*uint64(math.Pow(2, float64(order))) - uint64(math.Pow(2, float64(order+offset))) - - // Get the list of nodes corresponding to the pollard row - var nodes []types.VotingTreeNode - if depth == pollardDepth { - // The pollard row is the last one so just grab the final row from the leaf nodes - nodes = make([]types.VotingTreeNode, pollardSize) - copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) - //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] - } - // The pollard row is above the last one, so crawl up the tree calculating the values of each node until getting to it - for level := depth; level > offset; level-- { - n := uint64(math.Pow(2, float64(level))) - - for i := uint64(0); i < n/2; i++ { - a := i * 2 // Index of the first node - b := a + 1 // Index of the second node, directly to the right of it - node := getParentNodeFromChildren(leafNodes[a], leafNodes[b]) - leafNodes[i] = node - } - - // Slice out the nodes for the pollard once we've reached the right level - if level-1 == offset+order { - nodes = make([]types.VotingTreeNode, pollardSize) - copy(nodes, leafNodes[pollardOffset:pollardOffset+pollardSize]) - //nodes = leafNodes[pollardOffset : pollardOffset+pollardSize] - } - } - - // Build a proof from the offset up to the root node - proof := []types.VotingTreeNode{} - for level := offset; level > 0; level-- { - indexOffset := uint64(math.Pow(2, float64(level))) - - for i := uint64(0); i < indexOffset/2; i++ { - a := i * 2 // Index of the first node - b := a + 1 // Index of the second node, directly to the right of it - - if indexOffset+a == index { - proof = append(proof, leafNodes[b]) - } else if indexOffset+b == index { - proof = append(proof, leafNodes[a]) - } - - leafNodes[i] = getParentNodeFromChildren(leafNodes[a], leafNodes[b]) - } - - index = index / 2 - } - - return proof, nodes -} - // Get all node addresses using a multicaller -func (g *VotingTreeGenerator) getNodeAddressesFast(opts *bind.CallOpts) ([]common.Address, error) { +func (g *LeafNodeGenerator) getNodeAddressesFast(opts *bind.CallOpts) ([]common.Address, error) { rocketNodeManager, err := getRocketNodeManager(g.rp, opts) if err != nil { return nil, err diff --git a/dao/protocol/voting/network-voting-power-tree.go b/dao/protocol/voting/voting-tree.go similarity index 51% rename from dao/protocol/voting/network-voting-power-tree.go rename to dao/protocol/voting/voting-tree.go index 15c50df0d..71408c420 100644 --- a/dao/protocol/voting/network-voting-power-tree.go +++ b/dao/protocol/voting/voting-tree.go @@ -1,6 +1,7 @@ package voting import ( + "fmt" "math" "math/big" @@ -13,14 +14,14 @@ const ( depthPerRound uint64 = 5 ) -type NetworkVotingPowerTree struct { +type VotingTree struct { nodes []*types.VotingTreeNode depth uint64 virtualRootIndex uint64 } // Creates a new NetworkVotingPowerTree instance from leaf nodes. -func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint64) *NetworkVotingPowerTree { +func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint64) *VotingTree { // Determine the total number of nodes from the leaf count originalPower := math.Log2(float64(len(leaves))) ceilingPower := int(math.Ceil(originalPower)) @@ -59,40 +60,58 @@ func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint6 } } - return &NetworkVotingPowerTree{ + return &VotingTree{ nodes: nodes, depth: uint64(math.Floor(originalPower)), virtualRootIndex: virtualRootIndex, } } -func (t *NetworkVotingPowerTree) GetPollardForProposal() []*types.VotingTreeNode { - return t.generatePollard(1) +// Create a pollard from the tree's root node, to be used for new proposals +func (t *VotingTree) GetPollardForProposal() []*types.VotingTreeNode { + return t.generatePollard(t.virtualRootIndex) } -func (t *NetworkVotingPowerTree) GetArtifactsForChallenge(targetIndex uint64) ([]types.VotingTreeNode, []types.VotingTreeNode) { - +// Create a pollard for a challenged tree node, to be used as a challenge response +func (t *VotingTree) GetPollardForChallengeResponse(challengedIndex uint64) []*types.VotingTreeNode { + return t.generatePollard(challengedIndex) } -func (t *NetworkVotingPowerTree) generatePollard(index uint64) []*types.VotingTreeNode { - rootLevel := uint64(math.Floor(math.Log2(float64(index)))) // The level of the root node - absoluteDepth := rootLevel + depthPerRound // The actual level in the tree that this pollard must come from - if absoluteDepth > t.depth { - absoluteDepth = t.depth // Clamp it to the level of the leaf nodes +// Compare a pollard used in a proposal / root submission with the corresponding pollard in this tree, getting the challenge artifacts for the first mismatch +func (t *VotingTree) CheckForChallengeableArtifacts(virtualRootIndex uint64, proposedPollard []*types.VotingTreeNode) (uint64, *types.VotingTreeNode, []*types.VotingTreeNode, error) { + localPollard := t.generatePollard(virtualRootIndex) + if len(localPollard) != len(proposedPollard) { + return 0, nil, nil, fmt.Errorf("pollard size mismatch: local pollard = %d nodes, proposed pollard size = %d nodes", len(t.nodes), len(proposedPollard)) } - relativeDepth := absoluteDepth - rootLevel // How far the pollard level is below the root node level - // Get the indices of the pollard - pollardSize := uint64(math.Pow(2, float64(relativeDepth))) - firstIndex := index * pollardSize - lastIndex := firstIndex + pollardSize - return t.nodes[firstIndex:lastIndex] + for i, localNode := range localPollard { + proposedNode := proposedPollard[i] + if localNode.Hash != proposedNode.Hash || localNode.Sum.Cmp(proposedNode.Sum) != 0 { + // Get the local index from the pollard offset being used + firstPollardIndex := len(localPollard)/2 + 1 // Add 1 because it's 1-indexed + localIndex := uint64(firstPollardIndex + i) + virtualIndex := t.getVirtualIndexFromLocalIndex(localIndex) + + // Create a new tree from the proposed pollard + proposedSubtree := CreateTreeFromLeaves(proposedPollard, virtualRootIndex) + challengedNode, proof := proposedSubtree.getArtifactsForChallenge(virtualIndex) + return virtualIndex, challengedNode, proof, nil + } + } + + return 0, nil, nil, nil } -func (t *NetworkVotingPowerTree) createProofForIndex(index uint64) []*types.VotingTreeNode { - // Create the proof for the index, starting from the bottom up +// Get the challenged node and a Merkle proof for it +func (t *VotingTree) getArtifactsForChallenge(targetIndex uint64) (*types.VotingTreeNode, []*types.VotingTreeNode) { + // Get the target node + localTargetIndex := t.getLocalIndexFromVirtualIndex(targetIndex) + challengedNode := t.nodes[localTargetIndex-1] // 0-indexed + + // Create a proof for the node using this tree, starting from the bottom up proof := []*types.VotingTreeNode{} - for index > 1 { + index := localTargetIndex + for index > 1 { // Recurse until we get to the root node, stop before that var partnerIndex uint64 if index%2 == 0 { // The target is even so grab the node to the right @@ -107,11 +126,50 @@ func (t *NetworkVotingPowerTree) createProofForIndex(index uint64) []*types.Voti // Go up a level index = index / 2 } - return proof + return challengedNode, proof +} + +// Construct a pollard using the provided node index as the root node +func (t *VotingTree) generatePollard(virtualRootIndex uint64) []*types.VotingTreeNode { + index := t.getLocalIndexFromVirtualIndex(virtualRootIndex) + + rootLevel := uint64(math.Floor(math.Log2(float64(index)))) // The level of the root node + absoluteDepth := rootLevel + depthPerRound // The actual level in the tree that this pollard must come from + if absoluteDepth > t.depth { + absoluteDepth = t.depth // Clamp it to the level of the leaf nodes + } + relativeDepth := absoluteDepth - rootLevel // How far the pollard level is below the root node level + + // Get the indices of the pollard + pollardSize := uint64(math.Pow(2, float64(relativeDepth))) + firstIndex := (index - 1) * pollardSize // Subtract 1 to make it 0-indexed + lastIndex := firstIndex + pollardSize + return t.nodes[firstIndex:lastIndex] +} + +// Get the local index of the tree node (where the root node has index 1) corresponding to a virtual one +func (t *VotingTree) getLocalIndexFromVirtualIndex(virtualIndex uint64) uint64 { + if t.virtualRootIndex == 1 { + return virtualIndex + } + + levelStartIndex := virtualIndex / t.virtualRootIndex + offset := virtualIndex % t.virtualRootIndex + return levelStartIndex + offset } -func (t *NetworkVotingPowerTree) getPhysicalIndexFromVirtualIndex(virtualIndex uint64) uint64 { +// Get the virtual index of the tree (where the root node has index 1) corresponding to a local one +func (t *VotingTree) getVirtualIndexFromLocalIndex(localIndex uint64) uint64 { + if t.virtualRootIndex == 1 { + return localIndex + } + + level := uint64(math.Floor(math.Log2(float64(localIndex)))) + firstLevelIndex := uint64(math.Pow(2, float64(level))) + offset := localIndex - firstLevelIndex + virtualFirstLevelIndex := firstLevelIndex * t.virtualRootIndex + return virtualFirstLevelIndex + offset } // Get the keccak hash of a parent node with two children From 0e8a9a71e3d75d9af2293e01b01ef3afeca3ae38 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 15 Nov 2023 17:25:08 -0500 Subject: [PATCH 688/878] Fixed some voting tree bugs --- dao/protocol/voting/voting-tree.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dao/protocol/voting/voting-tree.go b/dao/protocol/voting/voting-tree.go index 71408c420..726cf8df7 100644 --- a/dao/protocol/voting/voting-tree.go +++ b/dao/protocol/voting/voting-tree.go @@ -62,7 +62,7 @@ func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint6 return &VotingTree{ nodes: nodes, - depth: uint64(math.Floor(originalPower)), + depth: uint64(ceilingPower), virtualRootIndex: virtualRootIndex, } } @@ -88,9 +88,9 @@ func (t *VotingTree) CheckForChallengeableArtifacts(virtualRootIndex uint64, pro proposedNode := proposedPollard[i] if localNode.Hash != proposedNode.Hash || localNode.Sum.Cmp(proposedNode.Sum) != 0 { // Get the local index from the pollard offset being used - firstPollardIndex := len(localPollard)/2 + 1 // Add 1 because it's 1-indexed + firstPollardIndex := len(localPollard) // First index is just the length of the pollard row because it's 1-indexed localIndex := uint64(firstPollardIndex + i) - virtualIndex := t.getVirtualIndexFromLocalIndex(localIndex) + virtualIndex := t.getVirtualIndexFromLocalIndex(localIndex, virtualRootIndex) // Create a new tree from the proposed pollard proposedSubtree := CreateTreeFromLeaves(proposedPollard, virtualRootIndex) @@ -142,7 +142,7 @@ func (t *VotingTree) generatePollard(virtualRootIndex uint64) []*types.VotingTre // Get the indices of the pollard pollardSize := uint64(math.Pow(2, float64(relativeDepth))) - firstIndex := (index - 1) * pollardSize // Subtract 1 to make it 0-indexed + firstIndex := index*pollardSize - 1 // Subtract 1 to make it 0-indexed lastIndex := firstIndex + pollardSize return t.nodes[firstIndex:lastIndex] } @@ -158,9 +158,9 @@ func (t *VotingTree) getLocalIndexFromVirtualIndex(virtualIndex uint64) uint64 { return levelStartIndex + offset } -// Get the virtual index of the tree (where the root node has index 1) corresponding to a local one -func (t *VotingTree) getVirtualIndexFromLocalIndex(localIndex uint64) uint64 { - if t.virtualRootIndex == 1 { +// Get the virtual index of the tree (where the root node has index 1) corresponding to a local one, using the provided virtual index of the root node +func (t *VotingTree) getVirtualIndexFromLocalIndex(localIndex uint64, virtualRootIndex uint64) uint64 { + if virtualRootIndex == 1 { return localIndex } @@ -168,7 +168,7 @@ func (t *VotingTree) getVirtualIndexFromLocalIndex(localIndex uint64) uint64 { firstLevelIndex := uint64(math.Pow(2, float64(level))) offset := localIndex - firstLevelIndex - virtualFirstLevelIndex := firstLevelIndex * t.virtualRootIndex + virtualFirstLevelIndex := firstLevelIndex * virtualRootIndex return virtualFirstLevelIndex + offset } From 9019293a5bcce1b16febb12d0c33ec421324cbb7 Mon Sep 17 00:00:00 2001 From: fornax Date: Thu, 16 Nov 2023 21:37:44 -0300 Subject: [PATCH 689/878] Houston credit and balance functions --- node/deposit.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/node/deposit.go b/node/deposit.go index 153e47dac..ce648d3d3 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -94,6 +94,62 @@ func GetNodeDepositCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, return *creditBalance, nil } +// Get the current ETH balance for the given node operator +func GetNodeEthBalance(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) + if err != nil { + return nil, err + } + + creditBalance := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, creditBalance, "getNodeEthBalance", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node ETH balance: %w", err) + } + return *creditBalance, nil +} + +// Get the sum of the credit balance of a given node operator and their ETH balance +func GetNodeCreditAndBalance(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) + if err != nil { + return nil, err + } + + creditAndBalance := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, creditAndBalance, "getNodeCreditAndBalance", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node credit and ETH balance: %w", err) + } + return *creditAndBalance, nil +} + +// Get the sum of the amount of ETH credit currently usable by a given node operator and their balance +func GetNodeUsableCreditAndBalance(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) + if err != nil { + return nil, err + } + + usableCreditBalance := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, usableCreditBalance, "getNodeUsableCreditAndBalance", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node usable credit and ETH balance: %w", err) + } + return *usableCreditBalance, nil +} + +// Get the amount of ETH credit currently usable by a given node operator +func GetNodeUsableCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) + if err != nil { + return nil, err + } + + usableCredit := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, usableCredit, "getNodeUsableCredit", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node usable credit: %w", err) + } + return *usableCredit, nil +} + // Get contracts var rocketNodeDepositLock sync.Mutex From 0dba8a05e4559e15685da4dd3161fa0cb5332d13 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 19 Nov 2023 14:32:24 -0500 Subject: [PATCH 690/878] Moved the voting tree stuff out of the go lib --- dao/protocol/{voting => }/verify.go | 2 +- dao/protocol/voting/leaf-node-generator.go | 214 --------------------- dao/protocol/voting/voting-tree.go | 196 ------------------- network/voting.go | 67 +++++++ node/node.go | 52 +++++ types/dao.go | 5 + 6 files changed, 125 insertions(+), 411 deletions(-) rename dao/protocol/{voting => }/verify.go (99%) mode change 100644 => 100755 delete mode 100644 dao/protocol/voting/leaf-node-generator.go delete mode 100644 dao/protocol/voting/voting-tree.go diff --git a/dao/protocol/voting/verify.go b/dao/protocol/verify.go old mode 100644 new mode 100755 similarity index 99% rename from dao/protocol/voting/verify.go rename to dao/protocol/verify.go index 312259163..25407cce9 --- a/dao/protocol/voting/verify.go +++ b/dao/protocol/verify.go @@ -1,4 +1,4 @@ -package voting +package protocol import ( "fmt" diff --git a/dao/protocol/voting/leaf-node-generator.go b/dao/protocol/voting/leaf-node-generator.go deleted file mode 100644 index 53728bf80..000000000 --- a/dao/protocol/voting/leaf-node-generator.go +++ /dev/null @@ -1,214 +0,0 @@ -package voting - -import ( - "fmt" - "math/big" - "sync" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/multicall" - "golang.org/x/sync/errgroup" -) - -const ( - nodeVotingDetailsBatchSize uint64 = 250 - nodeAddressBatchSize int = 1000 - threadLimit int = 6 -) - -// Struct for generating the leaf nodes required to create voting trees -type LeafNodeGenerator struct { - rp *rocketpool.RocketPool - mcAddress common.Address -} - -// Creates a new LeafNodeGenerator instance -func NewLeafNodeGenerator(rp *rocketpool.RocketPool, multicallerAddress common.Address) (*LeafNodeGenerator, error) { - g := &LeafNodeGenerator{ - rp: rp, - mcAddress: multicallerAddress, - } - return g, nil -} - -// Gets the voting power and delegation info for every node at the specified block -func (g *LeafNodeGenerator) GetNodeVotingInfo(blockNumber uint32, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { - rocketNetworkVoting, err := getRocketNetworkVoting(g.rp, nil) - if err != nil { - return nil, err - } - - // Get the number of voting nodes - nodeCountBig, err := network.GetVotingNodeCount(g.rp, blockNumber, opts) - if err != nil { - return nil, fmt.Errorf("error getting voting node count: %w", err) - } - nodeCount := nodeCountBig.Uint64() - - // Get the node addresses - nodeAddresses, err := g.getNodeAddressesFast(opts) - if err != nil { - return nil, fmt.Errorf("error getting node addresses: %w", err) - } - - // Sync - var wg errgroup.Group - wg.SetLimit(threadLimit) - - // Run the getters in batches - votingInfos := make([]types.NodeVotingInfo, nodeCount) - for i := uint64(0); i < nodeCount; i += nodeVotingDetailsBatchSize { - i := i - max := i + nodeVotingDetailsBatchSize - if max > nodeCount { - max = nodeCount - } - - // Load details - wg.Go(func() error { - var err error - mc, err := multicall.NewMultiCaller(g.rp.Client, g.mcAddress) - if err != nil { - return err - } - for j := i; j < max; j++ { - nodeAddress := nodeAddresses[j] - votingInfos[j].NodeAddress = nodeAddress - mc.AddCall(rocketNetworkVoting, &votingInfos[j].VotingPower, "getVotingPower", nodeAddress, blockNumber) - mc.AddCall(rocketNetworkVoting, &votingInfos[j].Delegate, "getDelegate", nodeAddress, blockNumber) - } - _, err = mc.FlexibleCall(true, opts) - if err != nil { - return fmt.Errorf("error executing multicall: %w", err) - } - return nil - }) - } - - return votingInfos, nil -} - -// Get the leaves of a Network Voting Power tree based on node voting info -func (g *LeafNodeGenerator) CreateLeavesForNetwork(infos []types.NodeVotingInfo) []*types.VotingTreeNode { - // Create a map of the voting power of each node, accounting for delegation - votingPower := map[common.Address]*big.Int{} - for _, info := range infos { - delegateVp, exists := votingPower[info.Delegate] - if !exists { - delegateVp = big.NewInt(0) - votingPower[info.Delegate] = delegateVp - } - delegateVp.Add(delegateVp, info.VotingPower) - } - - // Make the tree leaves - leaves := make([]*types.VotingTreeNode, len(infos)) - zeroHash := getHashForBalance(common.Big0) - for i, info := range infos { - vp, exists := votingPower[info.NodeAddress] - if !exists || vp.Cmp(common.Big0) == 0 { - leaves[i] = &types.VotingTreeNode{ - Sum: big.NewInt(0), - Hash: zeroHash, - } - } else { - leaves[i] = &types.VotingTreeNode{ - Sum: big.NewInt(0).Set(vp), - Hash: getHashForBalance(vp), - } - } - } - return leaves -} - -// Get the leaves of a Node Voting Power tree based on node voting info -func (g *LeafNodeGenerator) CreateLeavesForNode(infos []types.NodeVotingInfo, address common.Address) []*types.VotingTreeNode { - leaves := make([]*types.VotingTreeNode, len(infos)) - zeroHash := getHashForBalance(common.Big0) - for i, info := range infos { - if info.Delegate == address { - leaves[i] = &types.VotingTreeNode{ - Sum: info.VotingPower, - Hash: getHashForBalance(info.VotingPower), - } - } else { - leaves[i] = &types.VotingTreeNode{ - Sum: big.NewInt(0), - Hash: zeroHash, - } - } - } - return leaves -} - -// Get all node addresses using a multicaller -func (g *LeafNodeGenerator) getNodeAddressesFast(opts *bind.CallOpts) ([]common.Address, error) { - rocketNodeManager, err := getRocketNodeManager(g.rp, opts) - if err != nil { - return nil, err - } - - // Get minipool count - nodeCount, err := node.GetNodeCount(g.rp, opts) - if err != nil { - return []common.Address{}, err - } - - // Sync - var wg errgroup.Group - wg.SetLimit(threadLimit) - addresses := make([]common.Address, nodeCount) - - // Run the getters in batches - count := int(nodeCount) - for i := 0; i < count; i += nodeAddressBatchSize { - i := i - max := i + nodeAddressBatchSize - if max > count { - max = count - } - - wg.Go(func() error { - var err error - mc, err := multicall.NewMultiCaller(g.rp.Client, g.mcAddress) - if err != nil { - return err - } - for j := i; j < max; j++ { - mc.AddCall(rocketNodeManager, &addresses[j], "getNodeAt", big.NewInt(int64(j))) - } - _, err = mc.FlexibleCall(true, opts) - if err != nil { - return fmt.Errorf("error executing multicall: %w", err) - } - return nil - }) - } - - if err := wg.Wait(); err != nil { - return nil, fmt.Errorf("error getting node addresses: %w", err) - } - - return addresses, nil -} - -// Get contracts -var rocketNodeManagerLock sync.Mutex -var rocketNetworkVotingLock sync.Mutex - -func getRocketNodeManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketNodeManagerLock.Lock() - defer rocketNodeManagerLock.Unlock() - return rp.GetContract("rocketNodeManager", opts) -} - -func getRocketNetworkVoting(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketNetworkVotingLock.Lock() - defer rocketNetworkVotingLock.Unlock() - return rp.GetContract("rocketNetworkVoting", opts) -} diff --git a/dao/protocol/voting/voting-tree.go b/dao/protocol/voting/voting-tree.go deleted file mode 100644 index 726cf8df7..000000000 --- a/dao/protocol/voting/voting-tree.go +++ /dev/null @@ -1,196 +0,0 @@ -package voting - -import ( - "fmt" - "math" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/types" -) - -const ( - depthPerRound uint64 = 5 -) - -type VotingTree struct { - nodes []*types.VotingTreeNode - depth uint64 - virtualRootIndex uint64 -} - -// Creates a new NetworkVotingPowerTree instance from leaf nodes. -func CreateTreeFromLeaves(leaves []*types.VotingTreeNode, virtualRootIndex uint64) *VotingTree { - // Determine the total number of nodes from the leaf count - originalPower := math.Log2(float64(len(leaves))) - ceilingPower := int(math.Ceil(originalPower)) - totalLeafNodes := int(math.Pow(2.0, float64(ceilingPower))) - - // Create the new tree, which is internally managed as an array since it never changes and that provides the fastest indexing - nodes := make([]*types.VotingTreeNode, totalLeafNodes*2-1) - - // Copy the leaves to the end of the tree - leafStart := totalLeafNodes - 1 - copy(nodes[leafStart:], leaves) - - // Add padding to the end if the size of leaves isn't a power of 2 - if totalLeafNodes != len(leaves) { - zeroHash := getHashForBalance(common.Big0) - for i := leafStart + len(leaves); i < len(nodes); i++ { - nodes[i] = &types.VotingTreeNode{ - Sum: big.NewInt(0), - Hash: zeroHash, - } - } - } - - // Make the tree from the leaves - currentLevel := ceilingPower - 1 - for i := currentLevel; i >= 0; i-- { - // Go through each level (row) of the tree linearly - levelLength := int(math.Pow(2.0, float64(i))) - startIndex := levelLength - 1 - endIndex := startIndex + levelLength - for j := startIndex; j < endIndex; j++ { - // Create the node from its children below - leftChildIndex := j*2 + 1 - rightChildIndex := leftChildIndex + 1 - nodes[j] = getParentNodeFromChildren(nodes[leftChildIndex], nodes[rightChildIndex]) - } - } - - return &VotingTree{ - nodes: nodes, - depth: uint64(ceilingPower), - virtualRootIndex: virtualRootIndex, - } -} - -// Create a pollard from the tree's root node, to be used for new proposals -func (t *VotingTree) GetPollardForProposal() []*types.VotingTreeNode { - return t.generatePollard(t.virtualRootIndex) -} - -// Create a pollard for a challenged tree node, to be used as a challenge response -func (t *VotingTree) GetPollardForChallengeResponse(challengedIndex uint64) []*types.VotingTreeNode { - return t.generatePollard(challengedIndex) -} - -// Compare a pollard used in a proposal / root submission with the corresponding pollard in this tree, getting the challenge artifacts for the first mismatch -func (t *VotingTree) CheckForChallengeableArtifacts(virtualRootIndex uint64, proposedPollard []*types.VotingTreeNode) (uint64, *types.VotingTreeNode, []*types.VotingTreeNode, error) { - localPollard := t.generatePollard(virtualRootIndex) - if len(localPollard) != len(proposedPollard) { - return 0, nil, nil, fmt.Errorf("pollard size mismatch: local pollard = %d nodes, proposed pollard size = %d nodes", len(t.nodes), len(proposedPollard)) - } - - for i, localNode := range localPollard { - proposedNode := proposedPollard[i] - if localNode.Hash != proposedNode.Hash || localNode.Sum.Cmp(proposedNode.Sum) != 0 { - // Get the local index from the pollard offset being used - firstPollardIndex := len(localPollard) // First index is just the length of the pollard row because it's 1-indexed - localIndex := uint64(firstPollardIndex + i) - virtualIndex := t.getVirtualIndexFromLocalIndex(localIndex, virtualRootIndex) - - // Create a new tree from the proposed pollard - proposedSubtree := CreateTreeFromLeaves(proposedPollard, virtualRootIndex) - challengedNode, proof := proposedSubtree.getArtifactsForChallenge(virtualIndex) - return virtualIndex, challengedNode, proof, nil - } - } - - return 0, nil, nil, nil -} - -// Get the challenged node and a Merkle proof for it -func (t *VotingTree) getArtifactsForChallenge(targetIndex uint64) (*types.VotingTreeNode, []*types.VotingTreeNode) { - // Get the target node - localTargetIndex := t.getLocalIndexFromVirtualIndex(targetIndex) - challengedNode := t.nodes[localTargetIndex-1] // 0-indexed - - // Create a proof for the node using this tree, starting from the bottom up - proof := []*types.VotingTreeNode{} - index := localTargetIndex - for index > 1 { // Recurse until we get to the root node, stop before that - var partnerIndex uint64 - if index%2 == 0 { - // The target is even so grab the node to the right - partnerIndex = index + 1 - } else { - // The target is odd so grab the node to the left - partnerIndex = index - 1 - } - node := t.nodes[partnerIndex-1] // Indices in the real array are 0-indexed - proof = append(proof, node) - - // Go up a level - index = index / 2 - } - return challengedNode, proof -} - -// Construct a pollard using the provided node index as the root node -func (t *VotingTree) generatePollard(virtualRootIndex uint64) []*types.VotingTreeNode { - index := t.getLocalIndexFromVirtualIndex(virtualRootIndex) - - rootLevel := uint64(math.Floor(math.Log2(float64(index)))) // The level of the root node - absoluteDepth := rootLevel + depthPerRound // The actual level in the tree that this pollard must come from - if absoluteDepth > t.depth { - absoluteDepth = t.depth // Clamp it to the level of the leaf nodes - } - relativeDepth := absoluteDepth - rootLevel // How far the pollard level is below the root node level - - // Get the indices of the pollard - pollardSize := uint64(math.Pow(2, float64(relativeDepth))) - firstIndex := index*pollardSize - 1 // Subtract 1 to make it 0-indexed - lastIndex := firstIndex + pollardSize - return t.nodes[firstIndex:lastIndex] -} - -// Get the local index of the tree node (where the root node has index 1) corresponding to a virtual one -func (t *VotingTree) getLocalIndexFromVirtualIndex(virtualIndex uint64) uint64 { - if t.virtualRootIndex == 1 { - return virtualIndex - } - - levelStartIndex := virtualIndex / t.virtualRootIndex - offset := virtualIndex % t.virtualRootIndex - return levelStartIndex + offset -} - -// Get the virtual index of the tree (where the root node has index 1) corresponding to a local one, using the provided virtual index of the root node -func (t *VotingTree) getVirtualIndexFromLocalIndex(localIndex uint64, virtualRootIndex uint64) uint64 { - if virtualRootIndex == 1 { - return localIndex - } - - level := uint64(math.Floor(math.Log2(float64(localIndex)))) - firstLevelIndex := uint64(math.Pow(2, float64(level))) - offset := localIndex - firstLevelIndex - - virtualFirstLevelIndex := firstLevelIndex * virtualRootIndex - return virtualFirstLevelIndex + offset -} - -// Get the keccak hash of a parent node with two children -func getParentNodeFromChildren(leftChild *types.VotingTreeNode, rightChild *types.VotingTreeNode) *types.VotingTreeNode { - leftBuffer := [32]byte{} - rightBuffer := [32]byte{} - leftChild.Sum.FillBytes(leftBuffer[:]) - rightChild.Sum.FillBytes(rightBuffer[:]) - hash := crypto.Keccak256Hash(leftChild.Hash[:], leftBuffer[:], rightChild.Hash[:], rightBuffer[:]) - - sum := big.NewInt(0).Add(leftChild.Sum, rightChild.Sum) - return &types.VotingTreeNode{ - Hash: hash, - Sum: sum, - } -} - -// Get the keccak hash of a balance as a uint256 -func getHashForBalance(balance *big.Int) common.Hash { - buffer := [32]byte{} - balance.FillBytes(buffer[:]) - hash := crypto.Keccak256Hash(buffer[:]) - return hash -} diff --git a/network/voting.go b/network/voting.go index 033db6916..7fd13973e 100644 --- a/network/voting.go +++ b/network/voting.go @@ -7,9 +7,76 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" ) +const ( + nodeVotingDetailsBatchSize uint64 = 250 +) + +// Gets the voting power and delegation info for every node at the specified block using multicall +func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, multicallAddress common.Address, opts *bind.CallOpts) (*types.NodeInfoSnapshot, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, opts) + if err != nil { + return nil, err + } + + // Get the number of voting nodes + nodeCountBig, err := GetVotingNodeCount(rp, blockNumber, opts) + if err != nil { + return nil, fmt.Errorf("error getting voting node count: %w", err) + } + nodeCount := nodeCountBig.Uint64() + + // Get the node addresses + nodeAddresses, err := node.GetNodeAddressesFast(rp, multicallAddress, opts) + if err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + + // Sync + var wg errgroup.Group + + // Run the getters in batches + votingInfos := make([]types.NodeVotingInfo, nodeCount) + for i := uint64(0); i < nodeCount; i += nodeVotingDetailsBatchSize { + i := i + max := i + nodeVotingDetailsBatchSize + if max > nodeCount { + max = nodeCount + } + + // Load details + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + nodeAddress := nodeAddresses[j] + votingInfos[j].NodeAddress = nodeAddress + mc.AddCall(rocketNetworkVoting, &votingInfos[j].VotingPower, "getVotingPower", nodeAddress, blockNumber) + mc.AddCall(rocketNetworkVoting, &votingInfos[j].Delegate, "getDelegate", nodeAddress, blockNumber) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + return &types.NodeInfoSnapshot{ + BlockNumber: blockNumber, + Info: votingInfos, + }, nil +} + // Check whether or not on-chain voting has been initialized for the given node func GetVotingInitialized(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (bool, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) diff --git a/node/node.go b/node/node.go index 2445b6063..494f30a2a 100644 --- a/node/node.go +++ b/node/node.go @@ -14,11 +14,13 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/storage" "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/multicall" "github.com/rocket-pool/rocketpool-go/utils/strings" ) // Settings const ( + nodeAddressFastBatchSize int = 1000 NodeAddressBatchSize = 50 NodeDetailsBatchSize = 20 SmoothingPoolCountBatchSize uint64 = 2000 @@ -151,6 +153,56 @@ func GetNodeAddresses(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]common. } +// Get all node addresses using a multicaller +func GetNodeAddressesFast(rp *rocketpool.RocketPool, multicallAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { + rocketNodeManager, err := getRocketNodeManager(rp, opts) + if err != nil { + return nil, err + } + + // Get minipool count + nodeCount, err := GetNodeCount(rp, opts) + if err != nil { + return []common.Address{}, err + } + + // Sync + var wg errgroup.Group + addresses := make([]common.Address, nodeCount) + + // Run the getters in batches + count := int(nodeCount) + for i := 0; i < count; i += nodeAddressFastBatchSize { + i := i + max := i + nodeAddressFastBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + mc.AddCall(rocketNodeManager, &addresses[j], "getNodeAt", big.NewInt(int64(j))) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting node addresses: %w", err) + } + + return addresses, nil +} + // Get a node's details // The 'includeRplWithdrawalAddress' flag is used for backwards compatibility with Atlas, - set it to `false` if Houston hasn't been deployed yet func GetNodeDetails(rp *rocketpool.RocketPool, nodeAddress common.Address, includeRplWithdrawalAddress bool, opts *bind.CallOpts) (NodeDetails, error) { diff --git a/types/dao.go b/types/dao.go index e3fce1b11..8bb4ef73a 100644 --- a/types/dao.go +++ b/types/dao.go @@ -80,6 +80,11 @@ type NodeVotingInfo struct { Delegate common.Address `json:"delegate"` } +type NodeInfoSnapshot struct { + BlockNumber uint32 `json:"blockNumber"` + Info []NodeVotingInfo `json:"info"` +} + // A node of the voting Merkle Tree (not a Rocket Pool node) type VotingTreeNode struct { Sum *big.Int `abi:"sum" json:"sum"` From 9f3f61c552fcfd12d93c5898eef9e974b3e2113b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 19 Nov 2023 19:33:49 -0500 Subject: [PATCH 691/878] Removed NodeInfoSnapshot --- network/voting.go | 7 ++----- types/dao.go | 5 ----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/network/voting.go b/network/voting.go index 7fd13973e..4fffcd6f1 100644 --- a/network/voting.go +++ b/network/voting.go @@ -19,7 +19,7 @@ const ( ) // Gets the voting power and delegation info for every node at the specified block using multicall -func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, multicallAddress common.Address, opts *bind.CallOpts) (*types.NodeInfoSnapshot, error) { +func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, multicallAddress common.Address, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, opts) if err != nil { return nil, err @@ -71,10 +71,7 @@ func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, mult }) } - return &types.NodeInfoSnapshot{ - BlockNumber: blockNumber, - Info: votingInfos, - }, nil + return votingInfos, nil } // Check whether or not on-chain voting has been initialized for the given node diff --git a/types/dao.go b/types/dao.go index 8bb4ef73a..e3fce1b11 100644 --- a/types/dao.go +++ b/types/dao.go @@ -80,11 +80,6 @@ type NodeVotingInfo struct { Delegate common.Address `json:"delegate"` } -type NodeInfoSnapshot struct { - BlockNumber uint32 `json:"blockNumber"` - Info []NodeVotingInfo `json:"info"` -} - // A node of the voting Merkle Tree (not a Rocket Pool node) type VotingTreeNode struct { Sum *big.Int `abi:"sum" json:"sum"` From e0f2cf7d35afdb21b3cc1ec0ecd58c810ffc8e7f Mon Sep 17 00:00:00 2001 From: fornax Date: Mon, 20 Nov 2023 17:51:21 -0300 Subject: [PATCH 692/878] Add withdrawEth functions --- node/deposit.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/node/deposit.go b/node/deposit.go index ce648d3d3..af732f684 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -36,6 +36,28 @@ func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee floa return tx, nil } +// Estimate the gas to WithdrawETH +func EstimateWithdrawEthGas(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "withdrawEth", ethAmount) +} + +// Withdraw unused Ether that was staked on behalf of the node +func WithdrawEth(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "withdrawEth", ethAmount) + if err != nil { + return nil, fmt.Errorf("error trying to withdraw ETH: %w", err) + } + return tx, nil +} + // Estimate the gas of DepositWithCredit func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) From f4945dd64bfb4692b983311b8a150c2587ae8f17 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 20 Nov 2023 17:15:14 -0500 Subject: [PATCH 693/878] Added pDAO proposal retrieval to the state utils --- dao/protocol/proposal.go | 6 ++ utils/state/common.go | 1 - utils/state/contracts.go | 14 ++- utils/state/pdao.go | 197 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 utils/state/pdao.go diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 4a5b205b2..7649aa4e4 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -34,6 +34,7 @@ const ( type ProtocolDaoProposalDetails struct { ID uint64 `json:"id"` ProposerAddress common.Address `json:"proposerAddress"` + TargetBlock uint32 `json:"targetBlock"` Message string `json:"message"` StartBlock uint64 `json:"startBlock"` Phase1EndBlock uint64 `json:"phase1EndBlock"` @@ -107,6 +108,11 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind prop.ProposerAddress, err = GetProposalProposer(rp, proposalId, opts) return err }) + wg.Go(func() error { + var err error + prop.TargetBlock, err = GetProposalBlock(rp, proposalId, opts) + return err + }) wg.Go(func() error { var err error prop.Message, err = GetProposalMessage(rp, proposalId, opts) diff --git a/utils/state/common.go b/utils/state/common.go index f25461cee..5c4f83501 100644 --- a/utils/state/common.go +++ b/utils/state/common.go @@ -11,7 +11,6 @@ const ( // Global constants var zero = big.NewInt(0) -var two = big.NewInt(2) // Converts a time on the chain (as Unix time in seconds) to a time.Time struct func convertToTime(value *big.Int) time.Time { diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 7470d1634..969783309 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -48,6 +48,9 @@ type NetworkContracts struct { // Atlas RocketMinipoolBondReducer *rocketpool.Contract + + // Houston + RocketDAOProtocolProposal *rocketpool.Contract } type contractArtifacts struct { @@ -58,7 +61,7 @@ type contractArtifacts struct { } // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) (*NetworkContracts, error) { +func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isHoustonDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { // Get the latest block number if it's not provided if opts == nil { latestElBlock, err := rp.Client.BlockNumber(context.Background()) @@ -160,6 +163,15 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad contract: &contracts.RocketMinipoolBondReducer, }) + // Houston wrappers + if isHoustonDeployed { + wrappers = append(wrappers, contractArtifacts{ + name: "rocketDAOProtocolProposal", + contract: &contracts.RocketDAOProtocolProposal, + }) + + } + // Add the address and ABI getters to multicall for i, wrapper := range wrappers { // Add the address getter diff --git a/utils/state/pdao.go b/utils/state/pdao.go new file mode 100644 index 000000000..b82593052 --- /dev/null +++ b/utils/state/pdao.go @@ -0,0 +1,197 @@ +package state + +import ( + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + pDaoPropDetailsBatchSize int = 50 +) + +// Proposal details +type protocolDaoProposalDetailsRaw struct { + ID uint64 + ProposerAddress common.Address + TargetBlock *big.Int + Message string + StartBlock *big.Int + Phase1EndBlock *big.Int + Phase2EndBlock *big.Int + ExpiryBlock *big.Int + CreatedTime *big.Int + VotingPowerRequired *big.Int + VotingPowerFor *big.Int + VotingPowerAgainst *big.Int + VotingPowerAbstained *big.Int + VotingPowerToVeto *big.Int + IsDestroyed bool + IsFinalized bool + IsExecuted bool + IsVetoed bool + VetoQuorum *big.Int + Payload []byte + PayloadStr string + State types.ProtocolDaoProposalState +} + +// Gets a Protocol DAO proposal's details using the efficient multicall contract +func GetProtocolDaoProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, proposalID uint64) (protocol.ProtocolDaoProposalDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + + details := protocol.ProtocolDaoProposalDetails{} + rawDetails := protocolDaoProposalDetailsRaw{} + details.ID = proposalID + + addProposalCalls(rp, contracts, contracts.Multicaller, &rawDetails, opts) + + _, err := contracts.Multicaller.FlexibleCall(true, opts) + if err != nil { + return details, fmt.Errorf("error executing multicall: %w", err) + } + + fixupPdaoProposalDetails(rp, &rawDetails, &details, opts) + + return details, nil +} + +// Gets all Protocol DAO proposal details using the efficient multicall contract +func GetAllProtocolDaoProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]protocol.ProtocolDaoProposalDetails, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + + // Get the number of proposals available + propCount, err := protocol.GetTotalProposalCount(rp, opts) + if err != nil { + return nil, fmt.Errorf("error getting proposal count: %w", err) + } + + // Make the proposal IDs (1-indexed) and return the details + ids := make([]uint64, propCount) + for i := range ids { + ids[i] = uint64(i + 1) + } + return getProposalDetails(rp, contracts, ids, opts) +} + +// Get the details of all protocol DAO proposals +func getProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, ids []uint64, opts *bind.CallOpts) ([]protocol.ProtocolDaoProposalDetails, error) { + propDetailsRaw := make([]protocolDaoProposalDetailsRaw, len(ids)) + + // Get the details in batches + var wg errgroup.Group + wg.SetLimit(threadLimit) + count := len(propDetailsRaw) + for i := 0; i < count; i += pDaoPropDetailsBatchSize { + i := i + max := i + pDaoPropDetailsBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + id := ids[j] + details := &propDetailsRaw[j] + details.ID = id + + addProposalCalls(rp, contracts, mc, details, opts) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting Protocol DAO proposal details: %w", err) + } + + // Postprocessing + props := make([]protocol.ProtocolDaoProposalDetails, len(ids)) + for i := range propDetailsRaw { + rawDetails := &propDetailsRaw[i] + details := &props[i] + fixupPdaoProposalDetails(rp, rawDetails, details, opts) + } + + return props, nil +} + +// Get the details of a proposal +func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *protocolDaoProposalDetailsRaw, opts *bind.CallOpts) error { + id := details.ID + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.TargetBlock, "getProposalBlock", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Message, "getMessage", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.StartBlock, "getStart", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase1EndBlock, "getPhase1End", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase2EndBlock, "getPhase2End", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ExpiryBlock, "getExpires", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.CreatedTime, "getCreated", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerRequired, "getVotesRequired", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerFor, "getVotesFor", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAgainst, "getVotesAgainst", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAbstained, "getVotesAbstained", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerToVeto, "getVotesVeto", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsDestroyed, "getDestroyed", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsFinalized, "getFinalised", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsExecuted, "getExecuted", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsVetoed, "getVetoed", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VetoQuorum, "getProposalVetoQuorum", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Payload, "getPayload", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.State, "getState", id) + return nil +} + +// Converts a raw proposal to a well-formatted one +func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDaoProposalDetailsRaw, details *protocol.ProtocolDaoProposalDetails, opts *bind.CallOpts) error { + details.ID = rawDetails.ID + details.ProposerAddress = rawDetails.ProposerAddress + details.TargetBlock = uint32(rawDetails.TargetBlock.Uint64()) + details.Message = rawDetails.Message + details.StartBlock = rawDetails.StartBlock.Uint64() + details.Phase1EndBlock = rawDetails.Phase1EndBlock.Uint64() + details.Phase2EndBlock = rawDetails.Phase2EndBlock.Uint64() + details.ExpiryBlock = rawDetails.ExpiryBlock.Uint64() + details.CreatedTime = time.Unix(rawDetails.CreatedTime.Int64(), 0) + details.VotingPowerRequired = rawDetails.VotingPowerRequired + details.VotingPowerFor = rawDetails.VotingPowerFor + details.VotingPowerAgainst = rawDetails.VotingPowerAgainst + details.VotingPowerAbstained = rawDetails.VotingPowerAbstained + details.VotingPowerToVeto = rawDetails.VotingPowerToVeto + details.IsDestroyed = rawDetails.IsDestroyed + details.IsFinalized = rawDetails.IsFinalized + details.IsExecuted = rawDetails.IsExecuted + details.IsVetoed = rawDetails.IsVetoed + details.VetoQuorum = rawDetails.VetoQuorum + details.Payload = rawDetails.Payload + details.State = rawDetails.State + + var err error + details.PayloadStr, err = protocol.GetProposalPayloadString(rp, rawDetails.Payload, opts) + if err != nil { + details.PayloadStr = fmt.Sprintf("", err.Error()) + } + return nil +} From e44f26800a1eee88c9536f403bc0bc115fa0ef80 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 20 Nov 2023 21:51:16 -0300 Subject: [PATCH 694/878] Add missing param --- node/deposit.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/node/deposit.go b/node/deposit.go index af732f684..57bd2f875 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -37,21 +37,21 @@ func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee floa } // Estimate the gas to WithdrawETH -func EstimateWithdrawEthGas(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateWithdrawEthGas(rp *rocketpool.RocketPool, nodeAccount common.Address, ethAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "withdrawEth", ethAmount) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "withdrawEth", nodeAccount, ethAmount) } // Withdraw unused Ether that was staked on behalf of the node -func WithdrawEth(rp *rocketpool.RocketPool, ethAmount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { +func WithdrawEth(rp *rocketpool.RocketPool, nodeAccount common.Address, ethAmount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "withdrawEth", ethAmount) + tx, err := rocketNodeDeposit.Transact(opts, "withdrawEth", nodeAccount, ethAmount) if err != nil { return nil, fmt.Errorf("error trying to withdraw ETH: %w", err) } From 2b498cee92ed3b92a4cd25b12b084b7c26ccc17b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 20 Nov 2023 22:27:11 -0500 Subject: [PATCH 695/878] Verifier events now accept multiple proposal IDs --- dao/protocol/verify.go | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 25407cce9..16fe7a05a 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -109,7 +109,7 @@ func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint6 } // Get RootSubmitted event info -func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]RootSubmitted, error) { +func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]RootSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -117,12 +117,14 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, interv } // Construct a filter query for relevant logs - proposalIdBig := big.NewInt(0).SetUint64(proposalID) + idBuffers := make([]common.Hash, len(proposalIDs)) + for i, id := range proposalIDs { + proposalIdBig := big.NewInt(0).SetUint64(id) + proposalIdBig.FillBytes(idBuffers[i].Bytes()) + } rootSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["RootSubmitted"] - proposalIdBytes := [32]byte{} - proposalIdBig.FillBytes(proposalIdBytes[:]) addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} - topicFilter := [][]common.Hash{{rootSubmittedEvent.ID}, {proposalIdBytes}} + topicFilter := [][]common.Hash{{rootSubmittedEvent.ID}, idBuffers} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) @@ -164,7 +166,7 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, interv } // Get ChallengeSubmitted event info -func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]ChallengeSubmitted, error) { +func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]ChallengeSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -172,12 +174,14 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalID uint64, i } // Construct a filter query for relevant logs - proposalIdBig := big.NewInt(0).SetUint64(proposalID) + idBuffers := make([]common.Hash, len(proposalIDs)) + for i, id := range proposalIDs { + proposalIdBig := big.NewInt(0).SetUint64(id) + proposalIdBig.FillBytes(idBuffers[i].Bytes()) + } challengeSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["ChallengeSubmitted"] - proposalIdBytes := [32]byte{} - proposalIdBig.FillBytes(proposalIdBytes[:]) addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} - topicFilter := [][]common.Hash{{challengeSubmittedEvent.ID}, {proposalIdBytes}} + topicFilter := [][]common.Hash{{challengeSubmittedEvent.ID}, idBuffers} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, endBlock, nil) From d1dd77785425c425cfc0ef3eb5f333e102c0c95d Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Nov 2023 10:09:09 -0500 Subject: [PATCH 696/878] Updated CreateChallenge and SubmitRoot --- dao/protocol/verify.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 16fe7a05a..0ec067938 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -52,21 +52,21 @@ type challengeSubmittedRaw struct { } // Estimate the gas of CreateChallenge -func EstimateCreateChallengeGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateCreateChallengeGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, node types.VotingTreeNode, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index)))) + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), node, witness) } -// Submit the Merkle root for a proposal at the specific index in response to a challenge -func CreateChallenge(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (common.Hash, error) { +// Challenge a proposal at a specific tree node index, providing a Merkle proof of the node as well +func CreateChallenge(rp *rocketpool.RocketPool, proposalId uint64, index uint64, node types.VotingTreeNode, witness []types.VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketDAOProtocolVerifier.Transact(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index)))) + tx, err := rocketDAOProtocolVerifier.Transact(opts, "createChallenge", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), node, witness) if err != nil { return common.Hash{}, fmt.Errorf("error creating challenge: %w", err) } @@ -74,21 +74,21 @@ func CreateChallenge(rp *rocketpool.RocketPool, proposalId uint64, index uint64, } // Estimate the gas of SubmitRoot -func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []types.VotingTreeNode, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateSubmitRootGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), witness, treeNodes) + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), treeNodes) } // Submit the Merkle root for a proposal at the specific index in response to a challenge -func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, witness []types.VotingTreeNode, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { +func SubmitRoot(rp *rocketpool.RocketPool, proposalId uint64, index uint64, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (common.Hash, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketDAOProtocolVerifier.Transact(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), witness, treeNodes) + tx, err := rocketDAOProtocolVerifier.Transact(opts, "submitRoot", big.NewInt(int64(proposalId)), big.NewInt((int64(index))), treeNodes) if err != nil { return common.Hash{}, fmt.Errorf("error submitting proposal root: %w", err) } From 0c0ddb1d804098697d37e6d0a4534897a128c19b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Nov 2023 12:41:41 -0500 Subject: [PATCH 697/878] Added GetNode() to Verifier --- dao/protocol/verify.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 0ec067938..721cbcbd7 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -51,6 +51,19 @@ type challengeSubmittedRaw struct { Timestamp *big.Int `json:"timestamp"` } +// Get the node of a proposal at the given index +func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.CallOpts) (types.VotingTreeNode, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return types.VotingTreeNode{}, err + } + node := new(types.VotingTreeNode) + if err := rocketDAOProtocolVerifier.Call(opts, node, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { + return types.VotingTreeNode{}, fmt.Errorf("error getting proposal %d / index %d node: %w", proposalId, index, err) + } + return *node, nil +} + // Estimate the gas of CreateChallenge func EstimateCreateChallengeGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, node types.VotingTreeNode, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) From 2f9e69b5cc6f84d33dc13a298e89935112462883 Mon Sep 17 00:00:00 2001 From: fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 21 Nov 2023 17:47:51 -0300 Subject: [PATCH 698/878] Dont update Houston deprecated field --- utils/state/network.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/state/network.go b/utils/state/network.go index 2ce1721e7..9a37c0700 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -161,7 +161,9 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() - details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() + if !isHoustonDeployed { + details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() + } details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) From 78d6d6c32e8b9bb73f646973e4357b75c402be35 Mon Sep 17 00:00:00 2001 From: fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 21 Nov 2023 18:02:31 -0300 Subject: [PATCH 699/878] Dont update deprecated field --- utils/state/network.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/state/network.go b/utils/state/network.go index 9a37c0700..0a6acc055 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -163,14 +163,15 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i details.PricesBlock = pricesBlock.Uint64() if !isHoustonDeployed { details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() + details.LatestReportableBalancesBlock = latestReportableBalancesBlock.Uint64() + } else { + details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() + details.BalancesSubmissionFrequency = balancesSubmissionFrequency.Uint64() } - details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) details.BalancesBlock = balancesBlock - details.LatestReportableBalancesBlock = latestReportableBalancesBlock.Uint64() - details.BalancesSubmissionFrequency = balancesSubmissionFrequency.Uint64() details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From d54f38affcc24be02cfa2847bf6d7e99580ccde1 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Nov 2023 20:03:05 -0500 Subject: [PATCH 700/878] Added security council proposal methods --- settings/security/auction.go | 28 ++++++++++++++++++++++ settings/security/deposit.go | 29 +++++++++++++++++++++++ settings/security/minipool.go | 28 ++++++++++++++++++++++ settings/security/network.go | 28 ++++++++++++++++++++++ settings/security/node.go | 44 +++++++++++++++++++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 settings/security/auction.go create mode 100644 settings/security/deposit.go create mode 100644 settings/security/minipool.go create mode 100644 settings/security/network.go create mode 100644 settings/security/node.go diff --git a/settings/security/auction.go b/settings/security/auction.go new file mode 100644 index 000000000..c8e71f364 --- /dev/null +++ b/settings/security/auction.go @@ -0,0 +1,28 @@ +package security + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/rocketpool-go/rocketpool" + psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" +) + +// Lot creation currently enabled +func ProposeCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.CreateLotEnabledSettingPath, value, opts) +} +func EstimateProposeCreateLotEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.CreateLotEnabledSettingPath, value, opts) +} + +// Lot bidding currently enabled +func ProposeBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.BidOnLotEnabledSettingPath, value, opts) +} +func EstimateProposeBidOnLotEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.BidOnLotEnabledSettingPath, value, opts) +} diff --git a/settings/security/deposit.go b/settings/security/deposit.go new file mode 100644 index 000000000..cbf2bcaac --- /dev/null +++ b/settings/security/deposit.go @@ -0,0 +1,29 @@ +package security + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/rocketpool-go/rocketpool" + psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/rocketpool-go/types" +) + +// Deposits currently enabled +func ProposeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) +} +func EstimateProposeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) +} + +// Deposit assignments currently enabled +func ProposeAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), psettings.DepositSettingsContractName, psettings.AssignDepositsEnabledSettingPath, value, opts) +} +func EstimateProposeAssignDepositsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), psettings.DepositSettingsContractName, psettings.AssignDepositsEnabledSettingPath, value, opts) +} diff --git a/settings/security/minipool.go b/settings/security/minipool.go new file mode 100644 index 000000000..f01871aa6 --- /dev/null +++ b/settings/security/minipool.go @@ -0,0 +1,28 @@ +package security + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/rocketpool-go/rocketpool" + psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" +) + +// Minipool withdrawable event submissions currently enabled +func ProposeMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) +} +func EstimateProposeMinipoolSubmitWithdrawableEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) +} + +// Minipool bond reductions currently enabled +func ProposeBondReductionEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.BondReductionEnabledSettingPath, value, opts) +} +func EstimateProposeBondReductionEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.BondReductionEnabledSettingPath, value, opts) +} diff --git a/settings/security/network.go b/settings/security/network.go new file mode 100644 index 000000000..b8c61f44d --- /dev/null +++ b/settings/security/network.go @@ -0,0 +1,28 @@ +package security + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/rocketpool-go/rocketpool" + psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" +) + +// Network balance submissions currently enabled +func ProposeSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitBalancesEnabledSettingPath, value, opts) +} +func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitBalancesEnabledSettingPath, value, opts) +} + +// Rewards submissions currently enabled +func ProposeSubmitRewardsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitRewardsEnabledSettingPath, value, opts) +} +func EstimateProposeSubmitRewardsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitRewardsEnabledSettingPath, value, opts) +} diff --git a/settings/security/node.go b/settings/security/node.go new file mode 100644 index 000000000..d4b2f3f07 --- /dev/null +++ b/settings/security/node.go @@ -0,0 +1,44 @@ +package security + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/rocketpool-go/rocketpool" + psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" +) + +// Node registrations currently enabled +func ProposeNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeRegistrationEnabledSettingPath, value, opts) +} +func EstimateProposeNodeRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeRegistrationEnabledSettingPath, value, opts) +} + +// Smoothing pool joining currently enabled +func ProposeSmoothingPoolRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) +} +func EstimateProposeSmoothingPoolRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) +} + +// Node deposits currently enabled +func ProposeNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeDepositEnabledSettingPath, value, opts) +} +func EstimateProposeNodeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeDepositEnabledSettingPath, value, opts) +} + +// Vacant minipools currently enabled +func ProposeVacantMinipoolsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), psettings.NodeSettingsContractName, psettings.VacantMinipoolsEnabledSettingPath, value, opts) +} +func EstimateProposeVacantMinipoolsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), psettings.NodeSettingsContractName, psettings.VacantMinipoolsEnabledSettingPath, value, opts) +} From 0a1b30f0cf078e9de6b5398fa5140d4e0111be37 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Nov 2023 20:54:59 -0500 Subject: [PATCH 701/878] Added rocketDAOProtocolSettingsSecurity --- settings/protocol/security.go | 128 ++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 settings/protocol/security.go diff --git a/settings/protocol/security.go b/settings/protocol/security.go new file mode 100644 index 000000000..310c80caa --- /dev/null +++ b/settings/protocol/security.go @@ -0,0 +1,128 @@ +package protocol + +import ( + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/types" +) + +// Config +const ( + SecuritySettingsContractName string = "rocketDAOProtocolSettingsSecurity" + SecurityMembersQuorumSettingPath string = "members.quorum" + SecurityMembersLeaveTimeSettingPath string = "members.leave.time" + SecurityProposalVoteTimeSettingPath string = "proposal.vote.time" + SecurityProposalExecuteTimeSettingPath string = "proposal.execute.time" + SecurityProposalActionTimeSettingPath string = "proposal.action.time" +) + +// Security council member quorum threshold that must be met for proposals to pass +func GetSecurityMembersQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getQuorum"); err != nil { + return nil, fmt.Errorf("error getting security members quorum: %w", err) + } + return *value, nil +} +func ProposeSecurityMembersQuorum(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityMembersQuorumSettingPath), SecuritySettingsContractName, SecurityMembersQuorumSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityMembersQuorumGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityMembersQuorumSettingPath), SecuritySettingsContractName, SecurityMembersQuorumSettingPath, value, blockNumber, treeNodes, opts) +} + +// How long a member must give notice for before manually leaving the security council +func GetSecurityMembersLeaveTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getLeaveTime"); err != nil { + return 0, fmt.Errorf("error getting security members leave time: %w", err) + } + return time.Second * time.Duration((*value).Uint64()), nil +} +func ProposeSecurityMembersLeaveTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityMembersLeaveTimeSettingPath), SecuritySettingsContractName, SecurityMembersLeaveTimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityMembersLeaveTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityMembersLeaveTimeSettingPath), SecuritySettingsContractName, SecurityMembersLeaveTimeSettingPath, value, blockNumber, treeNodes, opts) +} + +// How long a security council proposal can be voted on +func GetSecurityMembersVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getVoteTime"); err != nil { + return 0, fmt.Errorf("error getting security members vote time: %w", err) + } + return time.Second * time.Duration((*value).Uint64()), nil +} +func ProposeSecurityMembersVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityMembersVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) +} + +// How long a security council proposal can be executed after its voting period is finished +func GetSecurityMembersExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getExecuteTime"); err != nil { + return 0, fmt.Errorf("error getting security members execute time: %w", err) + } + return time.Second * time.Duration((*value).Uint64()), nil +} +func ProposeSecurityMembersExecuteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalExecuteTimeSettingPath), SecuritySettingsContractName, SecurityProposalExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityMembersExecuteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalExecuteTimeSettingPath), SecuritySettingsContractName, SecurityProposalExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) +} + +// Certain security council proposals require a secondary action to be run after the proposal is successful (joining, leaving etc). This is how long until that action expires. +func GetSecurityMembersActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getActionTime"); err != nil { + return 0, fmt.Errorf("error getting security members action time: %w", err) + } + return time.Second * time.Duration((*value).Uint64()), nil +} +func ProposeSecurityMembersActionTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalActionTimeSettingPath), SecuritySettingsContractName, SecurityProposalActionTimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityMembersActionTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalActionTimeSettingPath), SecuritySettingsContractName, SecurityProposalActionTimeSettingPath, value, blockNumber, treeNodes, opts) +} + +// Get contracts +var securitySettingsContractLock sync.Mutex + +func getSecuritySettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + securitySettingsContractLock.Lock() + defer securitySettingsContractLock.Unlock() + return rp.GetContract(SecuritySettingsContractName, opts) +} From 797b96c39e952fbebf87cccf4b02dc299e43778c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Tue, 21 Nov 2023 21:53:09 -0500 Subject: [PATCH 702/878] Fixed some naming --- settings/protocol/security.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/settings/protocol/security.go b/settings/protocol/security.go index 310c80caa..b0ee4f962 100644 --- a/settings/protocol/security.go +++ b/settings/protocol/security.go @@ -62,59 +62,59 @@ func EstimateProposeSecurityMembersLeaveTimeGas(rp *rocketpool.RocketPool, value } // How long a security council proposal can be voted on -func GetSecurityMembersVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecurityProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) if err := securitySettingsContract.Call(opts, value, "getVoteTime"); err != nil { - return 0, fmt.Errorf("error getting security members vote time: %w", err) + return 0, fmt.Errorf("error getting security proposal vote time: %w", err) } return time.Second * time.Duration((*value).Uint64()), nil } -func ProposeSecurityMembersVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSecurityProposalVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSecurityMembersVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSecurityProposalVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) } // How long a security council proposal can be executed after its voting period is finished -func GetSecurityMembersExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecuritProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) if err := securitySettingsContract.Call(opts, value, "getExecuteTime"); err != nil { - return 0, fmt.Errorf("error getting security members execute time: %w", err) + return 0, fmt.Errorf("error getting security proposal execute time: %w", err) } return time.Second * time.Duration((*value).Uint64()), nil } -func ProposeSecurityMembersExecuteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSecurityProposalExecuteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalExecuteTimeSettingPath), SecuritySettingsContractName, SecurityProposalExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSecurityMembersExecuteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSecurityProposalExecuteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalExecuteTimeSettingPath), SecuritySettingsContractName, SecurityProposalExecuteTimeSettingPath, value, blockNumber, treeNodes, opts) } // Certain security council proposals require a secondary action to be run after the proposal is successful (joining, leaving etc). This is how long until that action expires. -func GetSecurityMembersActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecurityProposalActionTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) if err := securitySettingsContract.Call(opts, value, "getActionTime"); err != nil { - return 0, fmt.Errorf("error getting security members action time: %w", err) + return 0, fmt.Errorf("error getting security proposal action time: %w", err) } return time.Second * time.Duration((*value).Uint64()), nil } -func ProposeSecurityMembersActionTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { +func ProposeSecurityProposalActionTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalActionTimeSettingPath), SecuritySettingsContractName, SecurityProposalActionTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSecurityMembersActionTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeSecurityProposalActionTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalActionTimeSettingPath), SecuritySettingsContractName, SecurityProposalActionTimeSettingPath, value, blockNumber, treeNodes, opts) } From c56a05e11b926f4af99e7486e1913333014a1503 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 22 Nov 2023 12:24:56 -0500 Subject: [PATCH 703/878] Removed some extra params --- settings/security/deposit.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/settings/security/deposit.go b/settings/security/deposit.go index cbf2bcaac..e2f7fd12f 100644 --- a/settings/security/deposit.go +++ b/settings/security/deposit.go @@ -9,14 +9,13 @@ import ( "github.com/rocket-pool/rocketpool-go/dao/security" "github.com/rocket-pool/rocketpool-go/rocketpool" psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/types" ) // Deposits currently enabled func ProposeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) } -func EstimateProposeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) } From a9a7471fef17a428eda0737701aa2483b2e6f47c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 22 Nov 2023 23:54:48 -0300 Subject: [PATCH 704/878] Fix address check --- legacy/v1.2.0/network/balances.go | 2 +- legacy/v1.2.0/network/prices.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/legacy/v1.2.0/network/balances.go b/legacy/v1.2.0/network/balances.go index a505fd6cc..9c3b044e1 100644 --- a/legacy/v1.2.0/network/balances.go +++ b/legacy/v1.2.0/network/balances.go @@ -131,7 +131,7 @@ var rocketNetworkBalancesLock sync.Mutex func getRocketNetworkBalances(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkBalancesLock.Lock() defer rocketNetworkBalancesLock.Unlock() - if address != nil { + if address == nil { return rp.VersionManager.V1_2_0.GetContract("rocketNetworkBalances", opts) } return rp.VersionManager.V1_2_0.GetContractWithAddress("rocketNetworkBalances", *address) diff --git a/legacy/v1.2.0/network/prices.go b/legacy/v1.2.0/network/prices.go index 92d3f4da0..287658b22 100644 --- a/legacy/v1.2.0/network/prices.go +++ b/legacy/v1.2.0/network/prices.go @@ -78,7 +78,7 @@ var rocketNetworkPricesLock sync.Mutex func getRocketNetworkPrices(rp *rocketpool.RocketPool, address *common.Address, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketNetworkPricesLock.Lock() defer rocketNetworkPricesLock.Unlock() - if address != nil { + if address == nil { return rp.VersionManager.V1_2_0.GetContract("rocketNetworkPrices", opts) } return rp.VersionManager.V1_2_0.GetContractWithAddress("rocketNetworkPrices", *address) From 13a229d8727f6115723f0ae370b76f43739b4a0c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 23 Nov 2023 08:37:09 -0300 Subject: [PATCH 705/878] Prices/balances frequency as duration --- settings/protocol/network.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 7bd7d0b8d..63fc1079a 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -71,7 +72,7 @@ func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bo } // The frequency in seconds at which network balances should be submitted by trusted nodes -func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err @@ -80,7 +81,7 @@ func GetSubmitBalancesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) if err := networkSettingsContract.Call(opts, value, "getSubmitBalancesFrequency"); err != nil { return 0, fmt.Errorf("error getting network balance submission frequency: %w", err) } - return (*value).Uint64(), nil + return time.Duration((*value).Uint64()) * time.Second, nil } func ProposeSubmitBalancesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitBalancesFrequencySettingPath), NetworkSettingsContractName, SubmitBalancesFrequencySettingPath, value, blockNumber, treeNodes, opts) @@ -109,7 +110,7 @@ func EstimateProposeSubmitPricesEnabledGas(rp *rocketpool.RocketPool, value bool } // The frequency in seconds at which network prices should be submitted by trusted nodes -func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { networkSettingsContract, err := getNetworkSettingsContract(rp, opts) if err != nil { return 0, err @@ -118,7 +119,7 @@ func GetSubmitPricesFrequency(rp *rocketpool.RocketPool, opts *bind.CallOpts) (u if err := networkSettingsContract.Call(opts, value, "getSubmitPricesFrequency"); err != nil { return 0, fmt.Errorf("error getting network price submission frequency: %w", err) } - return (*value).Uint64(), nil + return time.Duration((*value).Uint64()) * time.Second, nil } func ProposeSubmitPricesFrequency(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SubmitPricesFrequencySettingPath), NetworkSettingsContractName, SubmitPricesFrequencySettingPath, value, blockNumber, treeNodes, opts) From f50dcf18682a7a98a2a9693462ca28efd23fcd50 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 23 Nov 2023 08:44:49 -0300 Subject: [PATCH 706/878] Remove old methods to get vote participation --- network/balances.go | 130 -------------------------------------------- network/prices.go | 130 -------------------------------------------- 2 files changed, 260 deletions(-) diff --git a/network/balances.go b/network/balances.go index 6fe290853..3d81cd59f 100644 --- a/network/balances.go +++ b/network/balances.go @@ -1,20 +1,14 @@ package network import ( - "context" "fmt" - "math" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "gonum.org/v1/gonum/mathext" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -225,130 +219,6 @@ func GetBalancesUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts return true, eventData, nil } -// TODO: will be adjusted/removed -// Returns a mapping of members and whether they have submitted balances this interval or not -func GetTrustedNodeLatestBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updateBalancesFrequency * updateBalancesFrequency - submissions, err := GetLatestBalancesSubmissions(rp, fromBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range members { - participationTable[member.Address] = false - } - for _, submission := range submissions { - participationTable[submission] = true - } - return participationTable, nil -} - -// TODO: will be adjusted/removed -// Calculates the participation rate of every trusted node on balance submission since the last block that member count changed -func CalculateTrustedNodeBalancesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { - // Get the update frequency - updateBalancesFrequency, err := protocol.GetSubmitBalancesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber/updateBalancesFrequency - 50) * updateBalancesFrequency - latestMemberCountChangedBlock, err := trustednode.GetLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock/updateBalancesFrequency + 1) * updateBalancesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount)/2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber-startBlock)/updateBalancesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range members { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if intervalsPassed > 0 { - blocks, err := GetBalancesSubmissions(rp, member.Address, startBlock, intervalSize, opts) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block%updateBalancesFrequency == 0 { - index := block/updateBalancesFrequency - startBlock/updateBalancesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if intervalsPassed > 0 { - probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) - } - // Construct return value - participation := node.TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updateBalancesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil -} - // Get contracts var rocketNetworkBalancesLock sync.Mutex diff --git a/network/prices.go b/network/prices.go index 64682b5a1..46a30dce3 100644 --- a/network/prices.go +++ b/network/prices.go @@ -1,20 +1,14 @@ package network import ( - "context" "fmt" - "math" "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "gonum.org/v1/gonum/mathext" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/utils/eth" ) @@ -171,130 +165,6 @@ func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *b return true, eventData, nil } -// TODO: will be adjusted/removed -// Returns a mapping of members and whether they have submitted prices this interval or not -func GetTrustedNodeLatestPricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (map[common.Address]bool, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Get submission within the current interval - fromBlock := currentBlockNumber / updatePricesFrequency * updatePricesFrequency - submissions, err := GetLatestPricesSubmissions(rp, fromBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Build and return result table - participationTable := make(map[common.Address]bool) - for _, member := range members { - participationTable[member.Address] = false - } - for _, submission := range submissions { - participationTable[submission] = true - } - return participationTable, nil -} - -// TODO: needs adjustments -// Calculates the participation rate of every trusted node on price submission since the last block that member count changed -func CalculateTrustedNodePricesParticipation(rp *rocketpool.RocketPool, intervalSize *big.Int, opts *bind.CallOpts) (*node.TrustedNodeParticipation, error) { - // Get the update frequency - updatePricesFrequency, err := protocol.GetSubmitPricesFrequency(rp, opts) // - if err != nil { - return nil, err - } - // Get the current block - currentBlock, err := rp.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - currentBlockNumber := currentBlock.Number.Uint64() - // Get the block of the most recent member join (limiting to 50 intervals) - minBlock := (currentBlockNumber/updatePricesFrequency - 50) * updatePricesFrequency - latestMemberCountChangedBlock, err := trustednode.GetLatestMemberCountChangedBlock(rp, minBlock, intervalSize, opts) - if err != nil { - return nil, err - } - // Get the number of current members - memberCount, err := trustednode.GetMemberCount(rp, nil) - if err != nil { - return nil, err - } - // Start block is the first interval after the latest join - startBlock := (latestMemberCountChangedBlock/updatePricesFrequency + 1) * updatePricesFrequency - // The number of members that have to submit each interval - consensus := math.Floor(float64(memberCount)/2 + 1) - // Check if any intervals have passed - intervalsPassed := uint64(0) - if currentBlockNumber > startBlock { - // The number of intervals passed - intervalsPassed = (currentBlockNumber-startBlock)/updatePricesFrequency + 1 - } - // How many submissions would we expect per member given a random submission - expected := float64(intervalsPassed) * consensus / float64(memberCount) - // Get trusted members - members, err := trustednode.GetMembers(rp, nil) - if err != nil { - return nil, err - } - // Construct the epoch map - participationTable := make(map[common.Address][]bool) - // Iterate members and sum chi-square - submissions := make(map[common.Address]float64) - chi := float64(0) - for _, member := range members { - participationTable[member.Address] = make([]bool, intervalsPassed) - actual := 0 - if intervalsPassed > 0 { - blocks, err := GetPricesSubmissions(rp, member.Address, startBlock, intervalSize, opts) - if err != nil { - return nil, err - } - actual = len(*blocks) - delta := float64(actual) - expected - chi += (delta * delta) / expected - // Add to participation table - for _, block := range *blocks { - // Ignore out of step updates - if block%updatePricesFrequency == 0 { - index := block/updatePricesFrequency - startBlock/updatePricesFrequency - participationTable[member.Address][index] = true - } - } - } - // Save actual submission - submissions[member.Address] = float64(actual) - } - // Calculate inverse cumulative density function with members-1 DoF - probability := float64(1) - if intervalsPassed > 0 { - probability = 1 - mathext.GammaIncReg(float64(len(members)-1)/2, chi/2) - } - // Construct return value - participation := node.TrustedNodeParticipation{ - Probability: probability, - ExpectedSubmissions: expected, - ActualSubmissions: submissions, - StartBlock: startBlock, - UpdateFrequency: updatePricesFrequency, - UpdateCount: intervalsPassed, - Participation: participationTable, - } - return &participation, nil -} - // Get contracts var rocketNetworkPricesLock sync.Mutex From 2c9e0318ae9bcfce724bc756f5f690fe80025de1 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Sat, 25 Nov 2023 09:19:31 -0300 Subject: [PATCH 707/878] Fix missing totalEth --- network/balances.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/balances.go b/network/balances.go index 3d81cd59f..78d77e49e 100644 --- a/network/balances.go +++ b/network/balances.go @@ -115,7 +115,7 @@ func SubmitBalances(rp *rocketpool.RocketPool, block uint64, slotTimestamp uint6 if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), stakingEth, rethSupply) + tx, err := rocketNetworkBalances.Transact(opts, "submitBalances", big.NewInt(int64(block)), big.NewInt(int64(slotTimestamp)), totalEth, stakingEth, rethSupply) if err != nil { return common.Hash{}, fmt.Errorf("error submitting network balances: %w", err) } From 081dacaee97e1706722618f94a2f9e16ac8dcd84 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 11:59:20 -0500 Subject: [PATCH 708/878] Added pDAO bond claimers --- dao/protocol/verify.go | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 721cbcbd7..03a5e1bdc 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -232,6 +232,74 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64 return events, nil } +// Estimate the gas of ClaimBondChallenger +func EstimateClaimBondChallengerGas(rp *rocketpool.RocketPool, proposalID uint64, indices []uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + // Make the args + proposalIDBig := big.NewInt(int64(proposalID)) + indicesBig := make([]*big.Int, len(indices)) + for i, index := range indices { + indicesBig[i] = big.NewInt(int64(index)) + } + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "claimBondChallenger", proposalIDBig, indicesBig) +} + +// Claim any RPL bond refunds or rewards for a proposal, as a challenger +func ClaimBondChallenger(rp *rocketpool.RocketPool, proposalID uint64, indices []uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return common.Hash{}, err + } + // Make the args + proposalIDBig := big.NewInt(int64(proposalID)) + indicesBig := make([]*big.Int, len(indices)) + for i, index := range indices { + indicesBig[i] = big.NewInt(int64(index)) + } + tx, err := rocketDAOProtocolVerifier.Transact(opts, "claimBondChallenger", proposalIDBig, indicesBig) + if err != nil { + return common.Hash{}, err + } + return tx.Hash(), nil +} + +// Estimate the gas of ClaimBondProposer +func EstimateClaimBondProposerGas(rp *rocketpool.RocketPool, proposalID uint64, indices []uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + // Make the args + proposalIDBig := big.NewInt(int64(proposalID)) + indicesBig := make([]*big.Int, len(indices)) + for i, index := range indices { + indicesBig[i] = big.NewInt(int64(index)) + } + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "claimBondProposer", proposalIDBig, indicesBig) +} + +// Claim any RPL bond refunds or rewards for a proposal, as the proposer +func ClaimBondProposer(rp *rocketpool.RocketPool, proposalID uint64, indices []uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return common.Hash{}, err + } + // Make the args + proposalIDBig := big.NewInt(int64(proposalID)) + indicesBig := make([]*big.Int, len(indices)) + for i, index := range indices { + indicesBig[i] = big.NewInt(int64(index)) + } + tx, err := rocketDAOProtocolVerifier.Transact(opts, "claimBondProposer", proposalIDBig, indicesBig) + if err != nil { + return common.Hash{}, err + } + return tx.Hash(), nil +} + // Get contracts var rocketDAOProtocolVerifierLock sync.Mutex From 2b5df97ba8c8b4048c8fcb16c92f12949b782f3f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 14:45:02 -0500 Subject: [PATCH 709/878] Changed pDAO proposal details from blocks to timestamps --- dao/protocol/proposal.go | 56 ++++++++++++++++++++-------------------- go.mod | 2 +- go.sum | 5 ++-- utils/state/pdao.go | 24 ++++++++--------- 4 files changed, 43 insertions(+), 44 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 7649aa4e4..b2a07117a 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -36,10 +36,10 @@ type ProtocolDaoProposalDetails struct { ProposerAddress common.Address `json:"proposerAddress"` TargetBlock uint32 `json:"targetBlock"` Message string `json:"message"` - StartBlock uint64 `json:"startBlock"` - Phase1EndBlock uint64 `json:"phase1EndBlock"` - Phase2EndBlock uint64 `json:"phase2EndBlock"` - ExpiryBlock uint64 `json:"expiryBlock"` + VotingStartTime time.Time `json:"startTime"` + Phase1EndTime time.Time `json:"phase1EndTime"` + Phase2EndTime time.Time `json:"phase2EndTime"` + ExpiryTime time.Time `json:"expiryTime"` CreatedTime time.Time `json:"createdTime"` VotingPowerRequired *big.Int `json:"votingPowerRequired"` VotingPowerFor *big.Int `json:"votingPowerFor"` @@ -120,22 +120,22 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind }) wg.Go(func() error { var err error - prop.StartBlock, err = GetProposalStartBlock(rp, proposalId, opts) + prop.VotingStartTime, err = GetProposalVotingStartTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - prop.Phase1EndBlock, err = GetProposalPhase1EndBlock(rp, proposalId, opts) + prop.Phase1EndTime, err = GetProposalPhase1EndTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - prop.Phase2EndBlock, err = GetProposalPhase2EndBlock(rp, proposalId, opts) + prop.Phase2EndTime, err = GetProposalPhase2EndTime(rp, proposalId, opts) return err }) wg.Go(func() error { var err error - prop.ExpiryBlock, err = GetProposalExpiryBlock(rp, proposalId, opts) + prop.ExpiryTime, err = GetProposalExpiryTime(rp, proposalId, opts) return err }) wg.Go(func() error { @@ -283,56 +283,56 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return *value, nil } -// Get the start block of this proposal -func GetProposalStartBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +// Get the start time of this proposal, when voting begins +func GetProposalVotingStartTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) if err != nil { - return 0, err + return time.Time{}, err } value := new(*big.Int) if err := rocketDAOProtocolProposal.Call(opts, value, "getStart", proposalId); err != nil { - return 0, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) + return time.Time{}, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) } - return (*value).Uint64(), nil + return time.Unix((*value).Int64(), 0), nil } -// Get the phase 1 end block of this proposal -func GetProposalPhase1EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +// Get the phase 1 end time of this proposal +func GetProposalPhase1EndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) if err != nil { - return 0, err + return time.Time{}, err } value := new(*big.Int) if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase1End", proposalId); err != nil { - return 0, fmt.Errorf("error getting phase 1 end block for proposal %d: %w", proposalId, err) + return time.Time{}, fmt.Errorf("error getting phase 1 end time for proposal %d: %w", proposalId, err) } - return (*value).Uint64(), nil + return time.Unix((*value).Int64(), 0), nil } -// Get the phase 2 end block of this proposal -func GetProposalPhase2EndBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +// Get the phase 2 end time of this proposal +func GetProposalPhase2EndTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) if err != nil { - return 0, err + return time.Time{}, err } value := new(*big.Int) if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase2End", proposalId); err != nil { - return 0, fmt.Errorf("error getting phase 2 end block for proposal %d: %w", proposalId, err) + return time.Time{}, fmt.Errorf("error getting phase 2 end time for proposal %d: %w", proposalId, err) } - return (*value).Uint64(), nil + return time.Unix((*value).Int64(), 0), nil } -// Get the block where the proposal expires and can no longer be executed if it is successful -func GetProposalExpiryBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { +// Get the time where the proposal expires and can no longer be executed if it is successful +func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Time, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) if err != nil { - return 0, err + return time.Time{}, err } value := new(*big.Int) if err := rocketDAOProtocolProposal.Call(opts, value, "getExpires", proposalId); err != nil { - return 0, fmt.Errorf("error getting expiry block for proposal %d: %w", proposalId, err) + return time.Time{}, fmt.Errorf("error getting expiry time for proposal %d: %w", proposalId, err) } - return (*value).Uint64(), nil + return time.Unix((*value).Int64(), 0), nil } // Get the time the proposal was created diff --git a/go.mod b/go.mod index 29b3d991d..e109879de 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/princjef/gomarkdoc v0.4.1 github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 golang.org/x/sync v0.1.0 - gonum.org/v1/gonum v0.12.0 ) require ( @@ -32,6 +31,7 @@ require ( github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/google/go-cmp v0.5.7 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/imdario/mergo v0.3.12 // indirect diff --git a/go.sum b/go.sum index 202a56470..1026c10be 100644 --- a/go.sum +++ b/go.sum @@ -82,6 +82,7 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -203,7 +204,6 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= @@ -240,9 +240,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/utils/state/pdao.go b/utils/state/pdao.go index b82593052..f66a37db6 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -24,10 +24,10 @@ type protocolDaoProposalDetailsRaw struct { ProposerAddress common.Address TargetBlock *big.Int Message string - StartBlock *big.Int - Phase1EndBlock *big.Int - Phase2EndBlock *big.Int - ExpiryBlock *big.Int + StartTime *big.Int + Phase1EndTime *big.Int + Phase2EndTime *big.Int + ExpiryTime *big.Int CreatedTime *big.Int VotingPowerRequired *big.Int VotingPowerFor *big.Int @@ -144,10 +144,10 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.TargetBlock, "getProposalBlock", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Message, "getMessage", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.StartBlock, "getStart", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase1EndBlock, "getPhase1End", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase2EndBlock, "getPhase2End", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ExpiryBlock, "getExpires", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.StartTime, "getStart", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase1EndTime, "getPhase1End", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase2EndTime, "getPhase2End", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ExpiryTime, "getExpires", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.CreatedTime, "getCreated", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerRequired, "getVotesRequired", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerFor, "getVotesFor", id) @@ -170,10 +170,10 @@ func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDao details.ProposerAddress = rawDetails.ProposerAddress details.TargetBlock = uint32(rawDetails.TargetBlock.Uint64()) details.Message = rawDetails.Message - details.StartBlock = rawDetails.StartBlock.Uint64() - details.Phase1EndBlock = rawDetails.Phase1EndBlock.Uint64() - details.Phase2EndBlock = rawDetails.Phase2EndBlock.Uint64() - details.ExpiryBlock = rawDetails.ExpiryBlock.Uint64() + details.VotingStartTime = time.Unix(rawDetails.StartTime.Int64(), 0) + details.Phase1EndTime = time.Unix(rawDetails.Phase1EndTime.Int64(), 0) + details.Phase2EndTime = time.Unix(rawDetails.Phase2EndTime.Int64(), 0) + details.ExpiryTime = time.Unix(rawDetails.ExpiryTime.Int64(), 0) details.CreatedTime = time.Unix(rawDetails.CreatedTime.Int64(), 0) details.VotingPowerRequired = rawDetails.VotingPowerRequired details.VotingPowerFor = rawDetails.VotingPowerFor From 60869746974ef13c3d4d87d843d152eb612fbe87 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 15:35:06 -0500 Subject: [PATCH 710/878] Added GetProposalBonds and GetMultiChallengeStatesFast --- dao/protocol/verify.go | 76 ++++++++++++++++++++++++++++++++++++++++++ network/voting.go | 5 +++ 2 files changed, 81 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 03a5e1bdc..f1b7b5eda 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -11,6 +11,12 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/types" "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/rocketpool-go/utils/multicall" + "golang.org/x/sync/errgroup" +) + +const ( + challengeStateBatchSize uint64 = 500 ) // Structure of the RootSubmitted event @@ -121,6 +127,76 @@ func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint6 return *state, nil } +// Get the proposal bond and challenge bond for a proposal +func GetProposalBonds(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, *big.Int, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return nil, nil, err + } + type response struct { + proposalBond *big.Int + challengeBond *big.Int + } + value := new(response) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getProposalBonds", big.NewInt(int64(proposalId))); err != nil { + return nil, nil, fmt.Errorf("error getting proposal %d bonds: %w", proposalId, err) + } + return value.proposalBond, value.challengeBond, nil +} + +// Get the states of multiple challenges using multicall +// NOTE: wen v2.,, +func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress common.Address, proposalIds []uint64, challengedIndices []uint64, opts *bind.CallOpts) ([]types.ChallengeState, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return nil, err + } + + count := uint64(len(proposalIds)) + if count != uint64(len(challengedIndices)) { + return nil, fmt.Errorf("have %d proposal IDs but %d challenge indices", count, len(challengedIndices)) + } + + // Sync + var wg errgroup.Group + + // Run the getters in batches + states := make([]types.ChallengeState, count) + for i := uint64(0); i < count; i += challengeStateBatchSize { + i := i + max := i + challengeStateBatchSize + if max > count { + max = count + } + + // Load details + wg.Go(func() error { + var err error + mc, err := multicall.NewMultiCaller(rp.Client, multicallAddress) + if err != nil { + return err + } + for j := i; j < max; j++ { + propID := big.NewInt(int64(proposalIds[j])) + challengedIndex := big.NewInt(int64(challengedIndices[j])) + mc.AddCall(rocketDAOProtocolVerifier, &states[j], "getChallengeState", propID, challengedIndex) + } + _, err = mc.FlexibleCall(true, opts) + if err != nil { + return fmt.Errorf("error executing multicall: %w", err) + } + return nil + }) + } + + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + + return states, nil +} + // Get RootSubmitted event info func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]RootSubmitted, error) { // Get the contract diff --git a/network/voting.go b/network/voting.go index 4fffcd6f1..ea64c3f3b 100644 --- a/network/voting.go +++ b/network/voting.go @@ -71,6 +71,11 @@ func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, mult }) } + // Wait for data + if err := wg.Wait(); err != nil { + return nil, err + } + return votingInfos, nil } From 657734a10310427beec5cd7021504fc498d0157c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 15:49:02 -0500 Subject: [PATCH 711/878] Added prop bonds to proposal details --- dao/protocol/proposal.go | 7 +++++++ utils/state/contracts.go | 5 ++++- utils/state/pdao.go | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index b2a07117a..600e1ea0b 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -54,6 +54,8 @@ type ProtocolDaoProposalDetails struct { Payload []byte `json:"payload"` PayloadStr string `json:"payloadStr"` State types.ProtocolDaoProposalState `json:"state"` + ProposerBond *big.Int `json:"proposerBond"` + ChallengeBond *big.Int `json:"challengeBond"` } // Get all proposal details @@ -203,6 +205,11 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind prop.State, err = GetProposalState(rp, proposalId, opts) return err }) + wg.Go(func() error { + var err error + prop.ProposerBond, prop.ChallengeBond, err = GetProposalBonds(rp, proposalId, opts) + return err + }) // Wait for data if err := wg.Wait(); err != nil { diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 969783309..42229f8fc 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -51,6 +51,7 @@ type NetworkContracts struct { // Houston RocketDAOProtocolProposal *rocketpool.Contract + RocketDAOProtocolVerifier *rocketpool.Contract } type contractArtifacts struct { @@ -168,8 +169,10 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad wrappers = append(wrappers, contractArtifacts{ name: "rocketDAOProtocolProposal", contract: &contracts.RocketDAOProtocolProposal, + }, contractArtifacts{ + name: "rocketDAOProtocolVerifier", + contract: &contracts.RocketDAOProtocolVerifier, }) - } // Add the address and ABI getters to multicall diff --git a/utils/state/pdao.go b/utils/state/pdao.go index f66a37db6..fc9c933ec 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -18,6 +18,11 @@ const ( pDaoPropDetailsBatchSize int = 50 ) +type proposalBonds struct { + ProposerBond *big.Int + ChallengeBond *big.Int +} + // Proposal details type protocolDaoProposalDetailsRaw struct { ID uint64 @@ -42,6 +47,7 @@ type protocolDaoProposalDetailsRaw struct { Payload []byte PayloadStr string State types.ProtocolDaoProposalState + ProposalBonds proposalBonds } // Gets a Protocol DAO proposal's details using the efficient multicall contract @@ -161,6 +167,7 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VetoQuorum, "getProposalVetoQuorum", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Payload, "getPayload", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.State, "getState", id) + mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.ProposalBonds, "getProposalBonds", id) return nil } @@ -187,6 +194,8 @@ func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDao details.VetoQuorum = rawDetails.VetoQuorum details.Payload = rawDetails.Payload details.State = rawDetails.State + details.ProposerBond = rawDetails.ProposalBonds.ProposerBond + details.ChallengeBond = rawDetails.ProposalBonds.ChallengeBond var err error details.PayloadStr, err = protocol.GetProposalPayloadString(rp, rawDetails.Payload, opts) From c0486ad88bdf994fe43124d60dec7b84dcae1d69 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 19:28:13 -0500 Subject: [PATCH 712/878] Updated proposal details views --- dao/protocol/proposal.go | 23 ++++++++++++++--- dao/protocol/verify.go | 55 ++++++++++++++++++++++++++++++++-------- utils/state/pdao.go | 29 +++++++++++---------- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 600e1ea0b..b99081e34 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -36,11 +36,12 @@ type ProtocolDaoProposalDetails struct { ProposerAddress common.Address `json:"proposerAddress"` TargetBlock uint32 `json:"targetBlock"` Message string `json:"message"` + CreatedTime time.Time `json:"createdTime"` + ChallengeWindow time.Duration `json:"challengeWindow"` VotingStartTime time.Time `json:"startTime"` Phase1EndTime time.Time `json:"phase1EndTime"` Phase2EndTime time.Time `json:"phase2EndTime"` ExpiryTime time.Time `json:"expiryTime"` - CreatedTime time.Time `json:"createdTime"` VotingPowerRequired *big.Int `json:"votingPowerRequired"` VotingPowerFor *big.Int `json:"votingPowerFor"` VotingPowerAgainst *big.Int `json:"votingPowerAgainst"` @@ -54,8 +55,9 @@ type ProtocolDaoProposalDetails struct { Payload []byte `json:"payload"` PayloadStr string `json:"payloadStr"` State types.ProtocolDaoProposalState `json:"state"` - ProposerBond *big.Int `json:"proposerBond"` + ProposalBond *big.Int `json:"proposalBond"` ChallengeBond *big.Int `json:"challengeBond"` + DefeatIndex uint64 `json:"defeatIndex"` } // Get all proposal details @@ -207,7 +209,22 @@ func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind }) wg.Go(func() error { var err error - prop.ProposerBond, prop.ChallengeBond, err = GetProposalBonds(rp, proposalId, opts) + prop.DefeatIndex, err = GetDefeatIndex(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.ProposalBond, err = GetProposalBond(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.ChallengeBond, err = GetChallengeBond(rp, proposalId, opts) + return err + }) + wg.Go(func() error { + var err error + prop.ChallengeWindow, err = GetChallengePeriod(rp, proposalId, opts) return err }) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index f1b7b5eda..37d56ff3b 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -127,21 +127,56 @@ func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint6 return *state, nil } -// Get the proposal bond and challenge bond for a proposal -func GetProposalBonds(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, *big.Int, error) { +// Get the defeat index for a proposal +func GetDefeatIndex(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (uint64, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { - return nil, nil, err + return 0, err } - type response struct { - proposalBond *big.Int - challengeBond *big.Int + value := new(*big.Int) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getDefeatIndex", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("error getting proposal %d defeat index: %w", proposalId, err) } - value := new(response) - if err := rocketDAOProtocolVerifier.Call(opts, value, "getProposalBonds", big.NewInt(int64(proposalId))); err != nil { - return nil, nil, fmt.Errorf("error getting proposal %d bonds: %w", proposalId, err) + return (*value).Uint64(), nil +} + +// Get the proposal bond for a proposal +func GetProposalBond(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getProposalBond", big.NewInt(int64(proposalId))); err != nil { + return nil, fmt.Errorf("error getting proposal %d proposal bond: %w", proposalId, err) + } + return *value, nil +} + +// Get the challenge bond for a proposal +func GetChallengeBond(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (*big.Int, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getChallengeBond", big.NewInt(int64(proposalId))); err != nil { + return nil, fmt.Errorf("error getting proposal %d challenge bond: %w", proposalId, err) + } + return *value, nil +} + +// Get the challenge period for a proposal +func GetChallengePeriod(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (time.Duration, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getChallengePeriod", big.NewInt(int64(proposalId))); err != nil { + return 0, fmt.Errorf("error getting proposal %d challenge period: %w", proposalId, err) } - return value.proposalBond, value.challengeBond, nil + return time.Second * time.Duration((*value).Uint64()), nil } // Get the states of multiple challenges using multicall diff --git a/utils/state/pdao.go b/utils/state/pdao.go index fc9c933ec..4f91f81f9 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -18,22 +18,18 @@ const ( pDaoPropDetailsBatchSize int = 50 ) -type proposalBonds struct { - ProposerBond *big.Int - ChallengeBond *big.Int -} - // Proposal details type protocolDaoProposalDetailsRaw struct { ID uint64 ProposerAddress common.Address TargetBlock *big.Int Message string - StartTime *big.Int + CreatedTime *big.Int + ChallengeWindow *big.Int + VotingStartTime *big.Int Phase1EndTime *big.Int Phase2EndTime *big.Int ExpiryTime *big.Int - CreatedTime *big.Int VotingPowerRequired *big.Int VotingPowerFor *big.Int VotingPowerAgainst *big.Int @@ -47,7 +43,9 @@ type protocolDaoProposalDetailsRaw struct { Payload []byte PayloadStr string State types.ProtocolDaoProposalState - ProposalBonds proposalBonds + ProposalBond *big.Int + ChallengeBond *big.Int + DefeatIndex *big.Int } // Gets a Protocol DAO proposal's details using the efficient multicall contract @@ -150,7 +148,7 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.TargetBlock, "getProposalBlock", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Message, "getMessage", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.StartTime, "getStart", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingStartTime, "getStart", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase1EndTime, "getPhase1End", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase2EndTime, "getPhase2End", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ExpiryTime, "getExpires", id) @@ -167,7 +165,10 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VetoQuorum, "getProposalVetoQuorum", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Payload, "getPayload", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.State, "getState", id) - mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.ProposalBonds, "getProposalBonds", id) + mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.DefeatIndex, "getDefeatIndex", id) + mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.ProposalBond, "getProposalBond", id) + mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.ChallengeBond, "getChallengeBond", id) + mc.AddCall(contracts.RocketDAOProtocolVerifier, &details.ChallengeWindow, "getChallengePeriod", id) return nil } @@ -177,7 +178,7 @@ func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDao details.ProposerAddress = rawDetails.ProposerAddress details.TargetBlock = uint32(rawDetails.TargetBlock.Uint64()) details.Message = rawDetails.Message - details.VotingStartTime = time.Unix(rawDetails.StartTime.Int64(), 0) + details.VotingStartTime = time.Unix(rawDetails.VotingStartTime.Int64(), 0) details.Phase1EndTime = time.Unix(rawDetails.Phase1EndTime.Int64(), 0) details.Phase2EndTime = time.Unix(rawDetails.Phase2EndTime.Int64(), 0) details.ExpiryTime = time.Unix(rawDetails.ExpiryTime.Int64(), 0) @@ -194,8 +195,10 @@ func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDao details.VetoQuorum = rawDetails.VetoQuorum details.Payload = rawDetails.Payload details.State = rawDetails.State - details.ProposerBond = rawDetails.ProposalBonds.ProposerBond - details.ChallengeBond = rawDetails.ProposalBonds.ChallengeBond + details.DefeatIndex = rawDetails.DefeatIndex.Uint64() + details.ProposalBond = rawDetails.ProposalBond + details.ChallengeBond = rawDetails.ChallengeBond + details.ChallengeWindow = time.Second * time.Duration(rawDetails.ChallengeWindow.Uint64()) var err error details.PayloadStr, err = protocol.GetProposalPayloadString(rp, rawDetails.Payload, opts) From dbcccc5a97d506051bf617cea02758b49e7cb0a9 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 26 Nov 2023 21:40:14 -0500 Subject: [PATCH 713/878] Added DefeatProposal --- dao/protocol/verify.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 37d56ff3b..573f8a519 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -411,6 +411,28 @@ func ClaimBondProposer(rp *rocketpool.RocketPool, proposalID uint64, indices []u return tx.Hash(), nil } +// Estimate the gas of DefeatProposal +func EstimateDefeatProposalGas(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolVerifier.GetTransactionGasInfo(opts, "defeatProposal", big.NewInt(int64(proposalId)), big.NewInt(int64(index))) +} + +// Defeat a proposal if it fails to respond to a challenge within the challenge window, providing the node index that wasn't responded to +func DefeatProposal(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolVerifier.Transact(opts, "defeatProposal", big.NewInt(int64(proposalId)), big.NewInt(int64(index))) + if err != nil { + return common.Hash{}, err + } + return tx.Hash(), nil +} + // Get contracts var rocketDAOProtocolVerifierLock sync.Mutex From 3035821b3a27eed9d191672c5a709df755b91b8c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:58:45 -0300 Subject: [PATCH 714/878] Add the nodeAddress to withdrawRPL --- node/staking.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/node/staking.go b/node/staking.go index 92ac31da6..82222eaec 100644 --- a/node/staking.go +++ b/node/staking.go @@ -181,21 +181,21 @@ func SetStakeRPLForAllowed(rp *rocketpool.RocketPool, caller common.Address, all } // Estimate the gas of WithdrawRPL -func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateWithdrawRPLGas(rp *rocketpool.RocketPool, nodeAddress common.Address, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", rplAmount) + return rocketNodeStaking.GetTransactionGasInfo(opts, "withdrawRPL", nodeAddress, rplAmount) } // Withdraw staked RPL -func WithdrawRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { +func WithdrawRPL(rp *rocketpool.RocketPool, nodeAddress common.Address, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", rplAmount) + tx, err := rocketNodeStaking.Transact(opts, "withdrawRPL", nodeAddress, rplAmount) if err != nil { return common.Hash{}, fmt.Errorf("error withdrawing staked RPL: %w", err) } From 8bd62777fe86d54487898466fc98a88cdaf341a6 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 28 Nov 2023 00:04:04 -0300 Subject: [PATCH 715/878] Add SetRPLLockingAllowed --- node/staking.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/node/staking.go b/node/staking.go index 82222eaec..4ee5ffaaa 100644 --- a/node/staking.go +++ b/node/staking.go @@ -158,6 +158,41 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact return tx.Hash(), nil } +// Estimate the gas of set RPL locking allowed +func EstimateSetRPLLockingAllowedGas(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "setRPLLockingAllowed", caller, allowed) +} + +// Set RPL locking allowed +func SetRPLLockingAllowed(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeStaking.Transact(opts, "setRPLLockingAllowed", caller, allowed) + if err != nil { + return common.Hash{}, fmt.Errorf("error setting RPL locking allowed: %w", err) + } + return tx.Hash(), nil +} + +// Get RPL locking allowed state for a node +func GetRPLLockedAllowed(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*bool, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, opts) + if err != nil { + return nil, err + } + value := new(*bool) + if err := rocketNodeStaking.Call(opts, value, "getRPLLockingAllowed", nodeAddress); err != nil { + return nil, fmt.Errorf("error getting node RPL locked: %w", err) + } + return *value, nil +} + // Estimate the gas of set stake RPL for allowed func EstimateSetStakeRPLForAllowedGas(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, nil) From c4922cb204962363af0f5ba67059e652baf9f5cc Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:16:14 -0300 Subject: [PATCH 716/878] Fix return for GetRPLLockedAllowed --- node/staking.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/staking.go b/node/staking.go index 4ee5ffaaa..3a96a7190 100644 --- a/node/staking.go +++ b/node/staking.go @@ -186,11 +186,11 @@ func GetRPLLockedAllowed(rp *rocketpool.RocketPool, nodeAddress common.Address, if err != nil { return nil, err } - value := new(*bool) + value := new(bool) if err := rocketNodeStaking.Call(opts, value, "getRPLLockingAllowed", nodeAddress); err != nil { return nil, fmt.Errorf("error getting node RPL locked: %w", err) } - return *value, nil + return value, nil } // Estimate the gas of set stake RPL for allowed From 4b93f73e6828d2b17920bf726a7ce3af85ed9575 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 28 Nov 2023 11:47:13 -0300 Subject: [PATCH 717/878] Fix bool return --- node/staking.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/node/staking.go b/node/staking.go index 3a96a7190..a1cfa1e13 100644 --- a/node/staking.go +++ b/node/staking.go @@ -181,16 +181,16 @@ func SetRPLLockingAllowed(rp *rocketpool.RocketPool, caller common.Address, allo } // Get RPL locking allowed state for a node -func GetRPLLockedAllowed(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (*bool, error) { +func GetRPLLockedAllowed(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, opts) if err != nil { - return nil, err + return false, err } value := new(bool) if err := rocketNodeStaking.Call(opts, value, "getRPLLockingAllowed", nodeAddress); err != nil { - return nil, fmt.Errorf("error getting node RPL locked: %w", err) + return false, fmt.Errorf("error getting node RPL locked: %w", err) } - return value, nil + return *value, nil } // Estimate the gas of set stake RPL for allowed From 632d70546d3bd5efa36e4af36a9248ca438eef9c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Mon, 11 Dec 2023 19:17:57 -0500 Subject: [PATCH 718/878] Added rocketClaimDAO --- dao/claim.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dao/claim.go diff --git a/dao/claim.go b/dao/claim.go new file mode 100644 index 000000000..0fd704e97 --- /dev/null +++ b/dao/claim.go @@ -0,0 +1,30 @@ +package dao + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func GetContractExists(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (bool, error) { + rocketClaimDAO, err := getRocketClaimDAO(rp, opts) + if err != nil { + return false, err + } + result := new(bool) + if err := rocketClaimDAO.Call(opts, result, "getContractExists", contractName); err != nil { + return false, fmt.Errorf("error checking if contract %s exists: %w", contractName, err) + } + return *result, nil +} + +// Get contracts +var rocketClaimDAOLock sync.Mutex + +func getRocketClaimDAO(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketClaimDAOLock.Lock() + defer rocketClaimDAOLock.Unlock() + return rp.GetContract("rocketClaimDAO", opts) +} From 97b510fc2a8b5939999c6086b1c5d3341bfb5a8f Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:25:35 -0300 Subject: [PATCH 719/878] getVotePhase1Time and getVotePhase2Time --- settings/protocol/proposals.go | 36 ++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/settings/protocol/proposals.go b/settings/protocol/proposals.go index fbc6e8a25..88a1e184b 100644 --- a/settings/protocol/proposals.go +++ b/settings/protocol/proposals.go @@ -17,7 +17,8 @@ import ( // Config const ( ProposalsSettingsContractName string = "rocketDAOProtocolSettingsProposals" - VoteTimeSettingPath string = "proposal.vote.time" + VotePhase1TimeSettingPath string = "proposal.vote.phase1.time" + VotePhase2TimeSettingPath string = "proposal.vote.phase2.time" VoteDelayTimeSettingPath string = "proposal.vote.delay.time" ExecuteTimeSettingPath string = "proposal.execute.time" ProposalBondSettingPath string = "proposal.bond" @@ -28,23 +29,42 @@ const ( ProposalMaxBlockAgeSettingPath string = "proposal.max.block.age" ) -// How long a proposal can be voted on before expiring -func GetVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +// How long a proposal can be voted on phase 1 +func GetVotePhase1Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := proposalsSettingsContract.Call(opts, value, "getVoteTime"); err != nil { + if err := proposalsSettingsContract.Call(opts, value, "getVotePhase1Time"); err != nil { return 0, fmt.Errorf("error getting vote time: %w", err) } return time.Duration((*value).Uint64()) * time.Second, nil } -func ProposeVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, value, blockNumber, treeNodes, opts) +func ProposeVotePhase1Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VotePhase1TimeSettingPath), ProposalsSettingsContractName, VotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VoteTimeSettingPath), ProposalsSettingsContractName, VoteTimeSettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeVotePhase1TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VotePhase1TimeSettingPath), ProposalsSettingsContractName, VotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) +} + +// How long a proposal can be voted on phase 2 +func GetVotePhase2Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getVotePhase2Time"); err != nil { + return 0, fmt.Errorf("error getting vote time: %w", err) + } + return time.Duration((*value).Uint64()) * time.Second, nil +} +func ProposeVotePhase2Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", VotePhase2TimeSettingPath), ProposalsSettingsContractName, VotePhase2TimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeVotePhase2TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", VotePhase2TimeSettingPath), ProposalsSettingsContractName, VotePhase2TimeSettingPath, value, blockNumber, treeNodes, opts) } // How long before a proposal can be voted on after its created From fe1608a1b9da956e40c94adbaf851baf1df749e6 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:37:16 -0300 Subject: [PATCH 720/878] Vote Phase1 and Phase2 for security council --- settings/protocol/security.go | 44 +++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/settings/protocol/security.go b/settings/protocol/security.go index b0ee4f962..40c897ac0 100644 --- a/settings/protocol/security.go +++ b/settings/protocol/security.go @@ -15,12 +15,13 @@ import ( // Config const ( - SecuritySettingsContractName string = "rocketDAOProtocolSettingsSecurity" - SecurityMembersQuorumSettingPath string = "members.quorum" - SecurityMembersLeaveTimeSettingPath string = "members.leave.time" - SecurityProposalVoteTimeSettingPath string = "proposal.vote.time" - SecurityProposalExecuteTimeSettingPath string = "proposal.execute.time" - SecurityProposalActionTimeSettingPath string = "proposal.action.time" + SecuritySettingsContractName string = "rocketDAOProtocolSettingsSecurity" + SecurityMembersQuorumSettingPath string = "members.quorum" + SecurityMembersLeaveTimeSettingPath string = "members.leave.time" + SecurityProposalVotePhase1TimeSettingPath string = "proposal.vote.phase1.time" + SecurityProposalVotePhase2TimeSettingPath string = "proposal.vote.phase2.time" + SecurityProposalExecuteTimeSettingPath string = "proposal.execute.time" + SecurityProposalActionTimeSettingPath string = "proposal.action.time" ) // Security council member quorum threshold that must be met for proposals to pass @@ -61,23 +62,42 @@ func EstimateProposeSecurityMembersLeaveTimeGas(rp *rocketpool.RocketPool, value return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityMembersLeaveTimeSettingPath), SecuritySettingsContractName, SecurityMembersLeaveTimeSettingPath, value, blockNumber, treeNodes, opts) } +// How long a security council proposal can be voted on (phase2) +func GetSecurityProposalVotePhase1Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { + securitySettingsContract, err := getSecuritySettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := securitySettingsContract.Call(opts, value, "getVotePhase1Time"); err != nil { + return 0, fmt.Errorf("error getting security proposal vote time: %w", err) + } + return time.Second * time.Duration((*value).Uint64()), nil +} +func ProposeSecurityProposalVotePhase1Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase1TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeSecurityProposalVotePhase1TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase1TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) +} + // How long a security council proposal can be voted on -func GetSecurityProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecurityProposalVotePhase2Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err } value := new(*big.Int) - if err := securitySettingsContract.Call(opts, value, "getVoteTime"); err != nil { + if err := securitySettingsContract.Call(opts, value, "getVotePhase2Time"); err != nil { return 0, fmt.Errorf("error getting security proposal vote time: %w", err) } return time.Second * time.Duration((*value).Uint64()), nil } -func ProposeSecurityProposalVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) +func ProposeSecurityProposalVotePhase2Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase2TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSecurityProposalVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSecurityProposalVotePhase2TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase2TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) } // How long a security council proposal can be executed after its voting period is finished From 4028cf61828d96ec88c8da99e949f793f5ad4869 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 13:45:15 -0500 Subject: [PATCH 721/878] Added GetDepthPerRound() --- dao/protocol/verify.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 573f8a519..03e98f55d 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -57,6 +57,19 @@ type challengeSubmittedRaw struct { Timestamp *big.Int `json:"timestamp"` } +// Get the depth-per-round for voting trees +func GetDepthPerRound(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := rocketDAOProtocolVerifier.Call(opts, value, "getDepthPerRound"); err != nil { + return 0, fmt.Errorf("error getting depth per round: %w", err) + } + return (*value).Uint64(), nil +} + // Get the node of a proposal at the given index func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *bind.CallOpts) (types.VotingTreeNode, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) From a9d556b9de845c0606e29d5b8ac46e8cffcdcd45 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 14:11:17 -0500 Subject: [PATCH 722/878] Fixed pDAO proposal simulation --- dao/protocol/proposal.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index b99081e34..20ae72f03 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -696,18 +696,18 @@ func ExecuteProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tr // Simulate a proposal's execution to verify it won't revert func simulateProposalExecution(rp *rocketpool.RocketPool, payload []byte) error { - rocketDAOProposal, err := getRocketDAOProposal(rp, nil) + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) if err != nil { return err } - rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return err } _, err = rp.Client.EstimateGas(context.Background(), ethereum.CallMsg{ - From: *rocketDAOProposal.Address, - To: rocketDAOProtocolProposal.Address, + From: *rocketDAOProtocolProposal.Address, + To: rocketDAOProtocolProposals.Address, GasPrice: big.NewInt(0), Value: nil, Data: payload, @@ -717,16 +717,9 @@ func simulateProposalExecution(rp *rocketpool.RocketPool, payload []byte) error // Get contracts var rocketDAOProtocolProposalLock sync.Mutex -var rocketDAOProposalLock sync.Mutex func getRocketDAOProtocolProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketDAOProtocolProposalLock.Lock() defer rocketDAOProtocolProposalLock.Unlock() return rp.GetContract("rocketDAOProtocolProposal", opts) } - -func getRocketDAOProposal(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - rocketDAOProposalLock.Lock() - defer rocketDAOProposalLock.Unlock() - return rp.GetContract("rocketDAOProposal", opts) -} From 008e4a212f4a52817566d0d6e25ff0543f7a2bf0 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 14:22:11 -0500 Subject: [PATCH 723/878] Fixed some proposal ID serialization --- dao/protocol/proposal.go | 40 ++++++++++++++++++++-------------------- utils/state/pdao.go | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 20ae72f03..09891c1c0 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -262,7 +262,7 @@ func GetProposalVetoQuorum(rp *rocketpool.RocketPool, proposalId uint64, opts *b return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalVetoQuorum", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalVetoQuorum", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting proposal veto quorum for proposal %d: %w", proposalId, err) } return *value, nil @@ -288,7 +288,7 @@ func GetProposalProposer(rp *rocketpool.RocketPool, proposalId uint64, opts *bin return common.Address{}, err } value := new(common.Address) - if err := rocketDAOProtocolProposal.Call(opts, value, "getProposer", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposer", big.NewInt(0).SetUint64(proposalId)); err != nil { return common.Address{}, fmt.Errorf("error getting proposer for proposal %d: %w", proposalId, err) } return *value, nil @@ -301,7 +301,7 @@ func GetProposalMessage(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return "", err } value := new(string) - if err := rocketDAOProtocolProposal.Call(opts, value, "getMessage", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getMessage", big.NewInt(0).SetUint64(proposalId)); err != nil { return "", fmt.Errorf("error getting message for proposal %d: %w", proposalId, err) } return *value, nil @@ -314,7 +314,7 @@ func GetProposalVotingStartTime(rp *rocketpool.RocketPool, proposalId uint64, op return time.Time{}, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getStart", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getStart", big.NewInt(0).SetUint64(proposalId)); err != nil { return time.Time{}, fmt.Errorf("error getting start block for proposal %d: %w", proposalId, err) } return time.Unix((*value).Int64(), 0), nil @@ -327,7 +327,7 @@ func GetProposalPhase1EndTime(rp *rocketpool.RocketPool, proposalId uint64, opts return time.Time{}, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase1End", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase1End", big.NewInt(0).SetUint64(proposalId)); err != nil { return time.Time{}, fmt.Errorf("error getting phase 1 end time for proposal %d: %w", proposalId, err) } return time.Unix((*value).Int64(), 0), nil @@ -340,7 +340,7 @@ func GetProposalPhase2EndTime(rp *rocketpool.RocketPool, proposalId uint64, opts return time.Time{}, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase2End", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getPhase2End", big.NewInt(0).SetUint64(proposalId)); err != nil { return time.Time{}, fmt.Errorf("error getting phase 2 end time for proposal %d: %w", proposalId, err) } return time.Unix((*value).Int64(), 0), nil @@ -353,7 +353,7 @@ func GetProposalExpiryTime(rp *rocketpool.RocketPool, proposalId uint64, opts *b return time.Time{}, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getExpires", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getExpires", big.NewInt(0).SetUint64(proposalId)); err != nil { return time.Time{}, fmt.Errorf("error getting expiry time for proposal %d: %w", proposalId, err) } return time.Unix((*value).Int64(), 0), nil @@ -366,7 +366,7 @@ func GetProposalCreationTime(rp *rocketpool.RocketPool, proposalId uint64, opts return time.Time{}, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getCreated", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getCreated", big.NewInt(0).SetUint64(proposalId)); err != nil { return time.Time{}, fmt.Errorf("error getting creation time for proposal %d: %w", proposalId, err) } return time.Unix((*value).Int64(), 0), nil @@ -379,7 +379,7 @@ func GetProposalVotingPowerFor(rp *rocketpool.RocketPool, proposalId uint64, opt return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesFor", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesFor", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'for' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -392,7 +392,7 @@ func GetProposalVotingPowerAgainst(rp *rocketpool.RocketPool, proposalId uint64, return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAgainst", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAgainst", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'against' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -405,7 +405,7 @@ func GetProposalVotingPowerVetoed(rp *rocketpool.RocketPool, proposalId uint64, return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesVeto", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesVeto", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'veto' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -418,7 +418,7 @@ func GetProposalVotingPowerAbstained(rp *rocketpool.RocketPool, proposalId uint6 return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAbstained", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAbstained", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'abstained' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -431,7 +431,7 @@ func GetProposalVotingPowerRequired(rp *rocketpool.RocketPool, proposalId uint64 return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesRequired", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesRequired", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting required voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -444,7 +444,7 @@ func GetProposalIsDestroyed(rp *rocketpool.RocketPool, proposalId uint64, opts * return false, err } value := new(bool) - if err := rocketDAOProtocolProposal.Call(opts, value, "getDestroyed", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getDestroyed", big.NewInt(0).SetUint64(proposalId)); err != nil { return false, fmt.Errorf("error getting destroyed status of proposal %d: %w", proposalId, err) } return *value, nil @@ -457,7 +457,7 @@ func GetProposalIsFinalized(rp *rocketpool.RocketPool, proposalId uint64, opts * return false, err } value := new(bool) - if err := rocketDAOProtocolProposal.Call(opts, value, "getFinalised", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getFinalised", big.NewInt(0).SetUint64(proposalId)); err != nil { return false, fmt.Errorf("error getting finalized status of proposal %d: %w", proposalId, err) } return *value, nil @@ -470,7 +470,7 @@ func GetProposalIsExecuted(rp *rocketpool.RocketPool, proposalId uint64, opts *b return false, err } value := new(bool) - if err := rocketDAOProtocolProposal.Call(opts, value, "getExecuted", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getExecuted", big.NewInt(0).SetUint64(proposalId)); err != nil { return false, fmt.Errorf("error getting executed status of proposal %d: %w", proposalId, err) } return *value, nil @@ -483,7 +483,7 @@ func GetProposalIsVetoed(rp *rocketpool.RocketPool, proposalId uint64, opts *bin return false, err } value := new(bool) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVetoed", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVetoed", big.NewInt(0).SetUint64(proposalId)); err != nil { return false, fmt.Errorf("error getting veto status of proposal %d: %w", proposalId, err) } return *value, nil @@ -496,7 +496,7 @@ func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind return nil, err } value := new([]byte) - if err := rocketDAOProtocolProposal.Call(opts, value, "getPayload", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getPayload", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting payload of proposal %d: %w", proposalId, err) } return *value, nil @@ -552,7 +552,7 @@ func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C return types.ProtocolDaoProposalState_Pending, err } value := new(types.ProtocolDaoProposalState) - if err := rocketDAOProtocolProposal.Call(opts, value, "getState", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getState", big.NewInt(0).SetUint64(proposalId)); err != nil { return types.ProtocolDaoProposalState_Pending, fmt.Errorf("error getting state of proposal %d: %w", proposalId, err) } return *value, nil @@ -565,7 +565,7 @@ func GetAddressVoteDirection(rp *rocketpool.RocketPool, proposalId uint64, addre return types.VoteDirection_NoVote, err } value := new(types.VoteDirection) - if err := rocketDAOProtocolProposal.Call(opts, value, "getReceiptDirection", proposalId, address); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getReceiptDirection", big.NewInt(0).SetUint64(proposalId), address); err != nil { return types.VoteDirection_NoVote, fmt.Errorf("error getting voting status of proposal %d by address %s: %w", proposalId, address.Hex(), err) } return *value, nil diff --git a/utils/state/pdao.go b/utils/state/pdao.go index 4f91f81f9..cf76f4e47 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -144,7 +144,7 @@ func getProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, // Get the details of a proposal func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *protocolDaoProposalDetailsRaw, opts *bind.CallOpts) error { - id := details.ID + id := big.NewInt(0).SetUint64(details.ID) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.TargetBlock, "getProposalBlock", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Message, "getMessage", id) From b19303d768335fcb699fd51d958aece56499b32f Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 14:31:37 -0500 Subject: [PATCH 724/878] Renamed contract methods --- dao/protocol/proposal.go | 10 +++++----- utils/state/pdao.go | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 09891c1c0..158efd2c3 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -379,7 +379,7 @@ func GetProposalVotingPowerFor(rp *rocketpool.RocketPool, proposalId uint64, opt return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesFor", big.NewInt(0).SetUint64(proposalId)); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotingPowerFor", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'for' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -392,7 +392,7 @@ func GetProposalVotingPowerAgainst(rp *rocketpool.RocketPool, proposalId uint64, return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAgainst", big.NewInt(0).SetUint64(proposalId)); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotingPowerAgainst", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'against' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -405,7 +405,7 @@ func GetProposalVotingPowerVetoed(rp *rocketpool.RocketPool, proposalId uint64, return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesVeto", big.NewInt(0).SetUint64(proposalId)); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotingPowerVeto", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'veto' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -418,7 +418,7 @@ func GetProposalVotingPowerAbstained(rp *rocketpool.RocketPool, proposalId uint6 return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesAbstained", big.NewInt(0).SetUint64(proposalId)); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotingPowerAbstained", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting total 'abstained' voting power for proposal %d: %w", proposalId, err) } return *value, nil @@ -431,7 +431,7 @@ func GetProposalVotingPowerRequired(rp *rocketpool.RocketPool, proposalId uint64 return nil, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getVotesRequired", big.NewInt(0).SetUint64(proposalId)); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getVotingPowerRequired", big.NewInt(0).SetUint64(proposalId)); err != nil { return nil, fmt.Errorf("error getting required voting power for proposal %d: %w", proposalId, err) } return *value, nil diff --git a/utils/state/pdao.go b/utils/state/pdao.go index cf76f4e47..22d422198 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -153,11 +153,11 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Phase2EndTime, "getPhase2End", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ExpiryTime, "getExpires", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.CreatedTime, "getCreated", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerRequired, "getVotesRequired", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerFor, "getVotesFor", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAgainst, "getVotesAgainst", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAbstained, "getVotesAbstained", id) - mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerToVeto, "getVotesVeto", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerRequired, "getVotingPowerRequired", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerFor, "getVotingPowerFor", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAgainst, "getVotingPowerAgainst", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerAbstained, "getVotingPowerAbstained", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingPowerToVeto, "getVotingPowerVeto", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsDestroyed, "getDestroyed", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsFinalized, "getFinalised", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.IsExecuted, "getExecuted", id) From 62d9c87a74048dfab52532eb89ffc68bb593d67c Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 14:36:05 -0500 Subject: [PATCH 725/878] Fixed a missing ID conversion --- dao/protocol/proposal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 158efd2c3..19992aca6 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -249,7 +249,7 @@ func GetProposalBlock(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C return 0, err } value := new(*big.Int) - if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalBlock", proposalId); err != nil { + if err := rocketDAOProtocolProposal.Call(opts, value, "getProposalBlock", big.NewInt(0).SetUint64(proposalId)); err != nil { return 0, fmt.Errorf("error getting proposal block for proposal %d: %w", proposalId, err) } return uint32((*value).Uint64()), nil From 0f3044002d330412a8b9728970f629e65a23bf22 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 14:43:19 -0500 Subject: [PATCH 726/878] Fixed more type conversions --- dao/protocol/proposal.go | 8 ++++---- utils/state/pdao.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 19992aca6..cea1f13b3 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -551,11 +551,11 @@ func GetProposalState(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.C if err != nil { return types.ProtocolDaoProposalState_Pending, err } - value := new(types.ProtocolDaoProposalState) + value := new(uint8) if err := rocketDAOProtocolProposal.Call(opts, value, "getState", big.NewInt(0).SetUint64(proposalId)); err != nil { return types.ProtocolDaoProposalState_Pending, fmt.Errorf("error getting state of proposal %d: %w", proposalId, err) } - return *value, nil + return types.ProtocolDaoProposalState(*value), nil } // Get the option that the address voted on for the proposal, and whether or not it's voted yet @@ -564,11 +564,11 @@ func GetAddressVoteDirection(rp *rocketpool.RocketPool, proposalId uint64, addre if err != nil { return types.VoteDirection_NoVote, err } - value := new(types.VoteDirection) + value := new(uint8) if err := rocketDAOProtocolProposal.Call(opts, value, "getReceiptDirection", big.NewInt(0).SetUint64(proposalId), address); err != nil { return types.VoteDirection_NoVote, fmt.Errorf("error getting voting status of proposal %d by address %s: %w", proposalId, address.Hex(), err) } - return *value, nil + return types.VoteDirection(*value), nil } // ==================== diff --git a/utils/state/pdao.go b/utils/state/pdao.go index 22d422198..202a9e020 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -42,7 +42,7 @@ type protocolDaoProposalDetailsRaw struct { VetoQuorum *big.Int Payload []byte PayloadStr string - State types.ProtocolDaoProposalState + State uint8 ProposalBond *big.Int ChallengeBond *big.Int DefeatIndex *big.Int @@ -194,7 +194,7 @@ func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDao details.IsVetoed = rawDetails.IsVetoed details.VetoQuorum = rawDetails.VetoQuorum details.Payload = rawDetails.Payload - details.State = rawDetails.State + details.State = types.ProtocolDaoProposalState(rawDetails.State) details.DefeatIndex = rawDetails.DefeatIndex.Uint64() details.ProposalBond = rawDetails.ProposalBond details.ChallengeBond = rawDetails.ChallengeBond From 6f0632d827cbf69fea7f7a95dfd94f5deb556858 Mon Sep 17 00:00:00 2001 From: fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 20 Dec 2023 17:25:25 -0300 Subject: [PATCH 727/878] Fix vote time for security council --- settings/protocol/security.go | 42 +++++++++-------------------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/settings/protocol/security.go b/settings/protocol/security.go index 40c897ac0..3aa260cd0 100644 --- a/settings/protocol/security.go +++ b/settings/protocol/security.go @@ -15,13 +15,12 @@ import ( // Config const ( - SecuritySettingsContractName string = "rocketDAOProtocolSettingsSecurity" - SecurityMembersQuorumSettingPath string = "members.quorum" - SecurityMembersLeaveTimeSettingPath string = "members.leave.time" - SecurityProposalVotePhase1TimeSettingPath string = "proposal.vote.phase1.time" - SecurityProposalVotePhase2TimeSettingPath string = "proposal.vote.phase2.time" - SecurityProposalExecuteTimeSettingPath string = "proposal.execute.time" - SecurityProposalActionTimeSettingPath string = "proposal.action.time" + SecuritySettingsContractName string = "rocketDAOProtocolSettingsSecurity" + SecurityMembersQuorumSettingPath string = "members.quorum" + SecurityMembersLeaveTimeSettingPath string = "members.leave.time" + SecurityProposalVoteTimeSettingPath string = "proposal.vote.time" + SecurityProposalExecuteTimeSettingPath string = "proposal.execute.time" + SecurityProposalActionTimeSettingPath string = "proposal.action.time" ) // Security council member quorum threshold that must be met for proposals to pass @@ -63,7 +62,7 @@ func EstimateProposeSecurityMembersLeaveTimeGas(rp *rocketpool.RocketPool, value } // How long a security council proposal can be voted on (phase2) -func GetSecurityProposalVotePhase1Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecurityProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err @@ -74,30 +73,11 @@ func GetSecurityProposalVotePhase1Time(rp *rocketpool.RocketPool, opts *bind.Cal } return time.Second * time.Duration((*value).Uint64()), nil } -func ProposeSecurityProposalVotePhase1Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase1TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) +func ProposeSecurityProposalVoteTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeSecurityProposalVotePhase1TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase1TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) -} - -// How long a security council proposal can be voted on -func GetSecurityProposalVotePhase2Time(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { - securitySettingsContract, err := getSecuritySettingsContract(rp, opts) - if err != nil { - return 0, err - } - value := new(*big.Int) - if err := securitySettingsContract.Call(opts, value, "getVotePhase2Time"); err != nil { - return 0, fmt.Errorf("error getting security proposal vote time: %w", err) - } - return time.Second * time.Duration((*value).Uint64()), nil -} -func ProposeSecurityProposalVotePhase2Time(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase2TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) -} -func EstimateProposeSecurityProposalVotePhase2TimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVotePhase2TimeSettingPath), SecuritySettingsContractName, SecurityProposalVotePhase1TimeSettingPath, value, blockNumber, treeNodes, opts) +func EstimateProposeSecurityProposalVoteTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", SecurityProposalVoteTimeSettingPath), SecuritySettingsContractName, SecurityProposalVoteTimeSettingPath, value, blockNumber, treeNodes, opts) } // How long a security council proposal can be executed after its voting period is finished From a3a740d11c33f06fa7089efaf738537c5dfcdb4b Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 19:37:55 -0500 Subject: [PATCH 728/878] Fixed pDAO proposal ID and payload string --- dao/protocol/proposal.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index cea1f13b3..a7f5ab7a0 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -105,6 +105,7 @@ func GetProposals(rp *rocketpool.RocketPool, opts *bind.CallOpts) ([]ProtocolDao func GetProposalDetails(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.CallOpts) (ProtocolDaoProposalDetails, error) { var wg errgroup.Group var prop ProtocolDaoProposalDetails + prop.ID = proposalId // Load data wg.Go(func() error { @@ -504,13 +505,13 @@ func GetProposalPayload(rp *rocketpool.RocketPool, proposalId uint64, opts *bind // Get a proposal's payload as a human-readable string func GetProposalPayloadString(rp *rocketpool.RocketPool, payload []byte, opts *bind.CallOpts) (string, error) { - rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + rocketDAOProtocolProposals, err := getRocketDAOProtocolProposals(rp, nil) if err != nil { return "", err } // Get proposal DAO contract ABI - daoContractAbi := rocketDAOProtocolProposal.ABI + daoContractAbi := rocketDAOProtocolProposals.ABI // Get proposal payload method method, err := daoContractAbi.MethodById(payload) From 51a197f389b3051c231f4593f5ff5cf2a2790ba5 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:37:12 -0300 Subject: [PATCH 729/878] Fix cannot unmarshal uint8 in to types.ChallengeState --- dao/protocol/verify.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 03e98f55d..b37cdeb0a 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -133,11 +133,12 @@ func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint6 if err != nil { return types.ChallengeState_Unchallenged, err } - state := new(types.ChallengeState) + state := uint8(0) if err := rocketDAOProtocolVerifier.Call(opts, state, "getChallengeState", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { return types.ChallengeState_Unchallenged, fmt.Errorf("error getting proposal %d / index %d challenge state: %w", proposalId, index, err) } - return *state, nil + challengeState := types.ChallengeState(state) + return challengeState, nil } // Get the defeat index for a proposal From f08eb600cea8eeea523555e95318b39de20119ec Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 22:16:07 -0500 Subject: [PATCH 730/878] Added raw getters to pDAO settings --- settings/protocol/auction.go | 26 ++++++++++ settings/protocol/inflation.go | 13 +++++ settings/protocol/network.go | 91 ++++++++++++++++++++++++++++++++++ settings/protocol/proposals.go | 26 ++++++++++ settings/protocol/security.go | 2 +- 5 files changed, 157 insertions(+), 1 deletion(-) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index f01bdc7df..2c9c3b895 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -133,6 +133,19 @@ func GetLotStartingPriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } + +// The starting price relative to current ETH price, as a fraction +func GetLotStartingPriceRatioRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getStartingPriceRatio"); err != nil { + return nil, fmt.Errorf("error getting lot starting price ratio: %w", err) + } + return *value, nil +} func ProposeLotStartingPriceRatio(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotStartingPriceRatioSettingPath), AuctionSettingsContractName, LotStartingPriceRatioSettingPath, value, blockNumber, treeNodes, opts) } @@ -152,6 +165,19 @@ func GetLotReservePriceRatio(rp *rocketpool.RocketPool, opts *bind.CallOpts) (fl } return eth.WeiToEth(*value), nil } + +// The reserve price relative to current ETH price, as a fraction +func GetLotReservePriceRatioRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := auctionSettingsContract.Call(opts, value, "getReservePriceRatio"); err != nil { + return nil, fmt.Errorf("error getting lot reserve price ratio: %w", err) + } + return *value, nil +} func ProposeLotReservePriceRatio(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotReservePriceRatioSettingPath), AuctionSettingsContractName, LotReservePriceRatioSettingPath, value, blockNumber, treeNodes, opts) } diff --git a/settings/protocol/inflation.go b/settings/protocol/inflation.go index 64967f77b..eb4dfb5ac 100644 --- a/settings/protocol/inflation.go +++ b/settings/protocol/inflation.go @@ -29,6 +29,19 @@ func GetInflationIntervalRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f return eth.WeiToEth(*value), nil } +// RPL inflation rate per interval +func GetInflationIntervalRateRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + inflationSettingsContract, err := getInflationSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := inflationSettingsContract.Call(opts, value, "getInflationIntervalRate"); err != nil { + return nil, fmt.Errorf("error getting inflation rate: %w", err) + } + return *value, nil +} + // RPL inflation start time func GetInflationStartTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { inflationSettingsContract, err := getInflationSettingsContract(rp, opts) diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 63fc1079a..1baebf614 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -45,6 +45,19 @@ func GetNodeConsensusThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) ( } return eth.WeiToEth(*value), nil } + +// The threshold of trusted nodes that must reach consensus on oracle data to commit it +func GetNodeConsensusThresholdRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getNodeConsensusThreshold"); err != nil { + return nil, fmt.Errorf("error getting trusted node consensus threshold: %w", err) + } + return *value, nil +} func ProposeNodeConsensusThreshold(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NodeConsensusThresholdSettingPath), NetworkSettingsContractName, NodeConsensusThresholdSettingPath, value, blockNumber, treeNodes, opts) } @@ -140,6 +153,19 @@ func GetMinimumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } + +// Minimum node commission rate +func GetMinimumNodeFeeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getMinimumNodeFee"); err != nil { + return nil, fmt.Errorf("error getting minimum node fee: %w", err) + } + return *value, nil +} func ProposeMinimumNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumNodeFeeSettingPath), NetworkSettingsContractName, MinimumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } @@ -159,6 +185,19 @@ func GetTargetNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } + +// Target node commission rate +func GetTargetNodeFeeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getTargetNodeFee"); err != nil { + return nil, fmt.Errorf("error getting target node fee: %w", err) + } + return *value, nil +} func ProposeTargetNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetNodeFeeSettingPath), NetworkSettingsContractName, TargetNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } @@ -178,6 +217,19 @@ func GetMaximumNodeFee(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } + +// Maximum node commission rate +func GetMaximumNodeFeeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getMaximumNodeFee"); err != nil { + return nil, fmt.Errorf("error getting maximum node fee: %w", err) + } + return *value, nil +} func ProposeMaximumNodeFee(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumNodeFeeSettingPath), NetworkSettingsContractName, MaximumNodeFeeSettingPath, value, blockNumber, treeNodes, opts) } @@ -216,6 +268,19 @@ func GetTargetRethCollateralRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The target collateralization rate for the rETH contract as a fraction +func GetTargetRethCollateralRateRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getTargetRethCollateralRate"); err != nil { + return nil, fmt.Errorf("error getting target rETH contract collateralization rate: %w", err) + } + return *value, nil +} func ProposeTargetRethCollateralRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", TargetRethCollateralRateSettingPath), NetworkSettingsContractName, TargetRethCollateralRateSettingPath, value, blockNumber, treeNodes, opts) } @@ -235,6 +300,19 @@ func GetNetworkPenaltyThreshold(rp *rocketpool.RocketPool, opts *bind.CallOpts) } return eth.WeiToEth(*value), nil } + +// The number of oDAO members that have to vote for a penalty expressed as a percentage +func GetNetworkPenaltyThresholdRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getNodePenaltyThreshold"); err != nil { + return nil, fmt.Errorf("error getting network penalty threshold: %w", err) + } + return *value, nil +} func ProposeNetworkPenaltyThreshold(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyThresholdSettingPath), NetworkSettingsContractName, NetworkPenaltyThresholdSettingPath, value, blockNumber, treeNodes, opts) } @@ -254,6 +332,19 @@ func GetNetworkPenaltyPerRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (f } return eth.WeiToEth(*value), nil } + +// The amount a node operator is penalised for each penalty as a percentage +func GetNetworkPenaltyPerRateRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + networkSettingsContract, err := getNetworkSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := networkSettingsContract.Call(opts, value, "getPerPenaltyRate"); err != nil { + return nil, fmt.Errorf("error getting network penalty per rate: %w", err) + } + return *value, nil +} func ProposeNetworkPenaltyPerRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", NetworkPenaltyPerRateSettingPath), NetworkSettingsContractName, NetworkPenaltyPerRateSettingPath, value, blockNumber, treeNodes, opts) } diff --git a/settings/protocol/proposals.go b/settings/protocol/proposals.go index 88a1e184b..3b3eaa135 100644 --- a/settings/protocol/proposals.go +++ b/settings/protocol/proposals.go @@ -174,6 +174,19 @@ func GetProposalQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, } return eth.WeiToEth(*value), nil } + +// The minimum amount of voting power a proposal needs to succeed +func GetProposalQuorumRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalQuorum"); err != nil { + return nil, fmt.Errorf("error getting proposal quorum: %w", err) + } + return *value, nil +} func ProposeProposalQuorum(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalQuorumSettingPath), ProposalsSettingsContractName, ProposalQuorumSettingPath, value, blockNumber, treeNodes, opts) } @@ -193,6 +206,19 @@ func GetProposalVetoQuorum(rp *rocketpool.RocketPool, opts *bind.CallOpts) (floa } return eth.WeiToEth(*value), nil } + +// The amount of voting power vetoing a proposal require to veto it +func GetProposalVetoQuorumRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + proposalsSettingsContract, err := getProposalsSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := proposalsSettingsContract.Call(opts, value, "getProposalVetoQuorum"); err != nil { + return nil, fmt.Errorf("error getting proposal veto quorum: %w", err) + } + return *value, nil +} func ProposeProposalVetoQuorum(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ProposalVetoQuorumSettingPath), ProposalsSettingsContractName, ProposalVetoQuorumSettingPath, value, blockNumber, treeNodes, opts) } diff --git a/settings/protocol/security.go b/settings/protocol/security.go index 3aa260cd0..95990f78c 100644 --- a/settings/protocol/security.go +++ b/settings/protocol/security.go @@ -81,7 +81,7 @@ func EstimateProposeSecurityProposalVoteTimeGas(rp *rocketpool.RocketPool, value } // How long a security council proposal can be executed after its voting period is finished -func GetSecuritProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { +func GetSecurityProposalExecuteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { securitySettingsContract, err := getSecuritySettingsContract(rp, opts) if err != nil { return 0, err From 565fff0b057077ac4b734a6d904e9e64c66b758c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 21 Dec 2023 00:23:08 -0300 Subject: [PATCH 731/878] Fix uint8 pointer --- dao/protocol/verify.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index b37cdeb0a..2485c369a 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -133,11 +133,11 @@ func GetChallengeState(rp *rocketpool.RocketPool, proposalId uint64, index uint6 if err != nil { return types.ChallengeState_Unchallenged, err } - state := uint8(0) + state := new(uint8) if err := rocketDAOProtocolVerifier.Call(opts, state, "getChallengeState", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { return types.ChallengeState_Unchallenged, fmt.Errorf("error getting proposal %d / index %d challenge state: %w", proposalId, index, err) } - challengeState := types.ChallengeState(state) + challengeState := types.ChallengeState(*state) return challengeState, nil } From 9fedcb2b71f16343aac16287226d976a5331e313 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Wed, 20 Dec 2023 22:29:41 -0500 Subject: [PATCH 732/878] Fixed a contract method name --- settings/protocol/security.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/protocol/security.go b/settings/protocol/security.go index 95990f78c..16c277d12 100644 --- a/settings/protocol/security.go +++ b/settings/protocol/security.go @@ -68,7 +68,7 @@ func GetSecurityProposalVoteTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) return 0, err } value := new(*big.Int) - if err := securitySettingsContract.Call(opts, value, "getVotePhase1Time"); err != nil { + if err := securitySettingsContract.Call(opts, value, "getVoteTime"); err != nil { return 0, fmt.Errorf("error getting security proposal vote time: %w", err) } return time.Second * time.Duration((*value).Uint64()), nil From 066487cad9c9a7daf70dbcb6c8fa754653325b92 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:29:06 -0300 Subject: [PATCH 733/878] Fix error to unmarshal struct --- dao/protocol/verify.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 2485c369a..3880b18af 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -76,10 +76,13 @@ func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *b if err != nil { return types.VotingTreeNode{}, err } - node := new(types.VotingTreeNode) - if err := rocketDAOProtocolVerifier.Call(opts, node, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { + var out interface{} + if err := rocketDAOProtocolVerifier.Call(opts, &out, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { return types.VotingTreeNode{}, fmt.Errorf("error getting proposal %d / index %d node: %w", proposalId, index, err) } + node := new(types.VotingTreeNode) + + node = out.(*types.VotingTreeNode) return *node, nil } From b2edff22c204135757e21e1dedd269d3fe29a4dc Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:48:24 -0300 Subject: [PATCH 734/878] Using json --- dao/protocol/verify.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 3880b18af..a49bf9f7f 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -1,6 +1,7 @@ package protocol import ( + "encoding/json" "fmt" "math/big" "sync" @@ -80,9 +81,13 @@ func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *b if err := rocketDAOProtocolVerifier.Call(opts, &out, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { return types.VotingTreeNode{}, fmt.Errorf("error getting proposal %d / index %d node: %w", proposalId, index, err) } + serializedOut, err := json.Marshal(out) + if err != nil { + return types.VotingTreeNode{}, err + } node := new(types.VotingTreeNode) - node = out.(*types.VotingTreeNode) + json.Unmarshal(serializedOut, node) return *node, nil } From fff94c2e109aa28cfd6c212cc2ff72c58af37f7b Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Fri, 22 Dec 2023 23:27:01 -0300 Subject: [PATCH 735/878] debugging --- dao/protocol/verify.go | 12 ++---------- types/dao.go | 4 ++-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index a49bf9f7f..2485c369a 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -1,7 +1,6 @@ package protocol import ( - "encoding/json" "fmt" "math/big" "sync" @@ -77,17 +76,10 @@ func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *b if err != nil { return types.VotingTreeNode{}, err } - var out interface{} - if err := rocketDAOProtocolVerifier.Call(opts, &out, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { + node := new(types.VotingTreeNode) + if err := rocketDAOProtocolVerifier.Call(opts, node, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { return types.VotingTreeNode{}, fmt.Errorf("error getting proposal %d / index %d node: %w", proposalId, index, err) } - serializedOut, err := json.Marshal(out) - if err != nil { - return types.VotingTreeNode{}, err - } - node := new(types.VotingTreeNode) - - json.Unmarshal(serializedOut, node) return *node, nil } diff --git a/types/dao.go b/types/dao.go index e3fce1b11..0d387ff6b 100644 --- a/types/dao.go +++ b/types/dao.go @@ -82,8 +82,8 @@ type NodeVotingInfo struct { // A node of the voting Merkle Tree (not a Rocket Pool node) type VotingTreeNode struct { - Sum *big.Int `abi:"sum" json:"sum"` - Hash common.Hash `abi:"hash" json:"hash"` + Sum *big.Int `json:"sum"` + Hash common.Hash `json:"hash"` } // String conversion From a887977205c60fce3dea6ebf7342267d41f5f1b8 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Fri, 22 Dec 2023 23:40:40 -0300 Subject: [PATCH 736/878] . --- rocketpool/contract.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rocketpool/contract.go b/rocketpool/contract.go index 598ed4140..cfd3318ba 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -45,6 +45,12 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, return c.Contract.Call(opts, &results, method, params...) } +// Call a contract method +func (c *Contract) Call2(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + var results []interface{} + return c.Contract.Call(opts, &results, method, params...) +} + // Get Gas Limit for transaction func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, params ...interface{}) (GasInfo, error) { From 4a2c78d49c089e314a344421a13886d5c0f47fb9 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:56:46 -0300 Subject: [PATCH 737/878] Fix: geth was failing to populate the Hash field --- dao/protocol/verify.go | 17 ++++++++++++++--- rocketpool/contract.go | 6 ------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 2485c369a..d2a889b4c 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -76,11 +76,22 @@ func GetNode(rp *rocketpool.RocketPool, proposalId uint64, index uint64, opts *b if err != nil { return types.VotingTreeNode{}, err } - node := new(types.VotingTreeNode) - if err := rocketDAOProtocolVerifier.Call(opts, node, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))); err != nil { + // define a struct to unmarshall the VotingTreeNode data from the smart contract call + res := new(struct { + Sum *big.Int `json:"sum"` + Hash [32]byte `json:"hash"` + }) + err = rocketDAOProtocolVerifier.Call(opts, &res, "getNode", big.NewInt(int64(proposalId)), big.NewInt(int64(index))) + if err != nil { return types.VotingTreeNode{}, fmt.Errorf("error getting proposal %d / index %d node: %w", proposalId, index, err) } - return *node, nil + // convert the [32]byte field into a common.Hash + node := types.VotingTreeNode{ + Sum: res.Sum, + Hash: common.BytesToHash(res.Hash[:]), + } + + return node, nil } // Estimate the gas of CreateChallenge diff --git a/rocketpool/contract.go b/rocketpool/contract.go index cfd3318ba..598ed4140 100644 --- a/rocketpool/contract.go +++ b/rocketpool/contract.go @@ -45,12 +45,6 @@ func (c *Contract) Call(opts *bind.CallOpts, result interface{}, method string, return c.Contract.Call(opts, &results, method, params...) } -// Call a contract method -func (c *Contract) Call2(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - var results []interface{} - return c.Contract.Call(opts, &results, method, params...) -} - // Get Gas Limit for transaction func (c *Contract) GetTransactionGasInfo(opts *bind.TransactOpts, method string, params ...interface{}) (GasInfo, error) { From 422aff23f988ccf8040c8d59db21e148b16563f6 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 28 Jan 2024 13:34:21 -0500 Subject: [PATCH 738/878] Fixed event collection for the verifier --- dao/protocol/verify.go | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index d2a889b4c..a28195ca8 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -32,8 +32,6 @@ type RootSubmitted struct { // Internal struct - returned by the RootSubmitted event type rootSubmittedRaw struct { - ProposalID *big.Int `json:"proposalId"` - Proposer common.Address `json:"proposer"` BlockNumber uint32 `json:"blockNumber"` Index *big.Int `json:"index"` Root types.VotingTreeNode `json:"root"` @@ -51,10 +49,8 @@ type ChallengeSubmitted struct { // Internal struct - returned by the ChallengeSubmitted event type challengeSubmittedRaw struct { - ProposalID *big.Int `json:"proposalId"` - Challenger common.Address `json:"challenger"` - Index *big.Int `json:"index"` - Timestamp *big.Int `json:"timestamp"` + Index *big.Int `json:"index"` + Timestamp *big.Int `json:"timestamp"` } // Get the depth-per-round for voting trees @@ -269,7 +265,7 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int idBuffers := make([]common.Hash, len(proposalIDs)) for i, id := range proposalIDs { proposalIdBig := big.NewInt(0).SetUint64(id) - proposalIdBig.FillBytes(idBuffers[i].Bytes()) + proposalIdBig.FillBytes(idBuffers[i][:]) } rootSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["RootSubmitted"] addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} @@ -292,6 +288,15 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int return nil, fmt.Errorf("error unpacking RootSubmitted event data: %w", err) } + // Get the topic values + if len(log.Topics) < 3 { + return nil, fmt.Errorf("event had %d topics but at least 3 are required", len(log.Topics)) + } + idHash := log.Topics[1] + proposerHash := log.Topics[2] + propID := big.NewInt(0).SetBytes(idHash.Bytes()) + proposer := common.BytesToAddress(proposerHash.Bytes()) + // Convert to a native struct var raw rootSubmittedRaw err = rootSubmittedEvent.Inputs.Copy(&raw, values) @@ -301,8 +306,8 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int // Get the decoded data events = append(events, RootSubmitted{ - ProposalID: raw.ProposalID, - Proposer: raw.Proposer, + ProposalID: propID, + Proposer: proposer, BlockNumber: raw.BlockNumber, Index: raw.Index, Root: raw.Root, @@ -326,7 +331,7 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64 idBuffers := make([]common.Hash, len(proposalIDs)) for i, id := range proposalIDs { proposalIdBig := big.NewInt(0).SetUint64(id) - proposalIdBig.FillBytes(idBuffers[i].Bytes()) + proposalIdBig.FillBytes(idBuffers[i][:]) } challengeSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["ChallengeSubmitted"] addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} @@ -349,6 +354,15 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64 return nil, fmt.Errorf("error unpacking ChallengeSubmitted event data: %w", err) } + // Get the topic values + if len(log.Topics) < 3 { + return nil, fmt.Errorf("event had %d topics but at least 3 are required", len(log.Topics)) + } + idHash := log.Topics[1] + challengerHash := log.Topics[2] + propID := big.NewInt(0).SetBytes(idHash.Bytes()) + challenger := common.BytesToAddress(challengerHash.Bytes()) + // Convert to a native struct var raw challengeSubmittedRaw err = challengeSubmittedEvent.Inputs.Copy(&raw, values) @@ -358,8 +372,8 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64 // Get the decoded data events = append(events, ChallengeSubmitted{ - ProposalID: raw.ProposalID, - Challenger: raw.Challenger, + ProposalID: propID, + Challenger: challenger, Index: raw.Index, Timestamp: time.Unix(raw.Timestamp.Int64(), 0), }) From 196876413e260b680e39e199bd945c8aae55dd00 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 28 Jan 2024 21:29:07 -0500 Subject: [PATCH 739/878] GetMultiChallengeStatesFast now gets the latest block number if opts is nil --- dao/protocol/verify.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index a28195ca8..dfe5c356e 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -1,6 +1,7 @@ package protocol import ( + "context" "fmt" "math/big" "sync" @@ -208,6 +209,17 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com return nil, err } + if opts == nil { + // Get the latest block + blockNum, err := rp.Client.BlockNumber(context.Background()) + if err != nil { + return nil, fmt.Errorf("error getting latest block number: %w", err) + } + opts = &bind.CallOpts{ + BlockNumber: big.NewInt(int64(blockNum)), + } + } + count := uint64(len(proposalIds)) if count != uint64(len(challengedIndices)) { return nil, fmt.Errorf("have %d proposal IDs but %d challenge indices", count, len(challengedIndices)) From 40bfb7e0b15e20d36ee24c286f0695f3c898fb82 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Sun, 28 Jan 2024 21:34:54 -0500 Subject: [PATCH 740/878] Fixed an unmarshal cast --- dao/protocol/verify.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index dfe5c356e..0fdfb9082 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -202,7 +202,7 @@ func GetChallengePeriod(rp *rocketpool.RocketPool, proposalId uint64, opts *bind } // Get the states of multiple challenges using multicall -// NOTE: wen v2.,, +// NOTE: wen v2... func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress common.Address, proposalIds []uint64, challengedIndices []uint64, opts *bind.CallOpts) ([]types.ChallengeState, error) { rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -229,7 +229,7 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com var wg errgroup.Group // Run the getters in batches - states := make([]types.ChallengeState, count) + rawStates := make([]uint8, count) for i := uint64(0); i < count; i += challengeStateBatchSize { i := i max := i + challengeStateBatchSize @@ -247,7 +247,7 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com for j := i; j < max; j++ { propID := big.NewInt(int64(proposalIds[j])) challengedIndex := big.NewInt(int64(challengedIndices[j])) - mc.AddCall(rocketDAOProtocolVerifier, &states[j], "getChallengeState", propID, challengedIndex) + mc.AddCall(rocketDAOProtocolVerifier, &rawStates[j], "getChallengeState", propID, challengedIndex) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -262,6 +262,11 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com return nil, err } + // Cast the results + states := make([]types.ChallengeState, count) + for i, state := range rawStates { + states[i] = types.ChallengeState(state) + } return states, nil } From 7c2c01aaead73419d6e32f22f6369f8e96570baa Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:58:20 -0300 Subject: [PATCH 741/878] Fix to search old verifier contract addresses --- dao/protocol/verify.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index 0fdfb9082..c53230f57 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -271,7 +271,7 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com } // Get RootSubmitted event info -func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]RootSubmitted, error) { +func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, previousVerifierAddresses []common.Address, opts *bind.CallOpts) ([]RootSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -285,7 +285,7 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int proposalIdBig.FillBytes(idBuffers[i][:]) } rootSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["RootSubmitted"] - addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} + addressFilter := append(previousVerifierAddresses, *rocketDAOProtocolVerifier.Address) topicFilter := [][]common.Hash{{rootSubmittedEvent.ID}, idBuffers} // Get the event logs From 41fd71b18973919411add49769cfc46004acaa8c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 5 Feb 2024 22:07:22 -0300 Subject: [PATCH 742/878] Add verifierAddresses check for the current address --- dao/protocol/verify.go | 44 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/dao/protocol/verify.go b/dao/protocol/verify.go index c53230f57..a00962e75 100755 --- a/dao/protocol/verify.go +++ b/dao/protocol/verify.go @@ -271,7 +271,7 @@ func GetMultiChallengeStatesFast(rp *rocketpool.RocketPool, multicallAddress com } // Get RootSubmitted event info -func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, previousVerifierAddresses []common.Address, opts *bind.CallOpts) ([]RootSubmitted, error) { +func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, verifierAddresses []common.Address, opts *bind.CallOpts) ([]RootSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -284,8 +284,26 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int proposalIdBig := big.NewInt(0).SetUint64(id) proposalIdBig.FillBytes(idBuffers[i][:]) } + + // Create the list of addresses to check + currentAddress := *rocketDAOProtocolVerifier.Address + if verifierAddresses == nil { + verifierAddresses = []common.Address{currentAddress} + } else { + found := false + for _, address := range verifierAddresses { + if address == currentAddress { + found = true + break + } + } + if !found { + verifierAddresses = append(verifierAddresses, currentAddress) + } + } + rootSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["RootSubmitted"] - addressFilter := append(previousVerifierAddresses, *rocketDAOProtocolVerifier.Address) + addressFilter := verifierAddresses topicFilter := [][]common.Hash{{rootSubmittedEvent.ID}, idBuffers} // Get the event logs @@ -337,7 +355,7 @@ func GetRootSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, int } // Get ChallengeSubmitted event info -func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, opts *bind.CallOpts) ([]ChallengeSubmitted, error) { +func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64, intervalSize *big.Int, startBlock *big.Int, endBlock *big.Int, verifierAddresses []common.Address, opts *bind.CallOpts) ([]ChallengeSubmitted, error) { // Get the contract rocketDAOProtocolVerifier, err := getRocketDAOProtocolVerifier(rp, opts) if err != nil { @@ -350,8 +368,26 @@ func GetChallengeSubmittedEvents(rp *rocketpool.RocketPool, proposalIDs []uint64 proposalIdBig := big.NewInt(0).SetUint64(id) proposalIdBig.FillBytes(idBuffers[i][:]) } + + // Create the list of addresses to check + currentAddress := *rocketDAOProtocolVerifier.Address + if verifierAddresses == nil { + verifierAddresses = []common.Address{currentAddress} + } else { + found := false + for _, address := range verifierAddresses { + if address == currentAddress { + found = true + break + } + } + if !found { + verifierAddresses = append(verifierAddresses, currentAddress) + } + } + challengeSubmittedEvent := rocketDAOProtocolVerifier.ABI.Events["ChallengeSubmitted"] - addressFilter := []common.Address{*rocketDAOProtocolVerifier.Address} + addressFilter := verifierAddresses topicFilter := [][]common.Hash{{challengeSubmittedEvent.ID}, idBuffers} // Get the event logs From b1399555918c887027f3098085c484bbfafcc0a0 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:39:54 -0300 Subject: [PATCH 743/878] Fix use big.Int instead of uint64 --- dao/protocol/proposals.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dao/protocol/proposals.go b/dao/protocol/proposals.go index db614f88c..38b564c3c 100644 --- a/dao/protocol/proposals.go +++ b/dao/protocol/proposals.go @@ -183,7 +183,7 @@ func EstimateProposeRecurringTreasurySpendGas(rp *rocketpool.RocketPool, message if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), numberOfPeriods) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), big.NewInt(int64(numberOfPeriods))) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) } @@ -196,7 +196,7 @@ func ProposeRecurringTreasurySpend(rp *rocketpool.RocketPool, message string, co if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), numberOfPeriods) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryNewContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(startTime.Unix()), big.NewInt(int64(numberOfPeriods))) if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryNewContract payload: %w", err) } @@ -209,7 +209,7 @@ func EstimateProposeRecurringTreasurySpendUpdateGas(rp *rocketpool.RocketPool, m if err != nil { return rocketpool.GasInfo{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), numberOfPeriods) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(int64(numberOfPeriods))) if err != nil { return rocketpool.GasInfo{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) } @@ -222,7 +222,7 @@ func ProposeRecurringTreasurySpendUpdate(rp *rocketpool.RocketPool, message stri if err != nil { return 0, common.Hash{}, err } - payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), numberOfPeriods) + payload, err := rocketDAOProtocolProposals.ABI.Pack("proposalTreasuryUpdateContract", contractName, recipient, amountPerPeriod, big.NewInt(int64(periodLength.Seconds())), big.NewInt(int64(numberOfPeriods))) if err != nil { return 0, common.Hash{}, fmt.Errorf("error encoding proposalTreasuryUpdateContract payload: %w", err) } From d9b02e245011e19429e77af09131b0121783d6dd Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 12 Feb 2024 01:17:02 -0300 Subject: [PATCH 744/878] Fix RplRewardsPercentages ABI --- settings/protocol/rewards.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index dcabb3a83..c0adb2151 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -23,9 +23,9 @@ const ( // Rewards claimer percents type RplRewardsPercentages struct { - OdaoPercentage *big.Int `abi:"_trustedNodePercent"` - PdaoPercentage *big.Int `abi:"_protocolPercent"` - NodePercentage *big.Int `abi:"_nodePercent"` + OdaoPercentage *big.Int `abi:"trustedNodePercent"` + PdaoPercentage *big.Int `abi:"protocolPercent"` + NodePercentage *big.Int `abi:"nodePercent"` } // The RPL rewards percentages for the Oracle DAO, Protocol DAO, and node operators From 8a8fe35895046158a40b61e3d9c7b44346f29f14 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 12 Feb 2024 01:59:55 -0300 Subject: [PATCH 745/878] Fix RplRewardsPercentages abi --- settings/protocol/rewards.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index c0adb2151..fc97bec6e 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -23,9 +23,9 @@ const ( // Rewards claimer percents type RplRewardsPercentages struct { - OdaoPercentage *big.Int `abi:"trustedNodePercent"` - PdaoPercentage *big.Int `abi:"protocolPercent"` - NodePercentage *big.Int `abi:"nodePercent"` + OdaoPercentage *big.Int `abi:"trustedNodePerc"` + PdaoPercentage *big.Int `abi:"protocolPerc"` + NodePercentage *big.Int `abi:"nodePerc"` } // The RPL rewards percentages for the Oracle DAO, Protocol DAO, and node operators From 4ae8993aad7292dc01ff40bda4fa00c68f240378 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 15 Feb 2024 00:46:28 -0300 Subject: [PATCH 746/878] Update the claims periods setting path --- settings/protocol/rewards.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index fc97bec6e..00d67df7e 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -17,8 +17,8 @@ import ( // Config const ( - RewardsSettingsContractName string = "rocketDAOProtocolSettingsRewards" - RewardsClaimIntervalTimeSettingPath string = "rpl.rewards.claim.period.time" + RewardsSettingsContractName string = "rocketDAOProtocolSettingsRewards" + RewardsClaimIntervalPeriodsSettingPath string = "dao.protocol.rewards.claimsperiods" ) // Rewards claimer percents @@ -119,10 +119,10 @@ func GetRewardsClaimIntervalTime(rp *rocketpool.RocketPool, opts *bind.CallOpts) return time.Duration((*value).Uint64()) * time.Second, nil } func ProposeRewardsClaimIntervalTime(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, value, blockNumber, treeNodes, opts) + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", RewardsClaimIntervalPeriodsSettingPath), RewardsSettingsContractName, RewardsClaimIntervalPeriodsSettingPath, value, blockNumber, treeNodes, opts) } func EstimateProposeRewardsClaimIntervalTimeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RewardsClaimIntervalTimeSettingPath), RewardsSettingsContractName, RewardsClaimIntervalTimeSettingPath, value, blockNumber, treeNodes, opts) + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", RewardsClaimIntervalPeriodsSettingPath), RewardsSettingsContractName, RewardsClaimIntervalPeriodsSettingPath, value, blockNumber, treeNodes, opts) } // Get contracts From 1b8a09def1ba382e8ca3db6d55bf4d2604a778a2 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 15 Feb 2024 19:40:27 -0300 Subject: [PATCH 747/878] Fix param path --- settings/protocol/rewards.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index 00d67df7e..e631ca339 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -18,7 +18,7 @@ import ( // Config const ( RewardsSettingsContractName string = "rocketDAOProtocolSettingsRewards" - RewardsClaimIntervalPeriodsSettingPath string = "dao.protocol.rewards.claimsperiods" + RewardsClaimIntervalPeriodsSettingPath string = "dao.protocol.setting.rewards.claimsperiods" ) // Rewards claimer percents From c9d6b4d9fcc1d8828dc134371558102cea20d8d0 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 21 Feb 2024 22:47:42 -0300 Subject: [PATCH 748/878] Fix interval periods setting path. --- settings/protocol/rewards.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/protocol/rewards.go b/settings/protocol/rewards.go index e631ca339..4d62c2279 100644 --- a/settings/protocol/rewards.go +++ b/settings/protocol/rewards.go @@ -18,7 +18,7 @@ import ( // Config const ( RewardsSettingsContractName string = "rocketDAOProtocolSettingsRewards" - RewardsClaimIntervalPeriodsSettingPath string = "dao.protocol.setting.rewards.claimsperiods" + RewardsClaimIntervalPeriodsSettingPath string = "rewards.claimsperiods" ) // Rewards claimer percents From d53e1ec0ff7a1117a0cd3bd390f6ccd757139369 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:30:24 -0300 Subject: [PATCH 749/878] Removing actions the sec council cannot perform. --- dao/security/proposals.go | 91 --------------------------------------- 1 file changed, 91 deletions(-) diff --git a/dao/security/proposals.go b/dao/security/proposals.go index 10e5ef138..04f1a4448 100644 --- a/dao/security/proposals.go +++ b/dao/security/proposals.go @@ -63,32 +63,6 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat return SubmitProposal(rp, message, payload, opts) } -// Estimate the gas of ProposeInviteMember -func EstimateProposeInviteMemberGas(rp *rocketpool.RocketPool, message string, newMemberId string, newMemberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalInvite", newMemberId, newMemberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) -} - -// Submit a proposal to invite a new member to the security DAO -func ProposeInviteMember(rp *rocketpool.RocketPool, message string, newMemberId string, newMemberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalInvite", newMemberId, newMemberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding invite member proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) -} - // Estimate the gas of ProposeKick func EstimateProposeKickGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) @@ -102,71 +76,6 @@ func EstimateProposeKickGas(rp *rocketpool.RocketPool, message string, memberAdd return EstimateProposalGas(rp, message, payload, opts) } -// Submit a proposal to kick a member from the security DAO -func ProposeKick(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKick", memberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding kick proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) -} - -// Estimate the gas of ProposeKickMulti -func EstimateProposeKickMultiGas(rp *rocketpool.RocketPool, message string, memberAddresses []common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKickMulti", memberAddresses) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding kick multi proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) -} - -// Submit a proposal to kick multiple members from the security DAO -func ProposeKickMulti(rp *rocketpool.RocketPool, message string, memberAddresses []common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKickMulti", memberAddresses) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding kick multi proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) -} - -// Estimate the gas of ProposeReplace -func EstimateProposeReplaceGas(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalReplace", existingMemberAddress, newMemberID, newMemberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding replace proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) -} - -// Submit a proposal to kick a member from the security DAO and replace it with a new member -func ProposeReplace(rp *rocketpool.RocketPool, message string, existingMemberAddress common.Address, newMemberID string, newMemberAddress common.Address, opts *bind.TransactOpts) (uint64, common.Hash, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return 0, common.Hash{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalReplace", existingMemberAddress, newMemberID, newMemberAddress) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("error encoding replace proposal payload: %w", err) - } - return SubmitProposal(rp, message, payload, opts) -} - // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) From ae623947c9d6f757c9ed4753641b6a188b6a4efb Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:42:08 -0300 Subject: [PATCH 750/878] Remove propose kick from sec council. --- dao/security/proposals.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/dao/security/proposals.go b/dao/security/proposals.go index 04f1a4448..a9087eee9 100644 --- a/dao/security/proposals.go +++ b/dao/security/proposals.go @@ -63,19 +63,6 @@ func ProposeSetBool(rp *rocketpool.RocketPool, message, contractName, settingPat return SubmitProposal(rp, message, payload, opts) } -// Estimate the gas of ProposeKick -func EstimateProposeKickGas(rp *rocketpool.RocketPool, message string, memberAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - payload, err := rocketDAOSecurityProposals.ABI.Pack("proposalKick", memberAddress) - if err != nil { - return rocketpool.GasInfo{}, fmt.Errorf("error encoding kick proposal payload: %w", err) - } - return EstimateProposalGas(rp, message, payload, opts) -} - // Estimate the gas of a proposal submission func EstimateProposalGas(rp *rocketpool.RocketPool, message string, payload []byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOSecurityProposals, err := getRocketDAOSecurityProposals(rp, nil) From f3ab46b45b0cc4eff14d5b5d6fc7327d03d6a1cb Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Sun, 17 Mar 2024 14:24:01 +0000 Subject: [PATCH 751/878] Migrate to common.BytesToHash from deprecated address.Hash() --- node/node.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/node.go b/node/node.go index 858af2c77..0ac3b9ba4 100644 --- a/node/node.go +++ b/node/node.go @@ -447,7 +447,7 @@ func GetPricesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Address, } // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketNetworkPrices.Address} - topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {nodeAddress.Hash()}} + topicFilter := [][]common.Hash{{rocketNetworkPrices.ABI.Events["PricesSubmitted"].ID}, {common.BytesToHash(nodeAddress.Bytes())}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) @@ -475,7 +475,7 @@ func GetBalancesSubmissions(rp *rocketpool.RocketPool, nodeAddress common.Addres } // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketNetworkBalances.Address} - topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {nodeAddress.Hash()}} + topicFilter := [][]common.Hash{{rocketNetworkBalances.ABI.Events["BalancesSubmitted"].ID}, {common.BytesToHash(nodeAddress.Bytes())}} // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, big.NewInt(int64(fromBlock)), nil, nil) From 9ec9754d06e64ef559e28c9ccaa3c07dc114ee55 Mon Sep 17 00:00:00 2001 From: Joe Clapis Date: Thu, 21 Mar 2024 03:12:40 -0400 Subject: [PATCH 752/878] Fixed SC proposals to use namespaces instead of contract names --- settings/security/auction.go | 12 ++++++++---- settings/security/deposit.go | 12 ++++++++---- settings/security/minipool.go | 12 ++++++++---- settings/security/network.go | 12 ++++++++---- settings/security/node.go | 20 ++++++++++++-------- 5 files changed, 44 insertions(+), 24 deletions(-) diff --git a/settings/security/auction.go b/settings/security/auction.go index c8e71f364..57771ee0f 100644 --- a/settings/security/auction.go +++ b/settings/security/auction.go @@ -11,18 +11,22 @@ import ( psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" ) +const ( + auctionNamespace string = "auction" +) + // Lot creation currently enabled func ProposeCreateLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.CreateLotEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), auctionNamespace, psettings.CreateLotEnabledSettingPath, value, opts) } func EstimateProposeCreateLotEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.CreateLotEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.CreateLotEnabledSettingPath), auctionNamespace, psettings.CreateLotEnabledSettingPath, value, opts) } // Lot bidding currently enabled func ProposeBidOnLotEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.BidOnLotEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), auctionNamespace, psettings.BidOnLotEnabledSettingPath, value, opts) } func EstimateProposeBidOnLotEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), psettings.AuctionSettingsContractName, psettings.BidOnLotEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BidOnLotEnabledSettingPath), auctionNamespace, psettings.BidOnLotEnabledSettingPath, value, opts) } diff --git a/settings/security/deposit.go b/settings/security/deposit.go index e2f7fd12f..8ce4b2540 100644 --- a/settings/security/deposit.go +++ b/settings/security/deposit.go @@ -11,18 +11,22 @@ import ( psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" ) +const ( + depositNamespace string = "deposit" +) + // Deposits currently enabled func ProposeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), depositNamespace, psettings.DepositEnabledSettingPath, value, opts) } func EstimateProposeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), psettings.DepositSettingsContractName, psettings.DepositEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.DepositEnabledSettingPath), depositNamespace, psettings.DepositEnabledSettingPath, value, opts) } // Deposit assignments currently enabled func ProposeAssignDepositsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), psettings.DepositSettingsContractName, psettings.AssignDepositsEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), depositNamespace, psettings.AssignDepositsEnabledSettingPath, value, opts) } func EstimateProposeAssignDepositsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), psettings.DepositSettingsContractName, psettings.AssignDepositsEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.AssignDepositsEnabledSettingPath), depositNamespace, psettings.AssignDepositsEnabledSettingPath, value, opts) } diff --git a/settings/security/minipool.go b/settings/security/minipool.go index f01871aa6..a5e9fe076 100644 --- a/settings/security/minipool.go +++ b/settings/security/minipool.go @@ -11,18 +11,22 @@ import ( psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" ) +const ( + minipoolNamespace string = "minipool" +) + // Minipool withdrawable event submissions currently enabled func ProposeMinipoolSubmitWithdrawableEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), minipoolNamespace, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) } func EstimateProposeMinipoolSubmitWithdrawableEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.MinipoolSubmitWithdrawableEnabledSettingPath), minipoolNamespace, psettings.MinipoolSubmitWithdrawableEnabledSettingPath, value, opts) } // Minipool bond reductions currently enabled func ProposeBondReductionEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.BondReductionEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), minipoolNamespace, psettings.BondReductionEnabledSettingPath, value, opts) } func EstimateProposeBondReductionEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), psettings.MinipoolSettingsContractName, psettings.BondReductionEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.BondReductionEnabledSettingPath), minipoolNamespace, psettings.BondReductionEnabledSettingPath, value, opts) } diff --git a/settings/security/network.go b/settings/security/network.go index b8c61f44d..8bbcc161e 100644 --- a/settings/security/network.go +++ b/settings/security/network.go @@ -11,18 +11,22 @@ import ( psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" ) +const ( + networkNamespace string = "network" +) + // Network balance submissions currently enabled func ProposeSubmitBalancesEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitBalancesEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), networkNamespace, psettings.SubmitBalancesEnabledSettingPath, value, opts) } func EstimateProposeSubmitBalancesEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitBalancesEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitBalancesEnabledSettingPath), networkNamespace, psettings.SubmitBalancesEnabledSettingPath, value, opts) } // Rewards submissions currently enabled func ProposeSubmitRewardsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitRewardsEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), networkNamespace, psettings.SubmitRewardsEnabledSettingPath, value, opts) } func EstimateProposeSubmitRewardsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), psettings.NetworkSettingsContractName, psettings.SubmitRewardsEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), networkNamespace, psettings.SubmitRewardsEnabledSettingPath, value, opts) } diff --git a/settings/security/node.go b/settings/security/node.go index d4b2f3f07..07036c917 100644 --- a/settings/security/node.go +++ b/settings/security/node.go @@ -11,34 +11,38 @@ import ( psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" ) +const ( + nodeNamespace string = "node" +) + // Node registrations currently enabled func ProposeNodeRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeRegistrationEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), nodeNamespace, psettings.NodeRegistrationEnabledSettingPath, value, opts) } func EstimateProposeNodeRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeRegistrationEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeRegistrationEnabledSettingPath), nodeNamespace, psettings.NodeRegistrationEnabledSettingPath, value, opts) } // Smoothing pool joining currently enabled func ProposeSmoothingPoolRegistrationEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), nodeNamespace, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) } func EstimateProposeSmoothingPoolRegistrationEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), psettings.NodeSettingsContractName, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SmoothingPoolRegistrationEnabledSettingPath), nodeNamespace, psettings.SmoothingPoolRegistrationEnabledSettingPath, value, opts) } // Node deposits currently enabled func ProposeNodeDepositEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeDepositEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), nodeNamespace, psettings.NodeDepositEnabledSettingPath, value, opts) } func EstimateProposeNodeDepositEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), psettings.NodeSettingsContractName, psettings.NodeDepositEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.NodeDepositEnabledSettingPath), nodeNamespace, psettings.NodeDepositEnabledSettingPath, value, opts) } // Vacant minipools currently enabled func ProposeVacantMinipoolsEnabled(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), psettings.NodeSettingsContractName, psettings.VacantMinipoolsEnabledSettingPath, value, opts) + return security.ProposeSetBool(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), nodeNamespace, psettings.VacantMinipoolsEnabledSettingPath, value, opts) } func EstimateProposeVacantMinipoolsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), psettings.NodeSettingsContractName, psettings.VacantMinipoolsEnabledSettingPath, value, opts) + return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.VacantMinipoolsEnabledSettingPath), nodeNamespace, psettings.VacantMinipoolsEnabledSettingPath, value, opts) } From 3bc252f2b4de92dada4c018d67869a0000430253 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Mon, 25 Mar 2024 01:02:07 -0700 Subject: [PATCH 753/878] fix auction.lot.duration data type --- settings/protocol/auction.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/settings/protocol/auction.go b/settings/protocol/auction.go index 2c9c3b895..6ba9d3334 100644 --- a/settings/protocol/auction.go +++ b/settings/protocol/auction.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -102,8 +103,8 @@ func EstimateProposeLotMaximumEthValueGas(rp *rocketpool.RocketPool, value *big. return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", LotMaximumEthValueSettingPath), AuctionSettingsContractName, LotMaximumEthValueSettingPath, value, blockNumber, treeNodes, opts) } -// The lot duration in blocks -func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +// // The lot duration +func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Duration, error) { auctionSettingsContract, err := getAuctionSettingsContract(rp, opts) if err != nil { return 0, err @@ -112,7 +113,7 @@ func GetLotDuration(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, err if err := auctionSettingsContract.Call(opts, value, "getLotDuration"); err != nil { return 0, fmt.Errorf("error getting lot duration: %w", err) } - return (*value).Uint64(), nil + return time.Duration((*value).Uint64()) * time.Second, nil } func ProposeLotDuration(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", LotDurationSettingPath), AuctionSettingsContractName, LotDurationSettingPath, value, blockNumber, treeNodes, opts) From 6ac0519f5528dd2c11bc37ad249e8be6e3885469 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Thu, 4 Apr 2024 23:38:11 +0000 Subject: [PATCH 754/878] Convert more deprecated calls to common.Address.Hash() --- legacy/v1.0.0/rewards/node.go | 6 +++++- legacy/v1.0.0/rewards/trusted-node.go | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/legacy/v1.0.0/rewards/node.go b/legacy/v1.0.0/rewards/node.go index 2b1fc7494..6ec782c65 100644 --- a/legacy/v1.0.0/rewards/node.go +++ b/legacy/v1.0.0/rewards/node.go @@ -80,7 +80,11 @@ func CalculateLifetimeNodeRewards(rp *rocketpool.RocketPool, claimerAddress comm // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketRewardsPool.Address} // RPLTokensClaimed(address clamingContract, address claimingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimNode.Address.Hash()}, {claimerAddress.Hash()}} + topicFilter := [][]common.Hash{ + {rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, + {common.BytesToHash(rocketClaimNode.Address.Bytes())}, + {common.BytesToHash(claimerAddress.Bytes())}, + } // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/legacy/v1.0.0/rewards/trusted-node.go index 28c7af4c7..9bb1144d2 100644 --- a/legacy/v1.0.0/rewards/trusted-node.go +++ b/legacy/v1.0.0/rewards/trusted-node.go @@ -80,7 +80,11 @@ func CalculateLifetimeTrustedNodeRewards(rp *rocketpool.RocketPool, claimerAddre // Construct a filter query for relevant logs addressFilter := []common.Address{*rocketRewardsPool.Address} // RPLTokensClaimed(address clamingContract, address clainingAddress, uint256 amount, uint256 time) - topicFilter := [][]common.Hash{{rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, {rocketClaimTrustedNode.Address.Hash()}, {claimerAddress.Hash()}} + topicFilter := [][]common.Hash{ + {rocketRewardsPool.ABI.Events["RPLTokensClaimed"].ID}, + {common.BytesToHash(rocketClaimTrustedNode.Address.Bytes())}, + {common.BytesToHash(claimerAddress.Bytes())}, + } // Get the event logs logs, err := eth.GetLogs(rp, addressFilter, topicFilter, intervalSize, startBlock, nil, nil) From da70ba64fc1c2414e20e0b904ddccf3845568479 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 16 Apr 2024 00:55:08 -0300 Subject: [PATCH 755/878] Using initialiseVoting with a param --- network/voting.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/network/voting.go b/network/voting.go index ea64c3f3b..83aa03e44 100644 --- a/network/voting.go +++ b/network/voting.go @@ -93,21 +93,21 @@ func GetVotingInitialized(rp *rocketpool.RocketPool, address common.Address, opt } // Estimate the gas of InitializeVoting -func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, delegate common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVoting") + return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVoting", delegate) } // Initialize on-chain voting for the node -func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { +func InitializeVoting(rp *rocketpool.RocketPool, delegate common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkVoting.Transact(opts, "initialiseVoting") + tx, err := rocketNetworkVoting.Transact(opts, "initialiseVoting", delegate) if err != nil { return common.Hash{}, fmt.Errorf("error initializing voting: %w", err) } From 0062b73a02e4b769ab156a7b1876a2cf2e391b27 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 17 Apr 2024 00:33:45 -0300 Subject: [PATCH 756/878] Update initializeVoting after contract changes --- network/voting.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/network/voting.go b/network/voting.go index 83aa03e44..ea64c3f3b 100644 --- a/network/voting.go +++ b/network/voting.go @@ -93,21 +93,21 @@ func GetVotingInitialized(rp *rocketpool.RocketPool, address common.Address, opt } // Estimate the gas of InitializeVoting -func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, delegate common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVoting", delegate) + return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVoting") } // Initialize on-chain voting for the node -func InitializeVoting(rp *rocketpool.RocketPool, delegate common.Address, opts *bind.TransactOpts) (common.Hash, error) { +func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketNetworkVoting.Transact(opts, "initialiseVoting", delegate) + tx, err := rocketNetworkVoting.Transact(opts, "initialiseVoting") if err != nil { return common.Hash{}, fmt.Errorf("error initializing voting: %w", err) } From aaed8dbf5219c4e9cbf25f7ae6656aeade0fea1d Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 6 May 2024 18:19:28 -0300 Subject: [PATCH 757/878] Add initialiseVotingWithDelegate --- network/voting.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/network/voting.go b/network/voting.go index ea64c3f3b..b93fbb3cd 100644 --- a/network/voting.go +++ b/network/voting.go @@ -114,6 +114,19 @@ func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo return tx.Hash(), nil } +// Initialize on-chain voting for the node and delegate voting power at the same transaction +func InitializeVotingWithDelegate(rp *rocketpool.RocketPool, common.Address delegateAddress, opts *bind.TransactOpts) (common.Hash, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNetworkVoting.Transact(opts, "initialiseVotingWithDelegate", delegateAddress) + if err != nil { + return common.Hash{}, fmt.Errorf("error initializing voting with delegate: %w", err) + } + return tx.Hash(), nil +} + // Get the number of nodes that were present in the network at the provided block func GetVotingNodeCount(rp *rocketpool.RocketPool, blockNumber uint32, opts *bind.CallOpts) (*big.Int, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) From 28c96a3d8d163f5d95a379f09e96ff91d9523e2f Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 6 May 2024 18:39:44 -0300 Subject: [PATCH 758/878] Add EstimateInitializeVotingGas --- network/voting.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/network/voting.go b/network/voting.go index b93fbb3cd..88ffad9e9 100644 --- a/network/voting.go +++ b/network/voting.go @@ -114,6 +114,15 @@ func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo return tx.Hash(), nil } +// Estimate the gas of InitializeVotingWithDelegate +func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, delegateAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNetworkVoting.GetTransactionGasInfo(opts, "initialiseVotingWithDelegate", delegateAddress) +} + // Initialize on-chain voting for the node and delegate voting power at the same transaction func InitializeVotingWithDelegate(rp *rocketpool.RocketPool, common.Address delegateAddress, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) From 13fe2339e04301cd62b8670292758edb4051f32d Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 6 May 2024 18:55:02 -0300 Subject: [PATCH 759/878] Fix InitializeVotingWithDelegate --- network/voting.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/network/voting.go b/network/voting.go index 88ffad9e9..e6fe5662f 100644 --- a/network/voting.go +++ b/network/voting.go @@ -115,7 +115,7 @@ func InitializeVoting(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (commo } // Estimate the gas of InitializeVotingWithDelegate -func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, delegateAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateInitializeVotingWithDelegateGas(rp *rocketpool.RocketPool, delegateAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -124,7 +124,7 @@ func EstimateInitializeVotingGas(rp *rocketpool.RocketPool, delegateAddress comm } // Initialize on-chain voting for the node and delegate voting power at the same transaction -func InitializeVotingWithDelegate(rp *rocketpool.RocketPool, common.Address delegateAddress, opts *bind.TransactOpts) (common.Hash, error) { +func InitializeVotingWithDelegate(rp *rocketpool.RocketPool, delegateAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, nil) if err != nil { return common.Hash{}, err From 866ffef36b44dc8e3a7e208b7747981e44e441d2 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 13 May 2024 13:39:10 -0300 Subject: [PATCH 760/878] Add pDAO cancel proposal. --- dao/protocol/proposal.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index a7f5ab7a0..01af76daa 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -607,6 +607,30 @@ func submitProposal(rp *rocketpool.RocketPool, message string, payload []byte, b return proposalCount + 1, tx.Hash(), nil } + +// Estimate the gas of CancelProposal +func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) +} + +// Cancel a submitted proposal +func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDAOProtocolProposal.Transact(opts, "cancel", big.NewInt(int64(proposalId))) + if err != nil { + return common.Hash{}, fmt.Errorf("error cancelling security DAO proposal %d: %w", proposalId, err) + } + return tx.Hash(), nil +} + + // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, votingPower *big.Int, nodeIndex uint64, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) From f2ee685ee5ea62954b073e4d580795c772ffc00c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 13 May 2024 21:12:51 -0300 Subject: [PATCH 761/878] Add the missing DAO field to protocol proposals. --- dao/protocol/proposal.go | 3 +-- utils/state/pdao.go | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index 01af76daa..e8fa01296 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -33,6 +33,7 @@ const ( // Proposal details type ProtocolDaoProposalDetails struct { ID uint64 `json:"id"` + DAO string `json:"dao"` ProposerAddress common.Address `json:"proposerAddress"` TargetBlock uint32 `json:"targetBlock"` Message string `json:"message"` @@ -607,7 +608,6 @@ func submitProposal(rp *rocketpool.RocketPool, message string, payload []byte, b return proposalCount + 1, tx.Hash(), nil } - // Estimate the gas of CancelProposal func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) @@ -630,7 +630,6 @@ func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.Tra return tx.Hash(), nil } - // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, votingPower *big.Int, nodeIndex uint64, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) diff --git a/utils/state/pdao.go b/utils/state/pdao.go index 202a9e020..925be96dd 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -21,6 +21,7 @@ const ( // Proposal details type protocolDaoProposalDetailsRaw struct { ID uint64 + DAO string ProposerAddress common.Address TargetBlock *big.Int Message string @@ -146,6 +147,7 @@ func getProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *protocolDaoProposalDetailsRaw, opts *bind.CallOpts) error { id := big.NewInt(0).SetUint64(details.ID) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) + mc.AddCall(contracts.RocketDAOProtocolProposal, &details.DAO, "getDAO", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.TargetBlock, "getProposalBlock", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.Message, "getMessage", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.VotingStartTime, "getStart", id) @@ -175,6 +177,7 @@ func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc // Converts a raw proposal to a well-formatted one func fixupPdaoProposalDetails(rp *rocketpool.RocketPool, rawDetails *protocolDaoProposalDetailsRaw, details *protocol.ProtocolDaoProposalDetails, opts *bind.CallOpts) error { details.ID = rawDetails.ID + details.DAO = rawDetails.DAO details.ProposerAddress = rawDetails.ProposerAddress details.TargetBlock = uint32(rawDetails.TargetBlock.Uint64()) details.Message = rawDetails.Message From 6971ae41a0e86a5251f3c8ce92b3012096abf958 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 14 May 2024 20:44:53 -0300 Subject: [PATCH 762/878] pdao proposals can't be cancelled. --- dao/protocol/proposal.go | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/dao/protocol/proposal.go b/dao/protocol/proposal.go index e8fa01296..bc2cffaa3 100644 --- a/dao/protocol/proposal.go +++ b/dao/protocol/proposal.go @@ -608,28 +608,6 @@ func submitProposal(rp *rocketpool.RocketPool, message string, payload []byte, b return proposalCount + 1, tx.Hash(), nil } -// Estimate the gas of CancelProposal -func EstimateCancelProposalGas(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDAOProtocolProposal.GetTransactionGasInfo(opts, "cancel", big.NewInt(int64(proposalId))) -} - -// Cancel a submitted proposal -func CancelProposal(rp *rocketpool.RocketPool, proposalId uint64, opts *bind.TransactOpts) (common.Hash, error) { - rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDAOProtocolProposal.Transact(opts, "cancel", big.NewInt(int64(proposalId))) - if err != nil { - return common.Hash{}, fmt.Errorf("error cancelling security DAO proposal %d: %w", proposalId, err) - } - return tx.Hash(), nil -} - // Estimate the gas of VoteOnProposal func EstimateVoteOnProposalGas(rp *rocketpool.RocketPool, proposalId uint64, voteDirection types.VoteDirection, votingPower *big.Int, nodeIndex uint64, witness []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDAOProtocolProposal, err := getRocketDAOProtocolProposal(rp, nil) From 0a0e0a35884af1e479cf32d25addec65739edec6 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:26:06 -0300 Subject: [PATCH 763/878] Remove isHoustonDeployed checks --- utils/state/contracts.go | 18 ++++++++---------- utils/state/network.go | 24 ++++++------------------ 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 42229f8fc..616774c1f 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -62,7 +62,7 @@ type contractArtifacts struct { } // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, isHoustonDeployed bool, opts *bind.CallOpts) (*NetworkContracts, error) { +func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) (*NetworkContracts, error) { // Get the latest block number if it's not provided if opts == nil { latestElBlock, err := rp.Client.BlockNumber(context.Background()) @@ -165,15 +165,13 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad }) // Houston wrappers - if isHoustonDeployed { - wrappers = append(wrappers, contractArtifacts{ - name: "rocketDAOProtocolProposal", - contract: &contracts.RocketDAOProtocolProposal, - }, contractArtifacts{ - name: "rocketDAOProtocolVerifier", - contract: &contracts.RocketDAOProtocolVerifier, - }) - } + wrappers = append(wrappers, contractArtifacts{ + name: "rocketDAOProtocolProposal", + contract: &contracts.RocketDAOProtocolProposal, + }, contractArtifacts{ + name: "rocketDAOProtocolVerifier", + contract: &contracts.RocketDAOProtocolVerifier, + }) // Add the address and ABI getters to multicall for i, wrapper := range wrappers { diff --git a/utils/state/network.go b/utils/state/network.go index 0a6acc055..ad3e221c0 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -67,7 +67,7 @@ type NetworkDetails struct { } // Create a snapshot of all of the network's details -func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, isHoustonDeployed bool) (*NetworkDetails, error) { +func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) (*NetworkDetails, error) { opts := &bind.CallOpts{ BlockNumber: contracts.ElBlockNumber, } @@ -83,13 +83,11 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i var effectiveQueueCapacity *big.Int var totalQueueLength *big.Int var pricesBlock *big.Int - var latestReportablePricesBlock *big.Int var pricesSubmissionFrequency *big.Int var ethUtilizationRate *big.Int var rETHExchangeRate *big.Int var nodeFee *big.Int var balancesBlock *big.Int - var latestReportableBalancesBlock *big.Int var balancesSubmissionFrequency *big.Int var minipoolLaunchTimeout *big.Int var promotionScrubPeriodSeconds *big.Int @@ -135,14 +133,8 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i contracts.Multicaller.AddCall(contracts.RocketDepositPool, &details.DepositPoolUserBalance, "getUserBalance") // Houston - if isHoustonDeployed { - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesSubmissionFrequency, "getSubmitPricesFrequency") - contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesSubmissionFrequency, "getSubmitBalancesFrequency") - } else { - // getLatestReportableBlock was deprecated on Houston - contracts.Multicaller.AddCall(contracts.RocketNetworkPrices, &latestReportablePricesBlock, "getLatestReportableBlock") - contracts.Multicaller.AddCall(contracts.RocketNetworkBalances, &latestReportableBalancesBlock, "getLatestReportableBlock") - } + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &pricesSubmissionFrequency, "getSubmitPricesFrequency") + contracts.Multicaller.AddCall(contracts.RocketDAOProtocolSettingsNetwork, &balancesSubmissionFrequency, "getSubmitBalancesFrequency") _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { @@ -161,13 +153,9 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, i } details.QueueLength = totalQueueLength details.PricesBlock = pricesBlock.Uint64() - if !isHoustonDeployed { - details.LatestReportablePricesBlock = latestReportablePricesBlock.Uint64() - details.LatestReportableBalancesBlock = latestReportableBalancesBlock.Uint64() - } else { - details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() - details.BalancesSubmissionFrequency = balancesSubmissionFrequency.Uint64() - } + + details.PricesSubmissionFrequency = pricesSubmissionFrequency.Uint64() + details.BalancesSubmissionFrequency = balancesSubmissionFrequency.Uint64() details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) From a1f7c637454f6b694fdad54b262a4a9ce08c47a4 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 4 Jul 2024 20:25:30 -0300 Subject: [PATCH 764/878] WeiToEth nil check --- utils/eth/units.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/eth/units.go b/utils/eth/units.go index b105bb3ae..a21582076 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -13,6 +13,9 @@ const ( // Convert wei to eth func WeiToEth(wei *big.Int) float64 { + if wei == nil { + return 0 + } var weiFloat big.Float var eth big.Float weiFloat.SetInt(wei) From 8eeef1358502e028dfdbd46c6c1f4e806c62eec5 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Mon, 26 Aug 2024 14:26:22 -0400 Subject: [PATCH 765/878] Add Houston 1.3.1 Hotfix to version-checker.go --- network/voting.go | 9 +++++++++ utils/version-checker.go | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/network/voting.go b/network/voting.go index e6fe5662f..bfd8c3a11 100644 --- a/network/voting.go +++ b/network/voting.go @@ -18,6 +18,15 @@ const ( nodeVotingDetailsBatchSize uint64 = 250 ) +// Get the version of the Rocket Network Voting Contract +func GetRocketNetworkVotingVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint8, error) { + rocketNetworkVoting, err := getRocketNetworkVoting(rp, opts) + if err != nil { + return 0, err + } + return rocketpool.GetContractVersion(rp, *rocketNetworkVoting.Address, opts) +} + // Gets the voting power and delegation info for every node at the specified block using multicall func GetNodeInfoSnapshotFast(rp *rocketpool.RocketPool, blockNumber uint32, multicallAddress common.Address, opts *bind.CallOpts) ([]types.NodeVotingInfo, error) { rocketNetworkVoting, err := getRocketNetworkVoting(rp, opts) diff --git a/utils/version-checker.go b/utils/version-checker.go index 46c660ff9..efb319ea3 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -5,12 +5,22 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/hashicorp/go-version" + "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" ) func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { + // Check for v1.3.1 (Houston Hotfix) + networkVotingVersion, err := network.GetRocketNetworkVotingVersion(rp, opts) + if err != nil { + return nil, fmt.Errorf("error checking network voting version: %w", err) + } + if networkVotingVersion > 1 { + return version.NewSemver("1.3.1") + } + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) if err != nil { return nil, fmt.Errorf("error checking node manager version: %w", err) From 7b6894d573650e498e27215361975d486ee6f206 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:33:57 -0300 Subject: [PATCH 766/878] Balances block as uint64 --- utils/state/network.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/state/network.go b/utils/state/network.go index ad3e221c0..501699771 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -49,7 +49,7 @@ type NetworkDetails struct { TotalRPLStake *big.Int SmoothingPoolBalance *big.Int NodeFee float64 - BalancesBlock *big.Int + BalancesBlock uint64 LatestReportableBalancesBlock uint64 SubmitBalancesEnabled bool SubmitPricesEnabled bool @@ -159,7 +159,7 @@ func NewNetworkDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts) ( details.ETHUtilizationRate = eth.WeiToEth(ethUtilizationRate) details.RETHExchangeRate = eth.WeiToEth(rETHExchangeRate) details.NodeFee = eth.WeiToEth(nodeFee) - details.BalancesBlock = balancesBlock + details.BalancesBlock = balancesBlock.Uint64() details.MinipoolLaunchTimeout = minipoolLaunchTimeout details.PromotionScrubPeriod = convertToDuration(promotionScrubPeriodSeconds) details.BondReductionWindowStart = convertToDuration(windowStartRaw) From e8ce1e2fb2b3307bc701fbf4539abe8de5290854 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Thu, 26 Sep 2024 15:29:51 -0400 Subject: [PATCH 767/878] Remove unused function parameters from state query logic --- utils/state/minipool.go | 10 +++++----- utils/state/odao.go | 12 ++++++------ utils/state/pdao.go | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index a189da5ab..a26206dd9 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -93,7 +93,7 @@ func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContr return NativeMinipoolDetails{}, fmt.Errorf("error executing multicall: %w", err) } - fixupMinipoolDetails(rp, &details, opts) + fixupMinipoolDetails(&details) return details, nil } @@ -426,7 +426,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac for j := i; j < max; j++ { details := &minipoolDetails[j] details.Version = versions[j] - addMinipoolShareCalls(rp, contracts, mc, details, opts) + addMinipoolShareCalls(rp, mc, details, opts) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -443,7 +443,7 @@ func getBulkMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContrac // Postprocess the minipools for i := range minipoolDetails { - fixupMinipoolDetails(rp, &minipoolDetails[i], opts) + fixupMinipoolDetails(&minipoolDetails[i]) } return minipoolDetails, nil @@ -519,7 +519,7 @@ func addMinipoolDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContra } // Add the calls for the minipool node and user share to the multicaller -func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *NativeMinipoolDetails, opts *bind.CallOpts) error { +func addMinipoolShareCalls(rp *rocketpool.RocketPool, mc *multicall.MultiCaller, details *NativeMinipoolDetails, opts *bind.CallOpts) error { // Create the minipool contract binding address := details.MinipoolAddress mp, err := minipool.NewMinipoolFromVersion(rp, address, details.Version, opts) @@ -541,7 +541,7 @@ func addMinipoolShareCalls(rp *rocketpool.RocketPool, contracts *NetworkContract } // Fixes a minipool details struct with supplemental logic -func fixupMinipoolDetails(rp *rocketpool.RocketPool, details *NativeMinipoolDetails, opts *bind.CallOpts) error { +func fixupMinipoolDetails(details *NativeMinipoolDetails) error { details.Status = types.MinipoolStatus(details.StatusRaw) details.DepositType = types.MinipoolDeposit(details.DepositTypeRaw) diff --git a/utils/state/odao.go b/utils/state/odao.go index 7e82dd3cd..133f4e5f8 100644 --- a/utils/state/odao.go +++ b/utils/state/odao.go @@ -41,14 +41,14 @@ func GetOracleDaoMemberDetails(rp *rocketpool.RocketPool, contracts *NetworkCont details := OracleDaoMemberDetails{} details.Address = memberAddress - addOracleDaoMemberDetailsCalls(rp, contracts, contracts.Multicaller, &details, opts) + addOracleDaoMemberDetailsCalls(contracts, contracts.Multicaller, &details) _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { return OracleDaoMemberDetails{}, fmt.Errorf("error executing multicall: %w", err) } - fixupOracleDaoMemberDetails(rp, &details, opts) + fixupOracleDaoMemberDetails(&details) return details, nil } @@ -142,7 +142,7 @@ func getOracleDaoDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, details := &memberDetails[j] details.Address = address - addOracleDaoMemberDetailsCalls(rp, contracts, mc, details, opts) + addOracleDaoMemberDetailsCalls(contracts, mc, details) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -160,14 +160,14 @@ func getOracleDaoDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, // Postprocessing for i := range memberDetails { details := &memberDetails[i] - fixupOracleDaoMemberDetails(rp, details, opts) + fixupOracleDaoMemberDetails(details) } return memberDetails, nil } // Add the Oracle DAO details getters to the multicaller -func addOracleDaoMemberDetailsCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { +func addOracleDaoMemberDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *OracleDaoMemberDetails) error { address := details.Address mc.AddCall(contracts.RocketDAONodeTrusted, &details.Exists, "getMemberIsValid", address) mc.AddCall(contracts.RocketDAONodeTrusted, &details.ID, "getMemberID", address) @@ -181,7 +181,7 @@ func addOracleDaoMemberDetailsCalls(rp *rocketpool.RocketPool, contracts *Networ } // Fixes a member details struct with supplemental logic -func fixupOracleDaoMemberDetails(rp *rocketpool.RocketPool, details *OracleDaoMemberDetails, opts *bind.CallOpts) error { +func fixupOracleDaoMemberDetails(details *OracleDaoMemberDetails) error { details.JoinedTime = convertToTime(details.joinedTimeRaw) details.LastProposalTime = convertToTime(details.lastProposalTimeRaw) return nil diff --git a/utils/state/pdao.go b/utils/state/pdao.go index 925be96dd..0f2dd8208 100644 --- a/utils/state/pdao.go +++ b/utils/state/pdao.go @@ -59,7 +59,7 @@ func GetProtocolDaoProposalDetails(rp *rocketpool.RocketPool, contracts *Network rawDetails := protocolDaoProposalDetailsRaw{} details.ID = proposalID - addProposalCalls(rp, contracts, contracts.Multicaller, &rawDetails, opts) + addProposalCalls(contracts, contracts.Multicaller, &rawDetails) _, err := contracts.Multicaller.FlexibleCall(true, opts) if err != nil { @@ -117,7 +117,7 @@ func getProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, details := &propDetailsRaw[j] details.ID = id - addProposalCalls(rp, contracts, mc, details, opts) + addProposalCalls(contracts, mc, details) } _, err = mc.FlexibleCall(true, opts) if err != nil { @@ -144,7 +144,7 @@ func getProposalDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, } // Get the details of a proposal -func addProposalCalls(rp *rocketpool.RocketPool, contracts *NetworkContracts, mc *multicall.MultiCaller, details *protocolDaoProposalDetailsRaw, opts *bind.CallOpts) error { +func addProposalCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, details *protocolDaoProposalDetailsRaw) error { id := big.NewInt(0).SetUint64(details.ID) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.ProposerAddress, "getProposer", id) mc.AddCall(contracts.RocketDAOProtocolProposal, &details.DAO, "getDAO", id) From ea7d71b179e9ac371bbc64d29c1caee935fef5cf Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Thu, 26 Sep 2024 15:30:17 -0400 Subject: [PATCH 768/878] Add json field names for NetworkState dependencies --- utils/state/minipool.go | 70 ++++++++++++++++++------------------ utils/state/network.go | 80 ++++++++++++++++++++--------------------- utils/state/node.go | 56 ++++++++++++++--------------- 3 files changed, 104 insertions(+), 102 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index a26206dd9..d08f1ea7e 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -24,40 +24,42 @@ const ( // Complete details for a minipool type NativeMinipoolDetails struct { // Redstone - Exists bool - MinipoolAddress common.Address - Pubkey types.ValidatorPubkey - StatusRaw uint8 - StatusBlock *big.Int - StatusTime *big.Int - Finalised bool - DepositTypeRaw uint8 - NodeFee *big.Int - NodeDepositBalance *big.Int - NodeDepositAssigned bool - UserDepositBalance *big.Int - UserDepositAssigned bool - UserDepositAssignedTime *big.Int - UseLatestDelegate bool - Delegate common.Address - PreviousDelegate common.Address - EffectiveDelegate common.Address - PenaltyCount *big.Int - PenaltyRate *big.Int - NodeAddress common.Address - Version uint8 - Balance *big.Int // Contract balance - DistributableBalance *big.Int // Contract balance minus node op refund - NodeShareOfBalance *big.Int // Result of calculateNodeShare(contract balance) - UserShareOfBalance *big.Int // Result of calculateUserShare(contract balance) - NodeRefundBalance *big.Int - WithdrawalCredentials common.Hash - Status types.MinipoolStatus - DepositType types.MinipoolDeposit - NodeShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this - UserShareOfBalanceIncludingBeacon *big.Int // Must call CalculateCompleteMinipoolShares to get this - NodeShareOfBeaconBalance *big.Int // Must call CalculateCompleteMinipoolShares to get this - UserShareOfBeaconBalance *big.Int // Must call CalculateCompleteMinipoolShares to get this + Exists bool `json:"exists"` + MinipoolAddress common.Address `json:"minipool_address"` + Pubkey types.ValidatorPubkey `json:"pubkey"` + StatusRaw uint8 `json:"status_raw"` + StatusBlock *big.Int `json:"status_block"` + StatusTime *big.Int `json:"status_time"` + Finalised bool `json:"finalised"` + DepositTypeRaw uint8 `json:"deposit_type_raw"` + NodeFee *big.Int `json:"node_fee"` + NodeDepositBalance *big.Int `json:"node_deposit_balance"` + NodeDepositAssigned bool `json:"node_deposit_assigned"` + UserDepositBalance *big.Int `json:"user_deposit_balance"` + UserDepositAssigned bool `json:"user_deposit_assigned"` + UserDepositAssignedTime *big.Int `json:"user_deposit_assigned_time"` + UseLatestDelegate bool `json:"use_latest_delegate"` + Delegate common.Address `json:"delegate"` + PreviousDelegate common.Address `json:"previous_delegate"` + EffectiveDelegate common.Address `json:"effective_delegate"` + PenaltyCount *big.Int `json:"penalty_count"` + PenaltyRate *big.Int `json:"penalty_rate"` + NodeAddress common.Address `json:"node_address"` + Version uint8 `json:"version"` + Balance *big.Int `json:"balance"` + DistributableBalance *big.Int `json:"distributable_balance"` + NodeShareOfBalance *big.Int `json:"node_share_of_balance"` // Result of calculateNodeShare(contract balance) + UserShareOfBalance *big.Int `json:"user_share_of_balance"` // Result of calculateUserShare(contract balance) + NodeRefundBalance *big.Int `json:"node_refund_balance"` + WithdrawalCredentials common.Hash `json:"withdrawal_credentials"` + Status types.MinipoolStatus `json:"status"` + DepositType types.MinipoolDeposit `json:"deposit_type"` + + // Must call CalculateCompleteMinipoolShares to get these + NodeShareOfBalanceIncludingBeacon *big.Int `json:"node_share_of_balance_including_beacon"` + UserShareOfBalanceIncludingBeacon *big.Int `json:"user_share_of_balance_including_beacon"` + NodeShareOfBeaconBalance *big.Int `json:"node_share_of_beacon_balance"` + UserShareOfBeaconBalance *big.Int `json:"user_share_of_beacon_balance"` // Atlas UserDistributed bool diff --git a/utils/state/network.go b/utils/state/network.go index 501699771..18ac814e5 100644 --- a/utils/state/network.go +++ b/utils/state/network.go @@ -20,50 +20,50 @@ const ( type NetworkDetails struct { // Redstone - RplPrice *big.Int - MinCollateralFraction *big.Int - MaxCollateralFraction *big.Int - IntervalDuration time.Duration - IntervalStart time.Time - NodeOperatorRewardsPercent *big.Int - TrustedNodeOperatorRewardsPercent *big.Int - ProtocolDaoRewardsPercent *big.Int - PendingRPLRewards *big.Int - RewardIndex uint64 - ScrubPeriod time.Duration - SmoothingPoolAddress common.Address - DepositPoolBalance *big.Int - DepositPoolExcess *big.Int - QueueCapacity minipool.QueueCapacity - QueueLength *big.Int - RPLInflationIntervalRate *big.Int - RPLTotalSupply *big.Int - PricesBlock uint64 - LatestReportablePricesBlock uint64 - ETHUtilizationRate float64 - StakingETHBalance *big.Int - RETHExchangeRate float64 - TotalETHBalance *big.Int - RETHBalance *big.Int - TotalRETHSupply *big.Int - TotalRPLStake *big.Int - SmoothingPoolBalance *big.Int - NodeFee float64 - BalancesBlock uint64 - LatestReportableBalancesBlock uint64 - SubmitBalancesEnabled bool - SubmitPricesEnabled bool - MinipoolLaunchTimeout *big.Int + RplPrice *big.Int `json:"rpl_price"` + MinCollateralFraction *big.Int `json:"min_collateral_fraction"` + MaxCollateralFraction *big.Int `json:"max_collateral_fraction"` + IntervalDuration time.Duration `json:"interval_duration"` + IntervalStart time.Time `json:"interval_start"` + NodeOperatorRewardsPercent *big.Int `json:"node_operator_rewards_percent"` + TrustedNodeOperatorRewardsPercent *big.Int `json:"trusted_node_operator_rewards_percent"` + ProtocolDaoRewardsPercent *big.Int `json:"protocol_dao_rewards_percent"` + PendingRPLRewards *big.Int `json:"pending_rpl_rewards"` + RewardIndex uint64 `json:"reward_index"` + ScrubPeriod time.Duration `json:"scrub_period"` + SmoothingPoolAddress common.Address `json:"smoothing_pool_address"` + DepositPoolBalance *big.Int `json:"deposit_pool_balance"` + DepositPoolExcess *big.Int `json:"deposit_pool_excess"` + QueueCapacity minipool.QueueCapacity `json:"queue_capacity"` + QueueLength *big.Int `json:"queue_length"` + RPLInflationIntervalRate *big.Int `json:"rpl_inflation_interval_rate"` + RPLTotalSupply *big.Int `json:"rpl_total_supply"` + PricesBlock uint64 `json:"prices_block"` + LatestReportablePricesBlock uint64 `json:"latest_reportable_prices_block"` + ETHUtilizationRate float64 `json:"eth_utilization_rate"` + StakingETHBalance *big.Int `json:"staking_eth_balance"` + RETHExchangeRate float64 `json:"reth_exchange_rate"` + TotalETHBalance *big.Int `json:"total_eth_balance"` + RETHBalance *big.Int `json:"reth_balance"` + TotalRETHSupply *big.Int `json:"total_reth_supply"` + TotalRPLStake *big.Int `json:"total_rpl_stake"` + SmoothingPoolBalance *big.Int `json:"smoothing_pool_balance"` + NodeFee float64 `json:"node_fee"` + BalancesBlock uint64 `json:"balances_block"` + LatestReportableBalancesBlock uint64 `json:"latest_reportable_balances_block"` + SubmitBalancesEnabled bool `json:"submit_balances_enabled"` + SubmitPricesEnabled bool `json:"submit_prices_enabled"` + MinipoolLaunchTimeout *big.Int `json:"minipool_launch_timeout"` // Atlas - PromotionScrubPeriod time.Duration - BondReductionWindowStart time.Duration - BondReductionWindowLength time.Duration - DepositPoolUserBalance *big.Int + PromotionScrubPeriod time.Duration `json:"promotion_scrub_period"` + BondReductionWindowStart time.Duration `json:"bond_reduction_window_start"` + BondReductionWindowLength time.Duration `json:"bond_reduction_window_length"` + DepositPoolUserBalance *big.Int `json:"deposit_pool_user_balance"` // Houston - PricesSubmissionFrequency uint64 - BalancesSubmissionFrequency uint64 + PricesSubmissionFrequency uint64 `json:"prices_submission_frequency"` + BalancesSubmissionFrequency uint64 `json:"balances_submission_frequency"` } // Create a snapshot of all of the network's details diff --git a/utils/state/node.go b/utils/state/node.go index d1a55bb89..ecefaa87c 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -21,34 +21,34 @@ const ( // Complete details for a node type NativeNodeDetails struct { - Exists bool - RegistrationTime *big.Int - TimezoneLocation string - FeeDistributorInitialised bool - FeeDistributorAddress common.Address - RewardNetwork *big.Int - RplStake *big.Int - EffectiveRPLStake *big.Int - MinimumRPLStake *big.Int - MaximumRPLStake *big.Int - EthMatched *big.Int - EthMatchedLimit *big.Int - MinipoolCount *big.Int - BalanceETH *big.Int - BalanceRETH *big.Int - BalanceRPL *big.Int - BalanceOldRPL *big.Int - DepositCreditBalance *big.Int - DistributorBalanceUserETH *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this - DistributorBalanceNodeETH *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this - WithdrawalAddress common.Address - PendingWithdrawalAddress common.Address - SmoothingPoolRegistrationState bool - SmoothingPoolRegistrationChanged *big.Int - NodeAddress common.Address - AverageNodeFee *big.Int // Must call CalculateAverageFeeAndDistributorShares to get this - CollateralisationRatio *big.Int - DistributorBalance *big.Int + Exists bool `json:"exists"` + RegistrationTime *big.Int `json:"registration_time"` + TimezoneLocation string `json:"timezone_location"` + FeeDistributorInitialised bool `json:"fee_distributor_initialised"` + FeeDistributorAddress common.Address `json:"fee_distributor_address"` + RewardNetwork *big.Int `json:"reward_network"` + RplStake *big.Int `json:"rpl_stake"` + EffectiveRPLStake *big.Int `json:"effective_rpl_stake"` + MinimumRPLStake *big.Int `json:"minimum_rpl_stake"` + MaximumRPLStake *big.Int `json:"maximum_rpl_stake"` + EthMatched *big.Int `json:"eth_matched"` + EthMatchedLimit *big.Int `json:"eth_matched_limit"` + MinipoolCount *big.Int `json:"minipool_count"` + BalanceETH *big.Int `json:"balance_eth"` + BalanceRETH *big.Int `json:"balance_reth"` + BalanceRPL *big.Int `json:"balance_rpl"` + BalanceOldRPL *big.Int `json:"balance_old_rpl"` + DepositCreditBalance *big.Int `json:"deposit_credit_balance"` + DistributorBalanceUserETH *big.Int `json:"distributor_balance_user_eth"` // Must call CalculateAverageFeeAndDistributorShares to get this + DistributorBalanceNodeETH *big.Int `json:"distributor_balance_node_eth"` // Must call CalculateAverageFeeAndDistributorShares to get this + WithdrawalAddress common.Address `json:"withdrawal_address"` + PendingWithdrawalAddress common.Address `json:"pending_withdrawal_address"` + SmoothingPoolRegistrationState bool `json:"smoothing_pool_registration_state"` + SmoothingPoolRegistrationChanged *big.Int `json:"smoothing_pool_registration_changed"` + NodeAddress common.Address `json:"node_address"` + AverageNodeFee *big.Int `json:"average_node_fee"` // Must call CalculateAverageFeeAndDistributorShares to get this + CollateralisationRatio *big.Int `json:"collateralisation_ratio"` + DistributorBalance *big.Int `json:"distributor_balance"` } // Gets the details for a node using the efficient multicall contract From 98b7d25088462e20119809573a42149ff06fb7d3 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Fri, 1 Nov 2024 04:28:44 -0400 Subject: [PATCH 769/878] Make CalculateAverageFeeAndDistributorShares a receiver --- utils/state/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/node.go b/utils/state/node.go index ecefaa87c..fae63b210 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -181,7 +181,7 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra } // Calculate the average node fee and user/node shares of the distributor's balance -func CalculateAverageFeeAndDistributorShares(rp *rocketpool.RocketPool, contracts *NetworkContracts, node NativeNodeDetails, minipoolDetails []*NativeMinipoolDetails) error { +func (node *NativeNodeDetails) CalculateAverageFeeAndDistributorShares(minipoolDetails []*NativeMinipoolDetails) error { // Calculate the total of all fees for staking minipools that aren't finalized totalFee := big.NewInt(0) From 14d9c1f5ad1d1b132b81ec01c8b4b52fbc5111cb Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Sun, 3 Nov 2024 10:10:34 -0500 Subject: [PATCH 770/878] Move GetRewardsIndex to package root --- rewards/rewards.go | 13 ------------- rocketpool/rewards.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 rocketpool/rewards.go diff --git a/rewards/rewards.go b/rewards/rewards.go index b22aa43ec..352ad108f 100644 --- a/rewards/rewards.go +++ b/rewards/rewards.go @@ -61,19 +61,6 @@ type rewardSnapshot struct { Time *big.Int `json:"time"` } -// Get the index of the active rewards period -func GetRewardIndex(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { - rocketRewardsPool, err := getRocketRewardsPool(rp, opts) - if err != nil { - return nil, err - } - index := new(*big.Int) - if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { - return nil, fmt.Errorf("error getting current reward index: %w", err) - } - return *index, nil -} - // Get the timestamp that the current rewards interval started func GetClaimIntervalTimeStart(rp *rocketpool.RocketPool, opts *bind.CallOpts) (time.Time, error) { rocketRewardsPool, err := getRocketRewardsPool(rp, opts) diff --git a/rocketpool/rewards.go b/rocketpool/rewards.go new file mode 100644 index 000000000..85204074f --- /dev/null +++ b/rocketpool/rewards.go @@ -0,0 +1,35 @@ +package rocketpool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" +) + +// rocketpool-go's dependencies are all inverted: the subfolders have dependencies back to +// the main package. This is less than ideal, but hard to fix- instead, I will be migrating content +// out of the subpackages into the main package to fulfill interfaces as needed. + +// Get the index of the active rewards period +func (rp *RocketPool) GetRewardIndex(opts *bind.CallOpts) (*big.Int, error) { + rocketRewardsPool, err := getRocketRewardsPool(rp, opts) + if err != nil { + return nil, err + } + index := new(*big.Int) + if err := rocketRewardsPool.Call(opts, index, "getRewardIndex"); err != nil { + return nil, fmt.Errorf("error getting current reward index: %w", err) + } + return *index, nil +} + +// Get contracts +var rocketRewardsPoolLock sync.Mutex + +func getRocketRewardsPool(rp *RocketPool, opts *bind.CallOpts) (*Contract, error) { + rocketRewardsPoolLock.Lock() + defer rocketRewardsPoolLock.Unlock() + return rp.GetContract("rocketRewardsPool", opts) +} From 9e33b8a5f3276a3de6c8dc91177080045c9bc86a Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Sun, 3 Nov 2024 14:06:40 -0500 Subject: [PATCH 771/878] Move some logic to rocketpool-go from smartnode --- utils/state/minipool.go | 39 +++++++++++++++++++++++++++++++++++++++ utils/state/node.go | 16 ++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index d08f1ea7e..b52a19d17 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -3,6 +3,7 @@ package state import ( "fmt" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -216,6 +217,44 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo return nil } +var oneEth = big.NewInt(1e18) +var thirtyTwoEth = big.NewInt(0).Mul(big.NewInt(32), oneEth) + +func (details *NativeMinipoolDetails) GetMinipoolAttestationScore(blockTime time.Time) *big.Int { + bond, fee := details.GetMinipoolBondAndNodeFee(blockTime) + minipoolScore := big.NewInt(0).Sub(oneEth, fee) // 1 - fee + minipoolScore.Mul(minipoolScore, bond) // Multiply by bond + minipoolScore.Div(minipoolScore, thirtyTwoEth) // Divide by 32 to get the bond as a fraction of a total validator + minipoolScore.Add(minipoolScore, fee) // Total = fee + (bond/32)(1 - fee) + return minipoolScore +} + +// Get the bond and node fee of a minipool for the specified time +func (details *NativeMinipoolDetails) GetMinipoolBondAndNodeFee(blockTime time.Time) (*big.Int, *big.Int) { + currentBond := details.NodeDepositBalance + currentFee := details.NodeFee + previousBond := details.LastBondReductionPrevValue + previousFee := details.LastBondReductionPrevNodeFee + + var reductionTimeBig *big.Int = details.LastBondReductionTime + if reductionTimeBig.Cmp(common.Big0) == 0 { + // Never reduced + return currentBond, currentFee + } + + reductionTime := time.Unix(reductionTimeBig.Int64(), 0) + if reductionTime.Sub(blockTime) > 0 { + // This block occurred before the reduction + if previousFee.Cmp(common.Big0) == 0 { + // Catch for minipools that were created before this call existed + return previousBond, currentFee + } + return previousBond, previousFee + } + + return currentBond, currentFee +} + // Get all minipool addresses using the multicaller func getNodeMinipoolAddressesFast(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address, opts *bind.CallOpts) ([]common.Address, error) { // Get minipool count diff --git a/utils/state/node.go b/utils/state/node.go index fae63b210..167668325 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -180,6 +181,21 @@ func GetAllNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContra return nodeDetails, nil } +func (node *NativeNodeDetails) WasOptedInAt(t time.Time) bool { + if node.SmoothingPoolRegistrationState { + // If a node is opted in, check if the check time is after the opt-in time + return t.After(time.Unix(node.SmoothingPoolRegistrationChanged.Int64(), 0)) + } + + // If the node isn't opted in and was never opted in, it's not opted in + if node.SmoothingPoolRegistrationChanged.Cmp(big.NewInt(0)) == 0 { + return false + } + + // If a node is opted out, but was opted in, check if the check time is before the opt-out time + return t.Before(time.Unix(node.SmoothingPoolRegistrationChanged.Int64(), 0)) +} + // Calculate the average node fee and user/node shares of the distributor's balance func (node *NativeNodeDetails) CalculateAverageFeeAndDistributorShares(minipoolDetails []*NativeMinipoolDetails) error { From 784150a028e607a103019272c31fb40225d95074 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Fri, 22 Nov 2024 13:54:03 -0500 Subject: [PATCH 772/878] Add bonus commission eligibility checks, remove minipool score tabulation --- utils/state/minipool.go | 31 +++++++++++++++++++++---------- utils/state/node.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/utils/state/minipool.go b/utils/state/minipool.go index b52a19d17..813c8f596 100644 --- a/utils/state/minipool.go +++ b/utils/state/minipool.go @@ -75,6 +75,27 @@ type NativeMinipoolDetails struct { PreMigrationBalance *big.Int } +var sixteenEth = big.NewInt(0).Mul(big.NewInt(16), oneEth) + +func (details *NativeMinipoolDetails) IsEligibleForBonuses(eligibleEnd time.Time) bool { + // A minipool is eligible for bonuses if it was active and had a bond of less than 16 ETH during the interval + if details.Status != types.Staking { + return false + } + if details.NodeDepositBalance.Cmp(sixteenEth) >= 0 { + return false + } + + lastBondReductionTimestamp := details.LastBondReductionTime.Int64() + if lastBondReductionTimestamp == 0 { + // eligible if the bond was always under 16 eth + return true + } + lastBondReductionTime := time.Unix(lastBondReductionTimestamp, 0) + // eligible if the bond was reduced before or during the interval + return lastBondReductionTime.Before(eligibleEnd) +} + // Gets the details for a minipool using the efficient multicall contract func GetNativeMinipoolDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, minipoolAddress common.Address) (NativeMinipoolDetails, error) { opts := &bind.CallOpts{ @@ -218,16 +239,6 @@ func CalculateCompleteMinipoolShares(rp *rocketpool.RocketPool, contracts *Netwo } var oneEth = big.NewInt(1e18) -var thirtyTwoEth = big.NewInt(0).Mul(big.NewInt(32), oneEth) - -func (details *NativeMinipoolDetails) GetMinipoolAttestationScore(blockTime time.Time) *big.Int { - bond, fee := details.GetMinipoolBondAndNodeFee(blockTime) - minipoolScore := big.NewInt(0).Sub(oneEth, fee) // 1 - fee - minipoolScore.Mul(minipoolScore, bond) // Multiply by bond - minipoolScore.Div(minipoolScore, thirtyTwoEth) // Divide by 32 to get the bond as a fraction of a total validator - minipoolScore.Add(minipoolScore, fee) // Total = fee + (bond/32)(1 - fee) - return minipoolScore -} // Get the bond and node fee of a minipool for the specified time func (details *NativeMinipoolDetails) GetMinipoolBondAndNodeFee(blockTime time.Time) (*big.Int, *big.Int) { diff --git a/utils/state/node.go b/utils/state/node.go index 167668325..b252039c7 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -52,6 +52,37 @@ type NativeNodeDetails struct { DistributorBalance *big.Int `json:"distributor_balance"` } +func timeMax(a, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} + +func timeMin(a, b time.Time) time.Time { + if a.Before(b) { + return a + } + return b +} + +// Returns whether the node is eligible for bonuses, and the start and end times of its eligibility +func (nnd *NativeNodeDetails) IsEligibleForBonuses(eligibleStart time.Time, eligibleEnd time.Time) (bool, time.Time, time.Time) { + // Nodes are not eligible for bonuses if they never opted into the smoothing pool + registeredTime := time.Unix(nnd.SmoothingPoolRegistrationChanged.Int64(), 0) + if registeredTime.Unix() == 0 { + return false, time.Time{}, time.Time{} + } + + // Nodes are eligible for bonuses if they were in the Smoothing Pool for a portion of the interval + if nnd.SmoothingPoolRegistrationState { + return registeredTime.Before(eligibleEnd), timeMax(registeredTime, eligibleStart), eligibleEnd + } + + // Nodes that weren't opted in at the end of the interval are eligible if they opted out during the interval + return registeredTime.Before(eligibleEnd), timeMax(registeredTime, eligibleStart), timeMin(registeredTime, eligibleEnd) +} + // Gets the details for a node using the efficient multicall contract func GetNativeNodeDetails(rp *rocketpool.RocketPool, contracts *NetworkContracts, nodeAddress common.Address) (NativeNodeDetails, error) { opts := &bind.CallOpts{ From ee67229629a7e04b06b03c2ad930f8a873f9f168 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:11:18 -0300 Subject: [PATCH 773/878] wip --- megapool/factory.go | 59 ++++++++++++++++ megapool/megapool-interface.go | 54 ++++++++++++++ megapool/megapool.go | 125 +++++++++++++++++++++++++++++++++ minipool/minipool.go | 4 +- node/deposit.go | 24 +++---- node/node.go | 35 +++++++++ 6 files changed, 287 insertions(+), 14 deletions(-) create mode 100644 megapool/factory.go create mode 100644 megapool/megapool-interface.go create mode 100644 megapool/megapool.go diff --git a/megapool/factory.go b/megapool/factory.go new file mode 100644 index 000000000..e1600cc73 --- /dev/null +++ b/megapool/factory.go @@ -0,0 +1,59 @@ +package megapool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Get a megapool deployment state +func GetMegapoolDeployed(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (bool, error) { + rocketMegapoolFactory, err := getRocketMegapoolFactory(rp, opts) + if err != nil { + return false, err + } + deployed := false + if err := rocketMegapoolFactory.Call(opts, deployed, "getMegapoolDeployed", nodeAddress); err != nil { + return false, fmt.Errorf("error getting megapool deployed for node %s: %w", nodeAddress, err) + } + return deployed, nil +} + +// Get a megapool expected address +func GetMegapoolExpectedAddress(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (common.Address, error) { + rocketMegapoolFactory, err := getRocketMegapoolFactory(rp, opts) + if err != nil { + return common.Address{}, err + } + expectedAddress := common.Address{} + if err := rocketMegapoolFactory.Call(opts, expectedAddress, "getExpectedAddress", nodeAddress); err != nil { + return common.Address{}, fmt.Errorf("error getting megapool expected address for node %s: %w", nodeAddress, err) + } + return expectedAddress, nil +} + +// Get a megapool delegate expiration block +func GetMegapoolDelegateExpiry(rp *rocketpool.RocketPool, delegateAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMegapoolFactory, err := getRocketMegapoolFactory(rp, opts) + if err != nil { + return 0, err + } + expiryBlock := new(*big.Int) + if err := rocketMegapoolFactory.Call(opts, expiryBlock, "getDelegateExpiry", delegateAddress); err != nil { + return 0, fmt.Errorf("error getting expiration block for delegate address %s: %w", delegateAddress, err) + } + return (*expiryBlock).Uint64(), nil +} + +// Get contracts +var rocketMegapoolFactoryLock sync.Mutex + +func getRocketMegapoolFactory(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMegapoolFactoryLock.Lock() + defer rocketMegapoolFactoryLock.Unlock() + return rp.GetContract("rocketMegapoolFactory", opts) +} diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go new file mode 100644 index 000000000..e8e0f273e --- /dev/null +++ b/megapool/megapool-interface.go @@ -0,0 +1,54 @@ +package megapool + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +type Megapool interface { + GetContract() *rocketpool.Contract + GetAddress() common.Address + GetVersion() uint8 + //GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) + //GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) + // GetStatusBlock(opts *bind.CallOpts) (uint64, error) + // GetStatusTime(opts *bind.CallOpts) (time.Time, error) + // GetFinalised(opts *bind.CallOpts) (bool, error) + //GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) + //GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) + // GetNodeAddress(opts *bind.CallOpts) (common.Address, error) + // GetNodeFee(opts *bind.CallOpts) (float64, error) + // GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) + // GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) + // GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) + // GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) + // GetUserDetails(opts *bind.CallOpts) (UserDetails, error) + // GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) + // GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) + // GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) + // EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // Refund(opts *bind.TransactOpts) (common.Hash, error) + //EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + //Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) + // EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // Dissolve(opts *bind.TransactOpts) (common.Hash, error) + // EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // Close(opts *bind.TransactOpts) (common.Hash, error) + // EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // Finalise(opts *bind.TransactOpts) (common.Hash, error) + // EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) + // EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) + // EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) + // GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) + // GetDelegate(opts *bind.CallOpts) (common.Address, error) + // GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) + // GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) + // CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) + // CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) + // EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + // VoteScrub(opts *bind.TransactOpts) (common.Hash, error) + //GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) +} diff --git a/megapool/megapool.go b/megapool/megapool.go new file mode 100644 index 000000000..278c9357c --- /dev/null +++ b/megapool/megapool.go @@ -0,0 +1,125 @@ +package megapool + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +type validatorProof struct { + slot uint64 + validatorIndex *big.Int + pubkey []byte + withdrawalCredentials [32]byte + witnesses [][32]byte +} + +type megapoolV1 struct { + Address common.Address + Version uint8 + Contract *rocketpool.Contract + RocketPool *rocketpool.RocketPool +} + +const ( + megapoolV1EncodedAbi string = "" +) + +// The decoded ABI for megapools +var megapoolV1Abi *abi.ABI + +// Create new minipool contract +func newMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { + + var contract *rocketpool.Contract + var err error + if megapoolV1Abi == nil { + // Get contract + contract, err = createMegapoolContractFromEncodedAbi(rp, address, megapoolV1EncodedAbi) + } else { + contract, err = createMegapoolContractFromAbi(rp, address, megapoolV1Abi) + } + if err != nil { + return nil, err + } else if megapoolV1Abi == nil { + megapoolV1Abi = contract.ABI + } + + // Create and return + return &megapoolV1{ + Address: address, + Version: 3, + Contract: contract, + RocketPool: rp, + }, nil +} + +// Get the contract +func (mp *megapoolV1) GetContract() *rocketpool.Contract { + return mp.Contract +} + +// Get the contract address +func (mp *megapoolV1) GetAddress() common.Address { + return mp.Address +} + +// Get the contract version +func (mp *megapoolV1) GetVersion() uint8 { + return mp.Version +} + +func (mp *megapoolV1) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { + nodeAddress := new(common.Address) + if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { + return common.Address{}, fmt.Errorf("error getting megapool %s node address: %w", mp.Address.Hex(), err) + } + return *nodeAddress, nil +} + +// Estimate the gas of Stake +func (mp *megapoolV1) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) +} + +// Progress the prelaunch megapool to staking +func (mp *megapoolV1) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot, validatorProof) + if err != nil { + return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Create a megapool contract directly from its ABI +func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} + +// Create a megapool contract directly from its ABI, encoded in string form +func createMegapoolContractFromEncodedAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { + // Decode ABI + abi, err := rocketpool.DecodeAbi(encodedAbi) + if err != nil { + return nil, fmt.Errorf("error decoding megapool %s ABI: %w", address, err) + } + + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} diff --git a/minipool/minipool.go b/minipool/minipool.go index 9cc191009..292563e29 100644 --- a/minipool/minipool.go +++ b/minipool/minipool.go @@ -616,8 +616,8 @@ func GetMinipoolDepositType(rp *rocketpool.RocketPool, minipoolAddress common.Ad return types.MinipoolDeposit(*value), nil } -// Get contracts -var rocketMinipoolManagerLock sync.Mutex + // Get contracts + var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() diff --git a/node/deposit.go b/node/deposit.go index 57bd2f875..d0604fb53 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -15,21 +15,21 @@ import ( ) // Estimate the gas of Deposit -func EstimateDepositGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateDepositGas(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:], depositDataRoot) } // Make a node deposit -func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { +func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + tx, err := rocketNodeDeposit.Transact(opts, "deposit", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { return nil, fmt.Errorf("error making node deposit: %w", err) } @@ -59,21 +59,21 @@ func WithdrawEth(rp *rocketpool.RocketPool, nodeAccount common.Address, ethAmoun } // Estimate the gas of DepositWithCredit -func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "depositWithCredit", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:], depositDataRoot) } // Make a node deposit by using the credit balance -func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { +func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + tx, err := rocketNodeDeposit.Transact(opts, "depositWithCredit", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:], depositDataRoot) if err != nil { return nil, fmt.Errorf("error making node deposit with credit: %w", err) } @@ -81,21 +81,21 @@ func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNo } // Estimate the gas of CreateVacantMinipool -func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "createVacantMinipool", bondAmount, validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) } // Make a vacant minipool for solo staker migration -func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { +func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) + tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) if err != nil { return nil, fmt.Errorf("error creating vacant minipool: %w", err) } diff --git a/node/node.go b/node/node.go index 494f30a2a..aecfe5eed 100644 --- a/node/node.go +++ b/node/node.go @@ -707,6 +707,41 @@ func ConfirmRPLWithdrawalAddress(rp *rocketpool.RocketPool, nodeAddress common.A return tx.Hash(), nil } +func EstimateDeployMegapool(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeManager.GetTransactionGasInfo(opts, "deployMegapool") +} + +// Deploys a Megapool contract +func DeployMegapool(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return common.Hash{}, nil + } + + tx, err := rocketNodeManager.Transact(opts, "deployMegapool") + if err != nil { + return common.Hash{}, fmt.Errorf("error calling deployMegapool: %w", err) + } + return tx.Hash(), nil +} + +// Get express ticket count for a node +func GetExpressTicketCount(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.CallOpts) (uint64, error) { + rocketMegapoolFactory, err := getRocketNodeManager(rp, opts) + if err != nil { + return 0, err + } + expressTicketCount := new(*big.Int) + if err := rocketMegapoolFactory.Call(opts, expressTicketCount, "getExpressTicketCount", nodeAddress); err != nil { + return 0, fmt.Errorf("error getting express ticket count for node %s: %w", nodeAddress, err) + } + return (*expressTicketCount).Uint64(), nil +} + // Get contracts var rocketNodeManagerLock sync.Mutex From d13918d890962dde210b26e1cc9f47a123719adf Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 11 Dec 2024 18:35:23 +0800 Subject: [PATCH 774/878] Continued work on v1.4 bindings --- megapool/megapool-contract.go | 256 +++++++++++++++++++++++++++++++ megapool/megapool-interface.go | 66 +++----- megapool/megapool.go | 125 --------------- node/deposit.go | 1 - settings/trustednode/minipool.go | 20 +++ 5 files changed, 300 insertions(+), 168 deletions(-) create mode 100644 megapool/megapool-contract.go delete mode 100644 megapool/megapool.go diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go new file mode 100644 index 000000000..b93584040 --- /dev/null +++ b/megapool/megapool-contract.go @@ -0,0 +1,256 @@ +package megapool + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" +) + +type validatorProof struct { + slot uint64 + validatorIndex *big.Int + pubkey []byte + withdrawalCredentials [32]byte + witnesses [][32]byte +} + +type MegapoolV1 interface { + Megapool +} + +// Megapool contract +type megapoolV1 struct { + Address common.Address + Version uint8 + Contract *rocketpool.Contract + RocketPool *rocketpool.RocketPool +} + +const ( + megapoolV1EncodedAbi string = "" +) + +// The decoded ABI for megapools +var megapoolV1Abi *abi.ABI + +// Create new minipool contract +func newMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { + + var contract *rocketpool.Contract + var err error + if megapoolV1Abi == nil { + // Get contract + contract, err = createMegapoolContractFromEncodedAbi(rp, address, megapoolV1EncodedAbi) + } else { + contract, err = createMegapoolContractFromAbi(rp, address, megapoolV1Abi) + } + if err != nil { + return nil, err + } else if megapoolV1Abi == nil { + megapoolV1Abi = contract.ABI + } + + // Create and return + return &megapoolV1{ + Address: address, + Version: 3, + Contract: contract, + RocketPool: rp, + }, nil +} + +// Get the contract +func (mp *megapoolV1) GetContract() *rocketpool.Contract { + return mp.Contract +} + +// Get the contract address +func (mp *megapoolV1) GetAddress() common.Address { + return mp.Address +} + +// Get the contract version +func (mp *megapoolV1) GetVersion() uint8 { + return mp.Version +} + +func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint64, error) { + validatorCount := new(*big.Int) + if err := mp.Contract.Call(opts, validatorCount, "getValidatorCount"); err != nil { + return 0, fmt.Errorf("error getting megapool %s validator count: %w", mp.Address.Hex(), err) + } + return (*validatorCount).Uint64(), nil +} + +//TODO func GetValidatorInfo() + +func (mp *megapoolV1) GetAssignedValue(opts *bind.CallOpts) (uint64, error) { + validatorCount := new(*big.Int) + if err := mp.Contract.Call(opts, validatorCount, "getAssignedValue"); err != nil { + return 0, fmt.Errorf("error getting megapool %s assigned value: %w", mp.Address.Hex(), err) + } + return (*validatorCount).Uint64(), nil +} + +func (mp *megapoolV1) GetDebt(opts *bind.CallOpts) (uint64, error) { + assignedValue := new(*big.Int) + if err := mp.Contract.Call(opts, assignedValue, "getDebt"); err != nil { + return 0, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) + } + return (*assignedValue).Uint64(), nil +} + +func (mp *megapoolV1) GetRefundValue(opts *bind.CallOpts) (uint64, error) { + refundValue := new(*big.Int) + if err := mp.Contract.Call(opts, refundValue, "getRefundValue"); err != nil { + return 0, fmt.Errorf("error getting megapool %s refund value: %w", mp.Address.Hex(), err) + } + return (*refundValue).Uint64(), nil +} + +func (mp *megapoolV1) GetNodeCapital(opts *bind.CallOpts) (uint64, error) { + nodeCapital := new(*big.Int) + if err := mp.Contract.Call(opts, nodeCapital, "getNodeCapital"); err != nil { + return 0, fmt.Errorf("error getting megapool %s node capital: %w", mp.Address.Hex(), err) + } + return (*nodeCapital).Uint64(), nil +} + +func (mp *megapoolV1) GetNodeBond(opts *bind.CallOpts) (uint64, error) { + nodeBond := new(*big.Int) + if err := mp.Contract.Call(opts, nodeBond, "getNodeBond"); err != nil { + return 0, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) + } + return (*nodeBond).Uint64(), nil +} + +func (mp *megapoolV1) GetUserCapital(opts *bind.CallOpts) (uint64, error) { + userCapital := new(*big.Int) + if err := mp.Contract.Call(opts, userCapital, "getUserCapital"); err != nil { + return 0, fmt.Errorf("error getting megapool %s user capital: %w", mp.Address.Hex(), err) + } + return (*userCapital).Uint64(), nil +} + +//TODO _calculateRewards is currently a view in RocketMegapoolDelegate.sol + +func (mp *megapoolV1) GetPendingRewards(opts *bind.CallOpts) (uint64, error) { + pendingRewards := new(*big.Int) + if err := mp.Contract.Call(opts, pendingRewards, "getPendingRewards"); err != nil { + return 0, fmt.Errorf("error getting megapool %s pending rewards: %w", mp.Address.Hex(), err) + } + return (*pendingRewards).Uint64(), nil +} + +func (mp *megapoolV1) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { + nodeAddress := new(common.Address) + if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { + return common.Address{}, fmt.Errorf("error getting megapool %s node address: %w", mp.Address.Hex(), err) + } + return *nodeAddress, nil +} + +// TODO gas estimators for the below functions +func (mp *megapoolV1) NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "newValidator", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:]) + if err != nil { + return common.Hash{}, fmt.Errorf("error creating new validator %s: %w", validatorPubkey.Hex(), err) + } + return tx.Hash(), nil +} + +func (mp *megapoolV1) Dequeue(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "dequeue", validatorId) + if err != nil { + return common.Hash{}, fmt.Errorf("error dequeuing validator ID %d: %w", validatorId, err) + } + return tx.Hash(), nil +} + +func (mp *megapoolV1) AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "assignFunds", validatorId) + if err != nil { + return common.Hash{}, fmt.Errorf("error assigning funds to validator ID %d: %w", validatorId, err) + } + return tx.Hash(), nil +} + +func (mp *megapoolV1) DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "dissolveValidator", validatorId) + if err != nil { + return common.Hash{}, fmt.Errorf("error dissolving validator ID %d: %w", validatorId, err) + } + return tx.Hash(), nil +} + +func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "repayDebt") + if err != nil { + return common.Hash{}, fmt.Errorf("error repaying debt for megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) { + withdrawalCredentials := make([]byte, 32) + if err := mp.Contract.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { + return nil, fmt.Errorf("error getting megapool %s withdrawal credentials: %w", mp.Address.Hex(), err) + } + return withdrawalCredentials, nil +} + +// RequestUnstakeRPL is not yet implemented in RocketMegapoolDelegate.sol +func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "requestUnstakeRPL") + if err != nil { + return common.Hash{}, fmt.Errorf("error requesting unstake rpl for megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Estimate the gas of Stake +func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], validatorSignature[:], depositDataRoot) +} + +// Progress the prelaunch megapool to staking +func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot, validatorProof) + if err != nil { + return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Create a megapool contract directly from its ABI +func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} + +// Create a megapool contract directly from its ABI, encoded in string form +func createMegapoolContractFromEncodedAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { + // Decode ABI + abi, err := rocketpool.DecodeAbi(encodedAbi) + if err != nil { + return nil, fmt.Errorf("error decoding megapool %s ABI: %w", address, err) + } + + // Create and return + return &rocketpool.Contract{ + Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), + Address: &address, + ABI: abi, + Client: rp.Client, + }, nil +} diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index e8e0f273e..b593649f7 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -1,54 +1,36 @@ package megapool import ( + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" ) type Megapool interface { GetContract() *rocketpool.Contract GetAddress() common.Address GetVersion() uint8 - //GetStatusDetails(opts *bind.CallOpts) (StatusDetails, error) - //GetStatus(opts *bind.CallOpts) (rptypes.MinipoolStatus, error) - // GetStatusBlock(opts *bind.CallOpts) (uint64, error) - // GetStatusTime(opts *bind.CallOpts) (time.Time, error) - // GetFinalised(opts *bind.CallOpts) (bool, error) - //GetDepositType(opts *bind.CallOpts) (rptypes.MinipoolDeposit, error) - //GetNodeDetails(opts *bind.CallOpts) (NodeDetails, error) - // GetNodeAddress(opts *bind.CallOpts) (common.Address, error) - // GetNodeFee(opts *bind.CallOpts) (float64, error) - // GetNodeFeeRaw(opts *bind.CallOpts) (*big.Int, error) - // GetNodeDepositBalance(opts *bind.CallOpts) (*big.Int, error) - // GetNodeRefundBalance(opts *bind.CallOpts) (*big.Int, error) - // GetNodeDepositAssigned(opts *bind.CallOpts) (bool, error) - // GetUserDetails(opts *bind.CallOpts) (UserDetails, error) - // GetUserDepositBalance(opts *bind.CallOpts) (*big.Int, error) - // GetUserDepositAssigned(opts *bind.CallOpts) (bool, error) - // GetUserDepositAssignedTime(opts *bind.CallOpts) (time.Time, error) - // EstimateRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // Refund(opts *bind.TransactOpts) (common.Hash, error) - //EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - //Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (common.Hash, error) - // EstimateDissolveGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // Dissolve(opts *bind.TransactOpts) (common.Hash, error) - // EstimateCloseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // Close(opts *bind.TransactOpts) (common.Hash, error) - // EstimateFinaliseGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // Finalise(opts *bind.TransactOpts) (common.Hash, error) - // EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) - // EstimateDelegateRollbackGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // DelegateRollback(opts *bind.TransactOpts) (common.Hash, error) - // EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) - // GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) - // GetDelegate(opts *bind.CallOpts) (common.Address, error) - // GetPreviousDelegate(opts *bind.CallOpts) (common.Address, error) - // GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) - // CalculateNodeShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) - // CalculateUserShare(balance *big.Int, opts *bind.CallOpts) (*big.Int, error) - // EstimateVoteScrubGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) - // VoteScrub(opts *bind.TransactOpts) (common.Hash, error) - //GetPrestakeEvent(intervalSize *big.Int, opts *bind.CallOpts) (PrestakeData, error) + GetValidatorCount(opts *bind.CallOpts) (uint64, error) + GetAssignedValue(opts *bind.CallOpts) (uint64, error) + GetDebt(opts *bind.CallOpts) (uint64, error) + GetRefundValue(opts *bind.CallOpts) (uint64, error) + GetNodeCapital(opts *bind.CallOpts) (uint64, error) + GetNodeBond(opts *bind.CallOpts) (uint64, error) + GetUserCapital(opts *bind.CallOpts) (uint64, error) + // CalculateRewards (not yet implemented) + GetPendingRewards(opts *bind.CallOpts) (uint64, error) + GetNodeAddress(opts *bind.CallOpts) (common.Address, error) + // The functions below require gas estimators + NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) + Dequeue(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + RepayDebt(opts *bind.TransactOpts) (common.Hash, error) + GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) + RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) + EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) } diff --git a/megapool/megapool.go b/megapool/megapool.go deleted file mode 100644 index 278c9357c..000000000 --- a/megapool/megapool.go +++ /dev/null @@ -1,125 +0,0 @@ -package megapool - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" -) - -type validatorProof struct { - slot uint64 - validatorIndex *big.Int - pubkey []byte - withdrawalCredentials [32]byte - witnesses [][32]byte -} - -type megapoolV1 struct { - Address common.Address - Version uint8 - Contract *rocketpool.Contract - RocketPool *rocketpool.RocketPool -} - -const ( - megapoolV1EncodedAbi string = "" -) - -// The decoded ABI for megapools -var megapoolV1Abi *abi.ABI - -// Create new minipool contract -func newMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { - - var contract *rocketpool.Contract - var err error - if megapoolV1Abi == nil { - // Get contract - contract, err = createMegapoolContractFromEncodedAbi(rp, address, megapoolV1EncodedAbi) - } else { - contract, err = createMegapoolContractFromAbi(rp, address, megapoolV1Abi) - } - if err != nil { - return nil, err - } else if megapoolV1Abi == nil { - megapoolV1Abi = contract.ABI - } - - // Create and return - return &megapoolV1{ - Address: address, - Version: 3, - Contract: contract, - RocketPool: rp, - }, nil -} - -// Get the contract -func (mp *megapoolV1) GetContract() *rocketpool.Contract { - return mp.Contract -} - -// Get the contract address -func (mp *megapoolV1) GetAddress() common.Address { - return mp.Address -} - -// Get the contract version -func (mp *megapoolV1) GetVersion() uint8 { - return mp.Version -} - -func (mp *megapoolV1) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { - nodeAddress := new(common.Address) - if err := mp.Contract.Call(opts, nodeAddress, "getNodeAddress"); err != nil { - return common.Address{}, fmt.Errorf("error getting megapool %s node address: %w", mp.Address.Hex(), err) - } - return *nodeAddress, nil -} - -// Estimate the gas of Stake -func (mp *megapoolV1) EstimateStakeGas(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], depositDataRoot) -} - -// Progress the prelaunch megapool to staking -func (mp *megapoolV1) Stake(validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) { - tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot, validatorProof) - if err != nil { - return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) - } - return tx.Hash(), nil -} - -// Create a megapool contract directly from its ABI -func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { - // Create and return - return &rocketpool.Contract{ - Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), - Address: &address, - ABI: abi, - Client: rp.Client, - }, nil -} - -// Create a megapool contract directly from its ABI, encoded in string form -func createMegapoolContractFromEncodedAbi(rp *rocketpool.RocketPool, address common.Address, encodedAbi string) (*rocketpool.Contract, error) { - // Decode ABI - abi, err := rocketpool.DecodeAbi(encodedAbi) - if err != nil { - return nil, fmt.Errorf("error decoding megapool %s ABI: %w", address, err) - } - - // Create and return - return &rocketpool.Contract{ - Contract: bind.NewBoundContract(address, *abi, rp.Client, rp.Client, rp.Client), - Address: &address, - ABI: abi, - Client: rp.Client, - }, nil -} diff --git a/node/deposit.go b/node/deposit.go index d0604fb53..67756c7cd 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -11,7 +11,6 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Estimate the gas of Deposit diff --git a/settings/trustednode/minipool.go b/settings/trustednode/minipool.go index 6e98e806a..feedcd930 100644 --- a/settings/trustednode/minipool.go +++ b/settings/trustednode/minipool.go @@ -15,6 +15,7 @@ import ( // Config const ( MinipoolSettingsContractName = "rocketDAONodeTrustedSettingsMinipool" + DissolvePeriodPath = "megapool.dissolve.period" ScrubPeriodPath = "minipool.scrub.period" PromotionScrubPeriodPath = "minipool.promotion.scrub.period" ScrubPenaltyEnabledPath = "minipool.scrub.penalty.enabled" @@ -117,6 +118,25 @@ func EstimateProposeBondReductionWindowLengthGas(rp *rocketpool.RocketPool, valu return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", BondReductionWindowLengthPath), MinipoolSettingsContractName, BondReductionWindowLengthPath, big.NewInt(int64(value)), opts) } +// The amount of time, in seconds, how long after assignment before a validator can be dissolved +func GetDissolvePeriod(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMinipoolSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(*big.Int) + if err := minipoolSettingsContract.Call(opts, value, "getDissolvePeriod"); err != nil { + return 0, fmt.Errorf("error getting dissolve period: %w", err) + } + return (*value).Uint64(), nil +} +func ProposeDissolvePeriod(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return trustednodedao.ProposeSetUint(rp, fmt.Sprintf("set %s", DissolvePeriodPath), MinipoolSettingsContractName, DissolvePeriodPath, big.NewInt(int64(value)), opts) +} +func EstimateProposeDissolvePeriodGas(rp *rocketpool.RocketPool, value uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return trustednodedao.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DissolvePeriodPath), MinipoolSettingsContractName, DissolvePeriodPath, big.NewInt(int64(value)), opts) +} + // Get contracts var minipoolSettingsContractLock sync.Mutex From ce6fe0c68bf55d42a26857f0863f9a227c26a9de Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Thu, 12 Dec 2024 12:46:21 +0800 Subject: [PATCH 775/878] Added gas estimator calls --- megapool/megapool-contract.go | 40 ++++++++++++++++++++++++++++++++-- megapool/megapool-interface.go | 6 +++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index b93584040..4dc0ec4dc 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -155,7 +155,12 @@ func (mp *megapoolV1) GetNodeAddress(opts *bind.CallOpts) (common.Address, error return *nodeAddress, nil } -// TODO gas estimators for the below functions +// Estimate the gas required to create a new validator as part of a megapool +func (mp *megapoolV1) EstimateNewValidatorGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "newValidator", validatorId, validatorSignature[:], depositDataRoot) +} + +// Create a new validator as part of a megapool func (mp *megapoolV1) NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "newValidator", bondAmount, useExpressTicket, validatorPubkey[:], validatorSignature[:]) if err != nil { @@ -164,6 +169,12 @@ func (mp *megapoolV1) NewValidator(bondAmount *big.Int, useExpressTicket bool, v return tx.Hash(), nil } +// Estimate the gas required to remove a validator from the deposit queue +func (mp *megapoolV1) EstimateDequeueGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "dequeue", validatorId) +} + +// Remove a validator from the deposit queue func (mp *megapoolV1) Dequeue(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dequeue", validatorId) if err != nil { @@ -172,6 +183,12 @@ func (mp *megapoolV1) Dequeue(validatorId uint32, opts *bind.TransactOpts) (comm return tx.Hash(), nil } +// Estimate the gas required to accept requested funds from the deposit pool +func (mp *megapoolV1) EstimateAssignFundsGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "assignFunds", validatorId) +} + +// Accept requested funds from the deposit pool func (mp *megapoolV1) AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "assignFunds", validatorId) if err != nil { @@ -180,6 +197,12 @@ func (mp *megapoolV1) AssignFunds(validatorId uint32, opts *bind.TransactOpts) ( return tx.Hash(), nil } +// Estimate the gas required to dissolve a validator that has not staked within the required period +func (mp *megapoolV1) EstimateDissolveValidatorGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "dissolveValidator", validatorId) +} + +// Dissolve a validator that has not staked within the required period func (mp *megapoolV1) DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "dissolveValidator", validatorId) if err != nil { @@ -188,6 +211,12 @@ func (mp *megapoolV1) DissolveValidator(validatorId uint32, opts *bind.TransactO return tx.Hash(), nil } +// Estimate the gas required to repay megapool debt +func (mp *megapoolV1) EstimateRepayDebtGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "repayDebt") +} + +// Receive ETH, which is sent to the rETH contract, to repay a megapool debt func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "repayDebt") if err != nil { @@ -196,6 +225,7 @@ func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Get the expected withdrawal credentials for any validator within this megapool func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) { withdrawalCredentials := make([]byte, 32) if err := mp.Contract.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { @@ -204,7 +234,13 @@ func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, err return withdrawalCredentials, nil } +// Estimate the gas required to Request RPL previously staked on this megapool to be unstaked +func (mp *megapoolV1) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "requestUnstakeRPL") +} + // RequestUnstakeRPL is not yet implemented in RocketMegapoolDelegate.sol +// Request RPL previously staked on this megapool to be unstaked func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "requestUnstakeRPL") if err != nil { @@ -215,7 +251,7 @@ func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, e // Estimate the gas of Stake func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorSignature[:], validatorSignature[:], depositDataRoot) + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorSignature[:], depositDataRoot) } // Progress the prelaunch megapool to staking diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index b593649f7..28a83aaaf 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -24,12 +24,18 @@ type Megapool interface { GetPendingRewards(opts *bind.CallOpts) (uint64, error) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) // The functions below require gas estimators + EstimateNewValidatorGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) + EstimateDequeueGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Dequeue(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + EstimateAssignFundsGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + EstimateDissolveValidatorGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + EstimateRepayDebtGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) + EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) From cd2017b46536b8265293d2ac02075711c1ae6a61 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Thu, 12 Dec 2024 16:01:58 +0800 Subject: [PATCH 776/878] Added bindings for rocketNodeStaking and rocketNodeManager --- node/node.go | 14 ++++++++++++++ node/staking.go | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/node/node.go b/node/node.go index aecfe5eed..f404bca3f 100644 --- a/node/node.go +++ b/node/node.go @@ -742,6 +742,20 @@ func GetExpressTicketCount(rp *rocketpool.RocketPool, nodeAddress common.Address return (*expressTicketCount).Uint64(), nil } +// Consume an express ticket for the given node operator +func UseExpressTicket(rp *rocketpool.RocketPool, nodeAddress common.Address, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeManager, err := getRocketNodeManager(rp, nil) + if err != nil { + return common.Hash{}, nil + } + + tx, err := rocketNodeManager.Transact(opts, "useExpressTicket") + if err != nil { + return common.Hash{}, fmt.Errorf("error calling useExpressticket: %w", err) + } + return tx.Hash(), nil +} + // Get contracts var rocketNodeManagerLock sync.Mutex diff --git a/node/staking.go b/node/staking.go index a1cfa1e13..257091809 100644 --- a/node/staking.go +++ b/node/staking.go @@ -158,6 +158,29 @@ func StakeRPL(rp *rocketpool.RocketPool, rplAmount *big.Int, opts *bind.Transact return tx.Hash(), nil } +// Estimate the gas of Burn RPL +func EstimateBurnRpl(rp *rocketpool.RocketPool, from common.Address, rplAmount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeStaking.GetTransactionGasInfo(opts, "burnRPL", from, rplAmount) +} + +// Burn RPL +func BurnRPL(rp *rocketpool.RocketPool, from common.Address, rplAmount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + rocketNodeStaking, err := getRocketNodeStaking(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketNodeStaking.Transact(opts, "burnRPL", from, rplAmount) + if err != nil { + return common.Hash{}, fmt.Errorf("error burning RPL: %w", err) + } + return tx.Hash(), nil + +} + // Estimate the gas of set RPL locking allowed func EstimateSetRPLLockingAllowedGas(rp *rocketpool.RocketPool, caller common.Address, allowed bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeStaking, err := getRocketNodeStaking(rp, nil) From 8d3ab0d666b65a8ec5ab22466deb287a391ab32f Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Mon, 16 Dec 2024 18:50:53 +0800 Subject: [PATCH 777/878] RocketNodeDeposit and LinkedListStorage bindings --- megapool/megapool-interface.go | 1 - node/deposit.go | 13 ++++++ storage/linked-list-storage.go | 79 ++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 storage/linked-list-storage.go diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 28a83aaaf..69e30fd4b 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -23,7 +23,6 @@ type Megapool interface { // CalculateRewards (not yet implemented) GetPendingRewards(opts *bind.CallOpts) (uint64, error) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) - // The functions below require gas estimators EstimateNewValidatorGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) EstimateDequeueGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) diff --git a/node/deposit.go b/node/deposit.go index 67756c7cd..24f2ee51e 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -171,6 +171,19 @@ func GetNodeUsableCredit(rp *rocketpool.RocketPool, nodeAddress common.Address, return *usableCredit, nil } +func GetBondRequirement(rp *rocketpool.RocketPool, numValidators *big.Int, opts *bind.CallOpts) (*big.Int, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, opts) + if err != nil { + return nil, err + } + + bondRequirement := new(*big.Int) + if err := rocketNodeDeposit.Call(opts, bondRequirement, "getBondRequirement", numValidators); err != nil { + return nil, fmt.Errorf("error getting the bond requirement: %w", err) + } + return *bondRequirement, nil +} + // Get contracts var rocketNodeDepositLock sync.Mutex diff --git a/storage/linked-list-storage.go b/storage/linked-list-storage.go new file mode 100644 index 000000000..4a9e1674e --- /dev/null +++ b/storage/linked-list-storage.go @@ -0,0 +1,79 @@ +package storage + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +type DepositQueueValue struct { + Receiver common.Address + ValidatorID uint32 + SuppliedValue uint32 + RequestedValue uint32 +} + +// Return the number of items in queue +func GetListLength(rp *rocketpool.RocketPool, namespace [32]byte, opts *bind.CallOpts) (*big.Int, error) { + linkedListStorage, err := getLinkedListStorage(rp, opts) + if err != nil { + return nil, err + } + length := new(*big.Int) + if err := linkedListStorage.Call(opts, length, "getLength", namespace); err != nil { + return nil, fmt.Errorf("error getting address queue length for namespace %s: %w", namespace, err) + } + return *length, nil +} + +// Return the item in queue by index +func GetListItem(rp *rocketpool.RocketPool, namespace [32]byte, index *big.Int, opts *bind.CallOpts) (DepositQueueValue, error) { + linkedListStorage, err := getLinkedListStorage(rp, opts) + if err != nil { + return DepositQueueValue{}, err + } + item := DepositQueueValue{} + if err := linkedListStorage.Call(opts, item, "getItem", namespace, index); err != nil { + return DepositQueueValue{}, fmt.Errorf("error getting item at index %s for namespace %s: %w", index, namespace, err) + } + return item, nil +} + +// Returns the item from the start of the queue without removing it +func PeekListItem(rp *rocketpool.RocketPool, namespace [32]byte, opts *bind.CallOpts) (DepositQueueValue, error) { + linkedListStorage, err := getLinkedListStorage(rp, opts) + if err != nil { + return DepositQueueValue{}, err + } + item := DepositQueueValue{} + if err := linkedListStorage.Call(opts, item, "peekItem", namespace); err != nil { + return DepositQueueValue{}, fmt.Errorf("error getting peeking the item for namespace %s: %w", namespace, err) + } + return item, nil +} + +// Returns the index of an item in queue. Returns 0 if the value is not found +func GetListQueueIndexOf(rp *rocketpool.RocketPool, namespace [32]byte, value DepositQueueValue, opts *bind.CallOpts) (*big.Int, error) { + linkedListStorage, err := getLinkedListStorage(rp, opts) + if err != nil { + return nil, err + } + queueIndex := new(*big.Int) + if err := linkedListStorage.Call(opts, queueIndex, "getIndexOf", namespace, value); err != nil { + return nil, fmt.Errorf("error getting linked list queue for namespace %s: %w", namespace, err) + } + return *queueIndex, nil +} + +// Get contracts +var LinkedListStorageLock sync.Mutex + +func getLinkedListStorage(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + LinkedListStorageLock.Lock() + defer LinkedListStorageLock.Unlock() + return rp.GetContract("linkedListStorage", opts) +} From e1dcbd90b8c52758dc4d4c0b8e641e47d8363dda Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 17 Dec 2024 14:51:57 +0800 Subject: [PATCH 778/878] Add beaconStateVerifier bindings --- megapool/beacon-state-verifier.go | 54 +++++++++++++++++++++++++++++++ megapool/megapool-contract.go | 7 ++++ 2 files changed, 61 insertions(+) create mode 100644 megapool/beacon-state-verifier.go diff --git a/megapool/beacon-state-verifier.go b/megapool/beacon-state-verifier.go new file mode 100644 index 000000000..84330f6b8 --- /dev/null +++ b/megapool/beacon-state-verifier.go @@ -0,0 +1,54 @@ +package megapool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func verifyValidator(rp *rocketpool.RocketPool, proof validatorProof, opts *bind.CallOpts) (bool, error) { + beaconStateVerifier, err := getBeaconStateVerifier(rp, opts) + if err != nil { + return false, err + } + verifiedValidator := new(bool) + if err := beaconStateVerifier.Call(opts, verifiedValidator, "verifyValidator"); err != nil { + return false, fmt.Errorf("error verifying validatorindex %d at slot %d: %w", proof.validatorIndex, proof.slot, err) + } + return *verifiedValidator, nil +} + +func verifyExit(rp *rocketpool.RocketPool, validatorIndex *big.Int, withdrawableEpoch *big.Int, slot uint64, proof [][32]byte, opts *bind.CallOpts) (bool, error) { + beaconStateVerifier, err := getBeaconStateVerifier(rp, opts) + if err != nil { + return false, err + } + verifiedExit := new(bool) + if err := beaconStateVerifier.Call(opts, verifiedExit, "verifyExit", validatorIndex, withdrawableEpoch, slot, proof); err != nil { + return false, fmt.Errorf("error verifying exit of validator index %d at slot %d: %w", validatorIndex.Int64(), slot, err) + } + return *verifiedExit, nil +} + +func verifyWithdrawal(rp *rocketpool.RocketPool, validatorIndex *big.Int, withdrawalSlot uint64, withdrawalNum *big.Int, withdrawal withdrawal, slot uint64, proof [][32]byte, opts *bind.CallOpts) (bool, error) { + beaconStateVerifier, err := getBeaconStateVerifier(rp, opts) + if err != nil { + return false, err + } + verifiedWithdrawal := new(bool) + if err := beaconStateVerifier.Call(opts, verifiedWithdrawal, "verifyWithdrawal", validatorIndex, withdrawalSlot, withdrawalNum, withdrawal, slot, proof, opts); err != nil { + return false, fmt.Errorf("error verifying withdrawal of validator index %d at withdrawalSlot %d: %w", validatorIndex.Int64(), withdrawalSlot, err) + } + return *verifiedWithdrawal, nil +} + +var BeaconStateVerifierLock sync.Mutex + +func getBeaconStateVerifier(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + BeaconStateVerifierLock.Lock() + defer BeaconStateVerifierLock.Unlock() + return rp.GetContract("beaconStateVerifierLock", opts) +} diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 4dc0ec4dc..c16cea4b7 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -19,6 +19,13 @@ type validatorProof struct { witnesses [][32]byte } +type withdrawal struct { + index *big.Int + validatorIndex *big.Int + withdrawalCredentials [32]byte + amountInGwei *big.Int +} + type MegapoolV1 interface { Megapool } From afc371e9c9bde264ad42b4616f8fa9175a4562aa Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:41:47 -0300 Subject: [PATCH 779/878] Remove salt and expected minipool address from deposit --- megapool/megapool-contract.go | 2 +- node/deposit.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index c16cea4b7..c1b525c8b 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -46,7 +46,7 @@ const ( var megapoolV1Abi *abi.ABI // Create new minipool contract -func newMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { +func NewMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { var contract *rocketpool.Contract var err error diff --git a/node/deposit.go b/node/deposit.go index 24f2ee51e..038097cc9 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -58,7 +58,7 @@ func WithdrawEth(rp *rocketpool.RocketPool, nodeAccount common.Address, ethAmoun } // Estimate the gas of DepositWithCredit -func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err @@ -67,7 +67,7 @@ func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int } // Make a node deposit by using the credit balance -func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { +func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err From fee196315f60f8dfeecfbb3961f52dfe7c2031b5 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:36:47 -0300 Subject: [PATCH 780/878] Add legacy v1.3.1 --- legacy/v1.3.1/node/deposit.go | 67 +++++++++++++++++++++++++++++++++++ node/deposit.go | 9 ++--- 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 legacy/v1.3.1/node/deposit.go diff --git a/legacy/v1.3.1/node/deposit.go b/legacy/v1.3.1/node/deposit.go new file mode 100644 index 000000000..480b20807 --- /dev/null +++ b/legacy/v1.3.1/node/deposit.go @@ -0,0 +1,67 @@ +package node + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/rocketpool-go/rocketpool" + rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" +) + +// Estimate the gas of Deposit +func EstimateDepositGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) +} + +// Make a node deposit +func Deposit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "deposit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + if err != nil { + return nil, fmt.Errorf("error making node deposit: %w", err) + } + return tx, nil +} + +// Estimate the gas of DepositWithCredit +func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketNodeDeposit.GetTransactionGasInfo(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) +} + +// Make a node deposit by using the credit balance +func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, salt *big.Int, expectedMinipoolAddress common.Address, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketNodeDeposit.Transact(opts, "depositWithCredit", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], validatorSignature[:], depositDataRoot, salt, expectedMinipoolAddress) + if err != nil { + return nil, fmt.Errorf("error making node deposit with credit: %w", err) + } + return tx, nil +} + +// Get contracts +var rocketNodeDepositLock sync.Mutex + +func getRocketNodeDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNodeDepositLock.Lock() + defer rocketNodeDepositLock.Unlock() + return rp.GetContract("rocketNodeDeposit", opts) +} diff --git a/node/deposit.go b/node/deposit.go index 038097cc9..d29f06569 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -11,6 +11,7 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/rocketpool-go/utils/eth" ) // Estimate the gas of Deposit @@ -80,21 +81,21 @@ func DepositWithCredit(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpres } // Estimate the gas of CreateVacantMinipool -func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateCreateVacantMinipoolGas(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketNodeDeposit.GetTransactionGasInfo(opts, "createVacantMinipool", bondAmount, validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) + return rocketNodeDeposit.GetTransactionGasInfo(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) } // Make a vacant minipool for solo staker migration -func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { +func CreateVacantMinipool(rp *rocketpool.RocketPool, bondAmount *big.Int, minimumNodeFee float64, validatorPubkey rptypes.ValidatorPubkey, salt *big.Int, expectedMinipoolAddress common.Address, currentBalance *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) if err != nil { return nil, err } - tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) + tx, err := rocketNodeDeposit.Transact(opts, "createVacantMinipool", bondAmount, eth.EthToWei(minimumNodeFee), validatorPubkey[:], salt, expectedMinipoolAddress, currentBalance) if err != nil { return nil, fmt.Errorf("error creating vacant minipool: %w", err) } From 88e4c1f13ec650311bfb1281c6079147891168d7 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:22:10 -0300 Subject: [PATCH 781/878] Bool pointer --- megapool/factory.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/megapool/factory.go b/megapool/factory.go index e1600cc73..b3b431cbf 100644 --- a/megapool/factory.go +++ b/megapool/factory.go @@ -16,11 +16,11 @@ func GetMegapoolDeployed(rp *rocketpool.RocketPool, nodeAddress common.Address, if err != nil { return false, err } - deployed := false + deployed := new(bool) if err := rocketMegapoolFactory.Call(opts, deployed, "getMegapoolDeployed", nodeAddress); err != nil { return false, fmt.Errorf("error getting megapool deployed for node %s: %w", nodeAddress, err) } - return deployed, nil + return *deployed, nil } // Get a megapool expected address From eca37b0460249d650b759ccf7e1ca8a8b3446ed1 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:52:42 -0300 Subject: [PATCH 782/878] Add Saturn 1 to version checker --- utils/version-checker.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/utils/version-checker.go b/utils/version-checker.go index efb319ea3..1260415f4 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -11,6 +11,15 @@ import ( ) func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) + if err != nil { + return nil, fmt.Errorf("error checking node manager version: %w", err) + } + + // Check for v1.4 (Saturn 1) + if nodeMgrVersion > 4 { + return version.NewSemver("1.4.0") + } // Check for v1.3.1 (Houston Hotfix) networkVotingVersion, err := network.GetRocketNetworkVotingVersion(rp, opts) @@ -21,12 +30,6 @@ func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version return version.NewSemver("1.3.1") } - nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) - if err != nil { - return nil, fmt.Errorf("error checking node manager version: %w", err) - } - - // Check for v1.3 (Houston) if nodeMgrVersion > 3 { return version.NewSemver("1.3.0") } From 2ded9804005859a98c98b32bf0ed2a2579852677 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:10:14 -0300 Subject: [PATCH 783/878] GetWithdrawalCredentials as common.Hash --- megapool/megapool-contract.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index c1b525c8b..1f969525a 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -233,12 +233,12 @@ func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { } // Get the expected withdrawal credentials for any validator within this megapool -func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) { - withdrawalCredentials := make([]byte, 32) +func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) { + withdrawalCredentials := new(common.Hash) if err := mp.Contract.Call(opts, withdrawalCredentials, "getWithdrawalCredentials"); err != nil { - return nil, fmt.Errorf("error getting megapool %s withdrawal credentials: %w", mp.Address.Hex(), err) + return common.Hash{}, fmt.Errorf("error getting megapool %s withdrawal credentials: %w", mp.Address.Hex(), err) } - return withdrawalCredentials, nil + return *withdrawalCredentials, nil } // Estimate the gas required to Request RPL previously staked on this megapool to be unstaked From 91c9b2f90aa5f0fa7310eed13eee937ec4531baa Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:15:36 -0300 Subject: [PATCH 784/878] Fix interface --- megapool/megapool-interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 69e30fd4b..cf418e743 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -33,7 +33,7 @@ type Megapool interface { DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) EstimateRepayDebtGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) - GetWithdrawalCredentials(opts *bind.CallOpts) ([]byte, error) + GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 11d0351dea2668e3c7a366e2713b3376bffc3fca Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 19 Dec 2024 15:13:49 -0300 Subject: [PATCH 785/878] Added megapool encodedABI --- megapool/megapool-contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 1f969525a..a2fcf5e07 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -39,7 +39,7 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "" + megapoolV1EncodedAbi string = "eJztWE1v2zAM/SuDz8EO3dZDb/0aUKwdsrTdDkVQ0BaTCbUlT6KSBkX/++jYie3Yjp02aXPoLYmopyeSeiRz9+RJFTuy3tFd8pHQKAhvZjF6R16gFRkI6NNABw9I16QNjPEiMRpBgF7PUxAlhvemaHAshEFreZlSHMh+eB72PEtAeOUIfBlKmvGq0iqGGfgh5jv4ZEvGBQzoPfeePGCjWaQd0xxBaLFXZi3wEYV3xDvmK6VLwJJNRjbCMcRahzX8em1gjr8ffDvMwSYQSgFM80LkeAurEt6S93pAkhHWIA2XBlcZ/d+Lk4+tlWOFhfNxgoo+/NbitzP859B9+G1Tv52rZr81a0mC/OWgIBmNN2GrwvEwz+7vTonEpdpRdkCtlFR0ZORUQFKrMrkcPQhBRu24dRLVBi0wNhgw0jbht+ZWkSb/fnKT1upwgsuM21GAJJcY6bvtRijHHyMtpJlvsuLrWmeVHmb9o6xSm0icbkTqDH3aFy7nj7E0kBidhNxC7Autn1oUupg1lCpi37XpeRGlE63EPrnoFGJJEO4LpT4qIdV4gFMwoiVwb8dqgGy0Xwpwa9HsWeyWWn+qnXpPedpaFSte6kKN9MqdAh3FWnHfVHuoPyMsqErs/B84y09Ll1Pea8mGYLMiFPFRN5VeL6HcDWWQNAyW8lr2OpRMylpB/LRxXjSDHLBJ4fD5ausufJRUbFe77ZLqV9Yhbbitz7JP8PACmnFSMPhxbsx10TFVNg4rA0A6VmcT/aK3zwb3S5hxin5eTdvKKyMXcyO0pZf/R9JfYWAK4alBwVkqeXBZLwDz9C+m1srLyB7iFgWgJDf3PifvcZQJVe0MtiZW987ieRrqG5kEoUOwy2qQK1Df+Q+ddKER4ZqlAcgZ7ApSkkKecbSVdAYEA62pPgyZscLpjht6g7yl0t2+ZlDskAvQlAdFXnPRu1VzWRj0L3c+dZUpitQlzQRtzVDwvsNgewbbHSdur61EJ1QPv+aYNtQrXubVhrLY8JdO8tdNN0WptAcbyEDREdMG8a3xRj3U3bAEpljVsArAVs2laKkKfaP1qBCkOPteqToLj2dV9i3fUofnvotXnqO7nahIjj9BY5Plt+3Ah/8BcMhg6g==" ) // The decoded ABI for megapools From 40d6897e90906b94f893975f1e30092b0a1fa188 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:45:23 -0300 Subject: [PATCH 786/878] Add GetRocketDepositPoolVersion --- deposit/deposit.go | 8 ++++++++ utils/version-checker.go | 12 +++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/deposit/deposit.go b/deposit/deposit.go index 83e88467c..37d046a1a 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -102,3 +102,11 @@ func getRocketDepositPool(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rock defer rocketDepositPoolLock.Unlock() return rp.GetContract("rocketDepositPool", opts) } + +func GetRocketDepositPoolVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint8, error) { + rocketDepositPool, err := getRocketDepositPool(rp, opts) + if err != nil { + return 0, err + } + return rocketpool.GetContractVersion(rp, *rocketDepositPool.Address, opts) +} diff --git a/utils/version-checker.go b/utils/version-checker.go index 1260415f4..2ebb3dccc 100644 --- a/utils/version-checker.go +++ b/utils/version-checker.go @@ -5,22 +5,28 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/hashicorp/go-version" + "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" ) func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { - nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) + depositPoolVersion, err := deposit.GetRocketDepositPoolVersion(rp, opts) if err != nil { - return nil, fmt.Errorf("error checking node manager version: %w", err) + return nil, fmt.Errorf("error checking deposit pool version: %w", err) } // Check for v1.4 (Saturn 1) - if nodeMgrVersion > 4 { + if depositPoolVersion > 3 { return version.NewSemver("1.4.0") } + nodeMgrVersion, err := node.GetNodeManagerVersion(rp, opts) + if err != nil { + return nil, fmt.Errorf("error checking node manager version: %w", err) + } + // Check for v1.3.1 (Houston Hotfix) networkVotingVersion, err := network.GetRocketNetworkVotingVersion(rp, opts) if err != nil { From 1fa6fd0f39f267fb58ea7c9200ea813dc95b5195 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:58:26 -0300 Subject: [PATCH 787/878] Fix GetMegapoolExpectedAddress --- megapool/factory.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/factory.go b/megapool/factory.go index b3b431cbf..9e0a202c7 100644 --- a/megapool/factory.go +++ b/megapool/factory.go @@ -30,7 +30,7 @@ func GetMegapoolExpectedAddress(rp *rocketpool.RocketPool, nodeAddress common.Ad return common.Address{}, err } expectedAddress := common.Address{} - if err := rocketMegapoolFactory.Call(opts, expectedAddress, "getExpectedAddress", nodeAddress); err != nil { + if err := rocketMegapoolFactory.Call(opts, &expectedAddress, "getExpectedAddress", nodeAddress); err != nil { return common.Address{}, fmt.Errorf("error getting megapool expected address for node %s: %w", nodeAddress, err) } return expectedAddress, nil From b678db1a446f30ef55294336e318c3cde777497b Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:50:18 -0300 Subject: [PATCH 788/878] Fix megapool types --- megapool/megapool-contract.go | 52 +++++++++++++++++----------------- megapool/megapool-interface.go | 14 ++++----- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index a2fcf5e07..2897685ff 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -65,7 +65,7 @@ func NewMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind // Create and return return &megapoolV1{ Address: address, - Version: 3, + Version: 1, Contract: contract, RocketPool: rp, }, nil @@ -96,62 +96,62 @@ func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint64, error) { //TODO func GetValidatorInfo() -func (mp *megapoolV1) GetAssignedValue(opts *bind.CallOpts) (uint64, error) { - validatorCount := new(*big.Int) - if err := mp.Contract.Call(opts, validatorCount, "getAssignedValue"); err != nil { - return 0, fmt.Errorf("error getting megapool %s assigned value: %w", mp.Address.Hex(), err) +func (mp *megapoolV1) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) { + assignedValue := new(*big.Int) + if err := mp.Contract.Call(opts, assignedValue, "getAssignedValue"); err != nil { + return nil, fmt.Errorf("error getting megapool %s assigned value: %w", mp.Address.Hex(), err) } - return (*validatorCount).Uint64(), nil + return *assignedValue, nil } -func (mp *megapoolV1) GetDebt(opts *bind.CallOpts) (uint64, error) { - assignedValue := new(*big.Int) - if err := mp.Contract.Call(opts, assignedValue, "getDebt"); err != nil { - return 0, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) +func (mp *megapoolV1) GetDebt(opts *bind.CallOpts) (*big.Int, error) { + debt := new(*big.Int) + if err := mp.Contract.Call(opts, debt, "getDebt"); err != nil { + return nil, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) } - return (*assignedValue).Uint64(), nil + return *debt, nil } -func (mp *megapoolV1) GetRefundValue(opts *bind.CallOpts) (uint64, error) { +func (mp *megapoolV1) GetRefundValue(opts *bind.CallOpts) (*big.Int, error) { refundValue := new(*big.Int) if err := mp.Contract.Call(opts, refundValue, "getRefundValue"); err != nil { - return 0, fmt.Errorf("error getting megapool %s refund value: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting megapool %s refund value: %w", mp.Address.Hex(), err) } - return (*refundValue).Uint64(), nil + return *refundValue, nil } -func (mp *megapoolV1) GetNodeCapital(opts *bind.CallOpts) (uint64, error) { +func (mp *megapoolV1) GetNodeCapital(opts *bind.CallOpts) (*big.Int, error) { nodeCapital := new(*big.Int) if err := mp.Contract.Call(opts, nodeCapital, "getNodeCapital"); err != nil { - return 0, fmt.Errorf("error getting megapool %s node capital: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting megapool %s node capital: %w", mp.Address.Hex(), err) } - return (*nodeCapital).Uint64(), nil + return *nodeCapital, nil } -func (mp *megapoolV1) GetNodeBond(opts *bind.CallOpts) (uint64, error) { +func (mp *megapoolV1) GetNodeBond(opts *bind.CallOpts) (*big.Int, error) { nodeBond := new(*big.Int) if err := mp.Contract.Call(opts, nodeBond, "getNodeBond"); err != nil { - return 0, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting megapool %s debt: %w", mp.Address.Hex(), err) } - return (*nodeBond).Uint64(), nil + return *nodeBond, nil } -func (mp *megapoolV1) GetUserCapital(opts *bind.CallOpts) (uint64, error) { +func (mp *megapoolV1) GetUserCapital(opts *bind.CallOpts) (*big.Int, error) { userCapital := new(*big.Int) if err := mp.Contract.Call(opts, userCapital, "getUserCapital"); err != nil { - return 0, fmt.Errorf("error getting megapool %s user capital: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting megapool %s user capital: %w", mp.Address.Hex(), err) } - return (*userCapital).Uint64(), nil + return *userCapital, nil } //TODO _calculateRewards is currently a view in RocketMegapoolDelegate.sol -func (mp *megapoolV1) GetPendingRewards(opts *bind.CallOpts) (uint64, error) { +func (mp *megapoolV1) GetPendingRewards(opts *bind.CallOpts) (*big.Int, error) { pendingRewards := new(*big.Int) if err := mp.Contract.Call(opts, pendingRewards, "getPendingRewards"); err != nil { - return 0, fmt.Errorf("error getting megapool %s pending rewards: %w", mp.Address.Hex(), err) + return nil, fmt.Errorf("error getting megapool %s pending rewards: %w", mp.Address.Hex(), err) } - return (*pendingRewards).Uint64(), nil + return *pendingRewards, nil } func (mp *megapoolV1) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) { diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index cf418e743..df97119d8 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -14,14 +14,14 @@ type Megapool interface { GetAddress() common.Address GetVersion() uint8 GetValidatorCount(opts *bind.CallOpts) (uint64, error) - GetAssignedValue(opts *bind.CallOpts) (uint64, error) - GetDebt(opts *bind.CallOpts) (uint64, error) - GetRefundValue(opts *bind.CallOpts) (uint64, error) - GetNodeCapital(opts *bind.CallOpts) (uint64, error) - GetNodeBond(opts *bind.CallOpts) (uint64, error) - GetUserCapital(opts *bind.CallOpts) (uint64, error) + GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) + GetDebt(opts *bind.CallOpts) (*big.Int, error) + GetRefundValue(opts *bind.CallOpts) (*big.Int, error) + GetNodeCapital(opts *bind.CallOpts) (*big.Int, error) + GetNodeBond(opts *bind.CallOpts) (*big.Int, error) + GetUserCapital(opts *bind.CallOpts) (*big.Int, error) // CalculateRewards (not yet implemented) - GetPendingRewards(opts *bind.CallOpts) (uint64, error) + GetPendingRewards(opts *bind.CallOpts) (*big.Int, error) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) EstimateNewValidatorGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) From e1c8986b1d4a10d1f51fb38b98ebc243c0992fb0 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:55:43 -0300 Subject: [PATCH 789/878] Add exitQueue --- deposit/deposit-pool.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 deposit/deposit-pool.go diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go new file mode 100644 index 000000000..e39597582 --- /dev/null +++ b/deposit/deposit-pool.go @@ -0,0 +1,31 @@ +package deposit + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Estimate the gas required to exit the validator queue +func EstimateExitQueueGas(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "exitQueue", validatorIndex, expressQueue) +} + +// Exit the validator queue +func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDepositPool.Transact(opts, "exitQueue", validatorIndex, expressQueue) + if err != nil { + return common.Hash{}, fmt.Errorf("error exiting validator queue: %w", err) + } + return tx.Hash(), nil +} From 915873fbb84594c03063a1f5b588c2722ef3c474 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Thu, 9 Jan 2025 23:26:50 -0800 Subject: [PATCH 790/878] Add RocketMegapoolProxy calls --- megapool/megapool-proxy.go | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 megapool/megapool-proxy.go diff --git a/megapool/megapool-proxy.go b/megapool/megapool-proxy.go new file mode 100644 index 000000000..4a7521128 --- /dev/null +++ b/megapool/megapool-proxy.go @@ -0,0 +1,71 @@ +package megapool + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Returns true if this megapool always uses the latest delegate contract +func getUseLatestDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + megapoolProxy, err := getRocketMegapoolProxy(rp, opts) + if err != nil { + return false, err + } + isUsingLatestDelegate := new(bool) + if err := megapoolProxy.Call(opts, isUsingLatestDelegate, "getUseLatestDelegate"); err != nil { + return false, fmt.Errorf("error checking if this megapool is using the latest delegate:, %w", err) + } + return *isUsingLatestDelegate, nil +} + +// Upgrade this megapool to the latest network delegate contract +func getDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { + megapoolProxy, err := getRocketMegapoolProxy(rp, opts) + if err != nil { + return common.Address{}, err + } + delegateAddress := new(common.Address) + if err := megapoolProxy.Call(opts, delegateAddress, "getDelegate"); err != nil { + return common.Address{}, fmt.Errorf("error getting the delegate address: %w", err) + } + return *delegateAddress, nil +} + +// Returns the delegate which will be used when calling this megapool taking into account useLatestDelegate setting +func getEffectiveDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { + megapoolProxy, err := getRocketMegapoolProxy(rp, opts) + if err != nil { + return common.Address{}, err + } + effectiveDelegateAddress := new(common.Address) + if err := megapoolProxy.Call(opts, effectiveDelegateAddress, "getEffectiveDelegate"); err != nil { + return common.Address{}, fmt.Errorf("error getting the effective delegate address: %w", err) + } + return *effectiveDelegateAddress, nil +} + +// Returns true if the megapools current delegate has expired +func getDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + megapoolProxy, err := getRocketMegapoolProxy(rp, opts) + if err != nil { + return false, err + } + delegateExpired := new(bool) + if err := megapoolProxy.Call(opts, delegateExpired, "getDelegateExpired"); err != nil { + return false, fmt.Errorf("error checking if the megapool's delegate has expired:, %w", err) + } + return *delegateExpired, nil + +} + +var RocketMegapoolProxyLock sync.Mutex + +func getRocketMegapoolProxy(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + RocketMegapoolProxyLock.Lock() + defer RocketMegapoolProxyLock.Unlock() + return rp.GetContract("rocketMegapoolProxy", opts) +} From 2d33a5fa5b43f5b826548664a519c22a3f98af0e Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 10 Jan 2025 12:25:02 -0300 Subject: [PATCH 791/878] Add express queue DAO params --- settings/protocol/deposit.go | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 9d816c8b1..af1341f53 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -23,6 +23,8 @@ const ( MaximumDepositAssignmentsSettingPath string = "deposit.assign.maximum" MaximumSocializedDepositAssignmentsSettingPath string = "deposit.assign.socialised.maximum" DepositFeeSettingPath string = "deposit.fee" + DepositQueueRatePath string = "deposit.express.queue.rate" + DepositQueueTicketsBaseProvisionPath string = "deposit.express.queue.tickets.base.provision" ) // Deposits currently enabled @@ -158,6 +160,44 @@ func EstimateProposeDepositFeeGas(rp *rocketpool.RocketPool, value *big.Int, blo return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) } +func GetDepositQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + depositSettingsContract, err := getDepositSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getDepositQueueRate"); err != nil { + return nil, fmt.Errorf("error getting deposit queue rate: %w", err) + } + return *value, nil +} + +func ProposeDepositQueueRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", DepositQueueRatePath), DepositSettingsContractName, DepositQueueRatePath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeDepositQueueRateGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositQueueRatePath), DepositSettingsContractName, DepositQueueRatePath, value, blockNumber, treeNodes, opts) +} + +func GetDepositQueueTicketsBaseProvision(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + depositSettingsContract, err := getDepositSettingsContract(rp, opts) + if err != nil { + return nil, err + } + value := new(*big.Int) + if err := depositSettingsContract.Call(opts, value, "getDepositQueueTicketsBaseProvision"); err != nil { + return nil, fmt.Errorf("error getting deposit queue tickets base provision: %w", err) + } + return *value, nil +} + +func ProposeDepositQueueTicketsBaseProvision(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", DepositQueueTicketsBaseProvisionPath), DepositSettingsContractName, DepositQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) +} +func EstimateProposeDepositQueueTicketsBaseProvisionGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositQueueTicketsBaseProvisionPath), DepositSettingsContractName, DepositQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) +} + // Get contracts var depositSettingsContractLock sync.Mutex From 0bc1d7dab1fe56fa4d1bfc88e5f3864dc3a6ac6c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Sun, 12 Jan 2025 13:53:21 -0300 Subject: [PATCH 792/878] Rename expressQueue functions --- settings/protocol/deposit.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index af1341f53..bad0c7215 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -23,8 +23,8 @@ const ( MaximumDepositAssignmentsSettingPath string = "deposit.assign.maximum" MaximumSocializedDepositAssignmentsSettingPath string = "deposit.assign.socialised.maximum" DepositFeeSettingPath string = "deposit.fee" - DepositQueueRatePath string = "deposit.express.queue.rate" - DepositQueueTicketsBaseProvisionPath string = "deposit.express.queue.tickets.base.provision" + ExpressQueueRatePath string = "deposit.express.queue.rate" + ExpressQueueTicketsBaseProvisionPath string = "deposit.express.queue.tickets.base.provision" ) // Deposits currently enabled @@ -160,42 +160,42 @@ func EstimateProposeDepositFeeGas(rp *rocketpool.RocketPool, value *big.Int, blo return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) } -func GetDepositQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetDepositExpressQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return nil, err } value := new(*big.Int) - if err := depositSettingsContract.Call(opts, value, "getDepositQueueRate"); err != nil { + if err := depositSettingsContract.Call(opts, value, "getExpressQueueRate"); err != nil { return nil, fmt.Errorf("error getting deposit queue rate: %w", err) } return *value, nil } -func ProposeDepositQueueRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", DepositQueueRatePath), DepositSettingsContractName, DepositQueueRatePath, value, blockNumber, treeNodes, opts) +func ProposeExpressQueueRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ExpressQueueRatePath), DepositSettingsContractName, ExpressQueueRatePath, value, blockNumber, treeNodes, opts) } -func EstimateProposeDepositQueueRateGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositQueueRatePath), DepositSettingsContractName, DepositQueueRatePath, value, blockNumber, treeNodes, opts) +func EstimateProposeExpressQueueRateGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExpressQueueRatePath), DepositSettingsContractName, ExpressQueueRatePath, value, blockNumber, treeNodes, opts) } -func GetDepositQueueTicketsBaseProvision(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetExpressQueueTicketsBaseProvision(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return nil, err } value := new(*big.Int) - if err := depositSettingsContract.Call(opts, value, "getDepositQueueTicketsBaseProvision"); err != nil { - return nil, fmt.Errorf("error getting deposit queue tickets base provision: %w", err) + if err := depositSettingsContract.Call(opts, value, "getExpressQueueTicketsBaseProvision"); err != nil { + return nil, fmt.Errorf("error getting express queue tickets base provision: %w", err) } return *value, nil } -func ProposeDepositQueueTicketsBaseProvision(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { - return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", DepositQueueTicketsBaseProvisionPath), DepositSettingsContractName, DepositQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) +func ProposeExpressQueueTicketsBaseProvision(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", ExpressQueueTicketsBaseProvisionPath), DepositSettingsContractName, ExpressQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) } -func EstimateProposeDepositQueueTicketsBaseProvisionGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositQueueTicketsBaseProvisionPath), DepositSettingsContractName, DepositQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) +func EstimateProposeExpressQueueTicketsBaseProvisionGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExpressQueueTicketsBaseProvisionPath), DepositSettingsContractName, ExpressQueueTicketsBaseProvisionPath, value, blockNumber, treeNodes, opts) } // Get contracts From dc2837e487a2a83861498296c93ec4b0539552fd Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:12:23 -0300 Subject: [PATCH 793/878] Change return type --- settings/protocol/deposit.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index bad0c7215..0ad54bda6 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -160,16 +160,16 @@ func EstimateProposeDepositFeeGas(rp *rocketpool.RocketPool, value *big.Int, blo return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) } -func GetDepositExpressQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetDepositExpressQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := depositSettingsContract.Call(opts, value, "getExpressQueueRate"); err != nil { - return nil, fmt.Errorf("error getting deposit queue rate: %w", err) + return 0, fmt.Errorf("error getting deposit queue rate: %w", err) } - return *value, nil + return (*value).Uint64(), nil } func ProposeExpressQueueRate(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { @@ -179,16 +179,16 @@ func EstimateProposeExpressQueueRateGas(rp *rocketpool.RocketPool, value *big.In return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", ExpressQueueRatePath), DepositSettingsContractName, ExpressQueueRatePath, value, blockNumber, treeNodes, opts) } -func GetExpressQueueTicketsBaseProvision(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { +func GetExpressQueueTicketsBaseProvision(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { - return nil, err + return 0, err } value := new(*big.Int) if err := depositSettingsContract.Call(opts, value, "getExpressQueueTicketsBaseProvision"); err != nil { - return nil, fmt.Errorf("error getting express queue tickets base provision: %w", err) + return 0, fmt.Errorf("error getting express queue tickets base provision: %w", err) } - return *value, nil + return (*value).Uint64(), nil } func ProposeExpressQueueTicketsBaseProvision(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) { From d723bc260b15c1178d2ec9a8afa5aaee18380677 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:20:28 -0300 Subject: [PATCH 794/878] Rename --- settings/protocol/deposit.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/protocol/deposit.go b/settings/protocol/deposit.go index 0ad54bda6..4f7782423 100644 --- a/settings/protocol/deposit.go +++ b/settings/protocol/deposit.go @@ -160,7 +160,7 @@ func EstimateProposeDepositFeeGas(rp *rocketpool.RocketPool, value *big.Int, blo return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", DepositFeeSettingPath), DepositSettingsContractName, DepositFeeSettingPath, value, blockNumber, treeNodes, opts) } -func GetDepositExpressQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { +func GetExpressQueueRate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { depositSettingsContract, err := getDepositSettingsContract(rp, opts) if err != nil { return 0, err From 6d9c09fa3bcb9e11f49891a5d2a36e293bc51423 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 14 Jan 2025 00:42:47 -0800 Subject: [PATCH 795/878] Add GetDelegate and SetUseLatestDelegate --- megapool/megapool-contract.go | 32 ++++++++++++++++++++++++++++++++ megapool/megapool-interface.go | 4 ++++ megapool/megapool-proxy.go | 18 +++++++++--------- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 2897685ff..2ed8202c0 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -270,6 +270,38 @@ func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.Valid return tx.Hash(), nil } +// Estimate the gas of SetUseLatestDelegate +func (mp *megapoolV1) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) +} + +// If set to true, will automatically use the latest delegate contract +func (mp *megapoolV1) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "setUseLatestDelegate", setting) + if err != nil { + return common.Hash{}, fmt.Errorf("error setting use latest delegate for megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + +// Returns the address of the megapool's stored delegate +func (mp *megapoolV1) GetDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getDelegate"); err != nil { + return common.Address{}, fmt.Errorf("error getting delegate for megapool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + +// Returns the delegate which will be used when calling this minipool taking into account useLatestDelegate setting +func (mp *megapoolV1) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) { + address := new(common.Address) + if err := mp.Contract.Call(opts, address, "getEffectiveDelegate"); err != nil { + return common.Address{}, fmt.Errorf("error getting effective delegate for megapool %s: %w", mp.Address.Hex(), err) + } + return *address, nil +} + // Create a megapool contract directly from its ABI func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { // Create and return diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index df97119d8..f67399adf 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -38,4 +38,8 @@ type Megapool interface { RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) + EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) + GetDelegate(opts *bind.CallOpts) (common.Address, error) + GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) } diff --git a/megapool/megapool-proxy.go b/megapool/megapool-proxy.go index 4a7521128..446e07f1b 100644 --- a/megapool/megapool-proxy.go +++ b/megapool/megapool-proxy.go @@ -10,7 +10,7 @@ import ( ) // Returns true if this megapool always uses the latest delegate contract -func getUseLatestDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +func GetUseLatestDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { megapoolProxy, err := getRocketMegapoolProxy(rp, opts) if err != nil { return false, err @@ -22,8 +22,8 @@ func getUseLatestDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, return *isUsingLatestDelegate, nil } -// Upgrade this megapool to the latest network delegate contract -func getDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { +// Returns the address of the megapool's stored delegate +func GetDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { megapoolProxy, err := getRocketMegapoolProxy(rp, opts) if err != nil { return common.Address{}, err @@ -36,7 +36,7 @@ func getDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address } // Returns the delegate which will be used when calling this megapool taking into account useLatestDelegate setting -func getEffectiveDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { +func GetEffectiveDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { megapoolProxy, err := getRocketMegapoolProxy(rp, opts) if err != nil { return common.Address{}, err @@ -49,7 +49,7 @@ func getEffectiveDelegate(rp *rocketpool.RocketPool, opts *bind.CallOpts) (commo } // Returns true if the megapools current delegate has expired -func getDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { +func GetDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { megapoolProxy, err := getRocketMegapoolProxy(rp, opts) if err != nil { return false, err @@ -59,13 +59,13 @@ func getDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, e return false, fmt.Errorf("error checking if the megapool's delegate has expired:, %w", err) } return *delegateExpired, nil - } -var RocketMegapoolProxyLock sync.Mutex +// Get contracts +var rocketMegapoolProxyLock sync.Mutex func getRocketMegapoolProxy(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { - RocketMegapoolProxyLock.Lock() - defer RocketMegapoolProxyLock.Unlock() + rocketMegapoolProxyLock.Lock() + defer rocketMegapoolProxyLock.Unlock() return rp.GetContract("rocketMegapoolProxy", opts) } From 44a357f6b5284ab2721704c7f91c21a8110fd6f7 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 14 Jan 2025 17:19:41 -0800 Subject: [PATCH 796/878] Add GetUseLatestDelegate --- megapool/megapool-contract.go | 9 +++++++++ megapool/megapool-interface.go | 1 + 2 files changed, 10 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 2ed8202c0..397969e39 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -284,6 +284,15 @@ func (mp *megapoolV1) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts return tx.Hash(), nil } +// Getter for useLatestDelegate setting +func (mp *megapoolV1) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) { + setting := new(bool) + if err := mp.Contract.Call(opts, setting, "getUseLatestDelegate"); err != nil { + return false, fmt.Errorf("error getting use latest delegate for megapool %s: %w", mp.Address.Hex(), err) + } + return *setting, nil +} + // Returns the address of the megapool's stored delegate func (mp *megapoolV1) GetDelegate(opts *bind.CallOpts) (common.Address, error) { address := new(common.Address) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index f67399adf..d38d11613 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -40,6 +40,7 @@ type Megapool interface { Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) + GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) GetDelegate(opts *bind.CallOpts) (common.Address, error) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) } From cea7894290ead7ba7146f183a63da2a90c531c71 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 14 Jan 2025 21:55:13 -0800 Subject: [PATCH 797/878] Include RocketMegapoolProxy and RocketMegapoolDelegate in Encoded Abi --- megapool/megapool-contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 397969e39..35cc001e1 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -39,7 +39,7 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "eJztWE1v2zAM/SuDz8EO3dZDb/0aUKwdsrTdDkVQ0BaTCbUlT6KSBkX/++jYie3Yjp02aXPoLYmopyeSeiRz9+RJFTuy3tFd8pHQKAhvZjF6R16gFRkI6NNABw9I16QNjPEiMRpBgF7PUxAlhvemaHAshEFreZlSHMh+eB72PEtAeOUIfBlKmvGq0iqGGfgh5jv4ZEvGBQzoPfeePGCjWaQd0xxBaLFXZi3wEYV3xDvmK6VLwJJNRjbCMcRahzX8em1gjr8ffDvMwSYQSgFM80LkeAurEt6S93pAkhHWIA2XBlcZ/d+Lk4+tlWOFhfNxgoo+/NbitzP859B9+G1Tv52rZr81a0mC/OWgIBmNN2GrwvEwz+7vTonEpdpRdkCtlFR0ZORUQFKrMrkcPQhBRu24dRLVBi0wNhgw0jbht+ZWkSb/fnKT1upwgsuM21GAJJcY6bvtRijHHyMtpJlvsuLrWmeVHmb9o6xSm0icbkTqDH3aFy7nj7E0kBidhNxC7Autn1oUupg1lCpi37XpeRGlE63EPrnoFGJJEO4LpT4qIdV4gFMwoiVwb8dqgGy0Xwpwa9HsWeyWWn+qnXpPedpaFSte6kKN9MqdAh3FWnHfVHuoPyMsqErs/B84y09Ll1Pea8mGYLMiFPFRN5VeL6HcDWWQNAyW8lr2OpRMylpB/LRxXjSDHLBJ4fD5ausufJRUbFe77ZLqV9Yhbbitz7JP8PACmnFSMPhxbsx10TFVNg4rA0A6VmcT/aK3zwb3S5hxin5eTdvKKyMXcyO0pZf/R9JfYWAK4alBwVkqeXBZLwDz9C+m1srLyB7iFgWgJDf3PifvcZQJVe0MtiZW987ieRrqG5kEoUOwy2qQK1Df+Q+ddKER4ZqlAcgZ7ApSkkKecbSVdAYEA62pPgyZscLpjht6g7yl0t2+ZlDskAvQlAdFXnPRu1VzWRj0L3c+dZUpitQlzQRtzVDwvsNgewbbHSdur61EJ1QPv+aYNtQrXubVhrLY8JdO8tdNN0WptAcbyEDREdMG8a3xRj3U3bAEpljVsArAVs2laKkKfaP1qBCkOPteqToLj2dV9i3fUofnvotXnqO7nahIjj9BY5Plt+3Ah/8BcMhg6g==" + megapoolV1EncodedAbi string = "eJztWMlu2zAQ/ZXC56CHtM0ht2wFgiaF6yTtIQgMShw7hGlS5eIFQf+9I1mrRVlyLCU65JTIot4MH4dvlseXARFSrOfS6sHphHANRwMmAmvw8fEF/6WwAjo4NcpGbwwoQfj9OoDB6YBQqkDrwdFAkHn4wxymJJCS4y+muOTfUR2YxefjbycZ2IJwRomR6ppmeMmqAl7q925Aw/BPGekpXXAbu/87sXymNZsKyNmHBQgTWf/grZq3S/hrwX7wti9vV6KatwJLJcNfjjO748qd4KqceRJF93craEiptCY2gCu0IQZurSEe48yscXFA1sTjuf1MrPANk6LoXIbuE+5bjjAjWBK1ZcK5hwJ5QtLcl87TqDlOie8PQlBgnqsBnCwtGCz3oIgTNq+nHi/M3uxTCBT4iNQmfGuRRzf60E/fmNaSLyC9lB0dENNGMc+2e0IZ/hRMkr1wJ1tc18d+NwGPTl2CZ/riy9UqYIqEi8659Gd9cesnSt9Zmup2uFTKh4482J5L51LQPlF0QQJmCO+LS0MQlInp67JdZ16NABf1SwEeNKienV2q9RfSiveUp9ayWH5T12Iit/bky3kgBZaWTqPe2kBOVQLr/YB1Zm3zuqKCyjvLiY6T0BxN3ZfK4dDlZiijsGDQJstlh6HEUlYL4m16i6RexgNb5IxHb2u/ghUz+Yq+2VdM/IorpD0/G6LsGzJ7hZtBmDDwcu7ta1IxlT58KvVIWPNY33waYbYFk7Q/dxijZAo3ZI0h+nk7bEu3zNgAC6GWbv4fZp6pIkvCLxRQjFKGvd1uAYjCPx9aWzcjvogtCkBBbsYeBu/ZPBaq+rameFZjq+Fqc9T3LDyEBoddVINMgYbWmzXShUqEO5QGYqyCpiAFKcQeR2pmLokhIymN+xiSdhKWHRf0CvCTUnV7SC/dIBZIVRzk/YpE70FEsjAa3nTedRVdpBtKqh3UjqbgfZvB+gjWHQfuUV2KDl09+Zphai63WMa3jcYkmdxSWDVTlFJ5sIcM5IlYVoivgw031ONTAUygqkEZAFdVp6JUFYZKyknukIL4uZR1EsbjLPuWd6nBde/ilmfothMVyfAXoHT4+s0r8GZTaffgt9SGS04vgWN1Y3Jbd06mGwJi9joIcP/RdGLuIZgqQruf5E+UnLeztco70gVNV+Y5HDL7wBaHcOR2p1i5ReHsrNZa3hO2ADdoCkuGAIXRva0mNQ3h3CP+rHpCXYiwbvQkGjimF6cXo7TEn2j4CDUTtWIIOPqrNqagkwlEnW3fmEoDsZljHXFVT8BYFAa2DjLS7pyFJQ7T3dYNWx2fUzgK5fduol/nXgOFUBvdRGf+AyRlGdM=" ) // The decoded ABI for megapools From 30257e08a008bbbc9b63506a7b074edf237d7f58 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 14 Jan 2025 22:11:36 -0800 Subject: [PATCH 798/878] Add megapool delegateUpgrade --- megapool/megapool-contract.go | 14 ++++++++++++++ megapool/megapool-interface.go | 2 ++ 2 files changed, 16 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 35cc001e1..2196417c1 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -311,6 +311,20 @@ func (mp *megapoolV1) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, return *address, nil } +// Estimate the gas of DelegateUpgrade +func (mp *megapoolV1) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") +} + +// Upgrade this megapool to the latest network delegate contract +func (mp *megapoolV1) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "delegateUpgrade") + if err != nil { + return common.Hash{}, fmt.Errorf("error upgrading delegate for megapool %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Create a megapool contract directly from its ABI func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { // Create and return diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index d38d11613..97c8779a0 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -43,4 +43,6 @@ type Megapool interface { GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) GetDelegate(opts *bind.CallOpts) (common.Address, error) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) + EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) } From d0083799dd392dede6f1a28a81f52473ce00f8d6 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:43:49 -0300 Subject: [PATCH 799/878] Added GetQueueTop --- deposit/deposit-pool.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index e39597582..c07d5a9c2 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -29,3 +29,15 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo } return tx.Hash(), nil } + +func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { + rocketDepositPool, err := getRocketDepositPool(rp, opts) + if err != nil { + return common.Address{}, err + } + queueTop := new(common.Address) + if err := rocketDepositPool.Call(opts, queueTop, "getQueueTop"); err != nil { + return common.Address{}, fmt.Errorf("error getting queue top: %w", err) + } + return *queueTop, nil +} From 546b868d208f4fd273ebf1a202462716a5ba86ed Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 15 Jan 2025 21:56:21 -0300 Subject: [PATCH 800/878] Added a boolean to GetQueueTop return type --- deposit/deposit-pool.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index c07d5a9c2..89745da44 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -30,14 +30,20 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo return tx.Hash(), nil } -func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (common.Address, error) { +// Struct to hold queue top (address of the validator at the top of the queue and a boolean indicating if the assignment is possible) +type QueueTop struct { + MegapoolAddress common.Address + CanAssign bool +} + +func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueTop, error) { rocketDepositPool, err := getRocketDepositPool(rp, opts) if err != nil { - return common.Address{}, err + return QueueTop{}, err } - queueTop := new(common.Address) + queueTop := new(QueueTop) if err := rocketDepositPool.Call(opts, queueTop, "getQueueTop"); err != nil { - return common.Address{}, fmt.Errorf("error getting queue top: %w", err) + return QueueTop{}, fmt.Errorf("error getting queue top: %w", err) } return *queueTop, nil } From 1209a4b4b394d151e6d9eebe041940c6845d0c6c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:15:14 -0300 Subject: [PATCH 801/878] Add assignMegapools --- deposit/deposit-pool.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 89745da44..b50a4f4dd 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -30,6 +30,18 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo return tx.Hash(), nil } +func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (common.Hash, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDepositPool.Transact(opts, "assignMegapools", count) + if err != nil { + return common.Hash{}, fmt.Errorf("error assigning megapools: %w", err) + } + return tx.Hash(), nil +} + // Struct to hold queue top (address of the validator at the top of the queue and a boolean indicating if the assignment is possible) type QueueTop struct { MegapoolAddress common.Address From c17d396dc98c1749e624e731fe0f97a881eb9538 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:19:15 -0300 Subject: [PATCH 802/878] Add estimateAssignMegapool --- deposit/deposit-pool.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index b50a4f4dd..835666fd6 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -30,6 +30,16 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo return tx.Hash(), nil } +// Estimate the gas required to assign megapools +func EstimateAssignMegapoolsGas(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "assignMegapools", count) +} + +// Assign megapools func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { From 546c291db9157c99f169ec072f63e36475b4907a Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:08:45 -0300 Subject: [PATCH 803/878] validator index as big.Int --- deposit/deposit-pool.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 835666fd6..8be70f3dd 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -2,6 +2,7 @@ package deposit import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -14,7 +15,8 @@ func EstimateExitQueueGas(rp *rocketpool.RocketPool, validatorIndex uint64, expr if err != nil { return rocketpool.GasInfo{}, err } - return rocketDepositPool.GetTransactionGasInfo(opts, "exitQueue", validatorIndex, expressQueue) + validatorIndexBig := big.NewInt(int64(validatorIndex)) + return rocketDepositPool.GetTransactionGasInfo(opts, "exitQueue", validatorIndexBig, expressQueue) } // Exit the validator queue @@ -23,7 +25,8 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo if err != nil { return common.Hash{}, err } - tx, err := rocketDepositPool.Transact(opts, "exitQueue", validatorIndex, expressQueue) + validatorIndexBig := big.NewInt(int64(validatorIndex)) + tx, err := rocketDepositPool.Transact(opts, "exitQueue", validatorIndexBig, expressQueue) if err != nil { return common.Hash{}, fmt.Errorf("error exiting validator queue: %w", err) } From 4b076f6cf3725a93274266b87acf445319c750d2 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 21 Jan 2025 11:40:38 -0800 Subject: [PATCH 804/878] Add GetValidaotInfo --- megapool/megapool-contract.go | 21 ++++++++++++++++++++- megapool/megapool-interface.go | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 2196417c1..b65be03f2 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -30,6 +30,19 @@ type MegapoolV1 interface { Megapool } +type ValidatorInfo struct { + PubKey []byte `abi:"pubKey"` + LastAssignmentTime uint32 `abi:"lastAssignmentTime"` + LastRequestedValue uint32 `abi:"lastRequestedValue"` + LastRequestedBond uint32 `abi:"lastRequestedBond"` + Active bool `abi:"active"` + Exited bool `abi:"exited"` + InQueue bool `abi:"inQueue"` + InPrestake bool `abi:"inPrestake"` + ExpressUsed bool `abi:"expressUsed"` + Dissolved bool `abi:"dissolved"` +} + // Megapool contract type megapoolV1 struct { Address common.Address @@ -94,7 +107,13 @@ func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint64, error) { return (*validatorCount).Uint64(), nil } -//TODO func GetValidatorInfo() +func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) { + validatorInfo := new(ValidatorInfo) + if err := mp.Contract.Call(opts, validatorInfo, "getValidatorInfo", validatorId); err != nil { + return ValidatorInfo{}, fmt.Errorf("error getting info for validator %d: %w", validatorId, err) + } + return *validatorInfo, nil +} func (mp *megapoolV1) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) { assignedValue := new(*big.Int) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 97c8779a0..b1ac791d6 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -14,6 +14,7 @@ type Megapool interface { GetAddress() common.Address GetVersion() uint8 GetValidatorCount(opts *bind.CallOpts) (uint64, error) + GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) GetDebt(opts *bind.CallOpts) (*big.Int, error) GetRefundValue(opts *bind.CallOpts) (*big.Int, error) From f210dad241993ec874fb77aacdd7aed7b0d09067 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:38:04 -0300 Subject: [PATCH 805/878] Add RocketMegapoolFactory contract --- utils/state/contracts.go | 9 +++++++++ utils/state/node.go | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 616774c1f..82dfff188 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -52,6 +52,9 @@ type NetworkContracts struct { // Houston RocketDAOProtocolProposal *rocketpool.Contract RocketDAOProtocolVerifier *rocketpool.Contract + + // Saturn + RocketMegapoolFactory *rocketpool.Contract } type contractArtifacts struct { @@ -173,6 +176,12 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad contract: &contracts.RocketDAOProtocolVerifier, }) + // Saturn wrappers + wrappers = append(wrappers, contractArtifacts{ + name: "rocketMegapoolFactory", + contract: &contracts.RocketMegapoolFactory, + }) + // Add the address and ABI getters to multicall for i, wrapper := range wrappers { // Add the address getter diff --git a/utils/state/node.go b/utils/state/node.go index b252039c7..8afc50d4e 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -50,6 +50,8 @@ type NativeNodeDetails struct { AverageNodeFee *big.Int `json:"average_node_fee"` // Must call CalculateAverageFeeAndDistributorShares to get this CollateralisationRatio *big.Int `json:"collateralisation_ratio"` DistributorBalance *big.Int `json:"distributor_balance"` + MegapoolAddress common.Address `json:"megapool_address"` + MegapoolDeployed bool `json:"megapool_deployed"` } func timeMax(a, b time.Time) time.Time { @@ -350,4 +352,9 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, // Atlas mc.AddCall(contracts.RocketNodeDeposit, &details.DepositCreditBalance, "getNodeDepositCredit", address) mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) + + // Saturn + mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getMegapoolDeployed", address) + mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getExpectedAddress", address) + } From 4636afaaafdc765c4a8dd65cfb99bc6d5df95662 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:17:48 -0300 Subject: [PATCH 806/878] Use unpackIntoInterface --- megapool/megapool-contract.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index b65be03f2..6a7c58a8e 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -1,9 +1,11 @@ package megapool import ( + "context" "fmt" "math/big" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -109,9 +111,22 @@ func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint64, error) { func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) { validatorInfo := new(ValidatorInfo) - if err := mp.Contract.Call(opts, validatorInfo, "getValidatorInfo", validatorId); err != nil { - return ValidatorInfo{}, fmt.Errorf("error getting info for validator %d: %w", validatorId, err) + + callData, err := mp.Contract.ABI.Pack("getValidatorInfo", validatorId) + if err != nil { + return ValidatorInfo{}, fmt.Errorf("error creating calldata for getValidatorInfo: %w", err) + } + + response, err := mp.Contract.Client.CallContract(context.Background(), ethereum.CallMsg{To: mp.Contract.Address, Data: callData}, nil) + if err != nil { + return ValidatorInfo{}, fmt.Errorf("error calling getValidatorInfo: %w", err) } + + err = mp.Contract.ABI.UnpackIntoInterface(&validatorInfo, "getValidatorInfo", response) + if err != nil { + return ValidatorInfo{}, fmt.Errorf("error unpacking getValidatorInfo response: %w", err) + } + return *validatorInfo, nil } From 77fa0c1b426df92fa3f2ee2809f3533bede7c4fe Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:14:23 -0300 Subject: [PATCH 807/878] Add proof to the estimate call --- megapool/megapool-contract.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 6a7c58a8e..480443380 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -291,8 +291,8 @@ func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of Stake -func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorSignature[:], depositDataRoot) +func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) } // Progress the prelaunch megapool to staking From b4d316d55cfc9e57ab2799eb34335135d92bd997 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:16:28 -0300 Subject: [PATCH 808/878] Fix interface --- megapool/megapool-interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index b1ac791d6..7eb1b417d 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -37,7 +37,7 @@ type Megapool interface { GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) - EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) From 259712600daa6656a3f64f939ef8357b4e69b36b Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 27 Jan 2025 15:32:55 -0300 Subject: [PATCH 809/878] Export ValidatorProof struct --- megapool/megapool-contract.go | 16 ++++++++-------- megapool/megapool-interface.go | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 480443380..7fa6afc09 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -13,12 +13,12 @@ import ( rptypes "github.com/rocket-pool/rocketpool-go/types" ) -type validatorProof struct { - slot uint64 - validatorIndex *big.Int - pubkey []byte - withdrawalCredentials [32]byte - witnesses [][32]byte +type ValidatorProof struct { + Slot uint64 + ValidatorIndex *big.Int + Pubkey []byte + WithdrawalCredentials [32]byte + Witnesses [][32]byte } type withdrawal struct { @@ -291,12 +291,12 @@ func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of Stake -func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) } // Progress the prelaunch megapool to staking -func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) { tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot, validatorProof) if err != nil { return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 7eb1b417d..d62cd3200 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -37,8 +37,8 @@ type Megapool interface { GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) - EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof validatorProof, opts *bind.TransactOpts) (common.Hash, error) + EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) From 8bdaaabf6157036b7ed5eb2abae75a552d513f7c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 27 Jan 2025 15:35:58 -0300 Subject: [PATCH 810/878] Fix capital letters --- megapool/beacon-state-verifier.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/megapool/beacon-state-verifier.go b/megapool/beacon-state-verifier.go index 84330f6b8..38ac836bd 100644 --- a/megapool/beacon-state-verifier.go +++ b/megapool/beacon-state-verifier.go @@ -9,14 +9,14 @@ import ( "github.com/rocket-pool/rocketpool-go/rocketpool" ) -func verifyValidator(rp *rocketpool.RocketPool, proof validatorProof, opts *bind.CallOpts) (bool, error) { +func verifyValidator(rp *rocketpool.RocketPool, proof ValidatorProof, opts *bind.CallOpts) (bool, error) { beaconStateVerifier, err := getBeaconStateVerifier(rp, opts) if err != nil { return false, err } verifiedValidator := new(bool) if err := beaconStateVerifier.Call(opts, verifiedValidator, "verifyValidator"); err != nil { - return false, fmt.Errorf("error verifying validatorindex %d at slot %d: %w", proof.validatorIndex, proof.slot, err) + return false, fmt.Errorf("error verifying validatorindex %d at slot %d: %w", proof.ValidatorIndex, proof.Slot, err) } return *verifiedValidator, nil } From 7b49ba5aac40cc8cd6536eeae0e9ccb77bf22af0 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Mon, 27 Jan 2025 17:05:50 -0800 Subject: [PATCH 811/878] Fix node detail multicall --- utils/state/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/state/node.go b/utils/state/node.go index 8afc50d4e..699feac2e 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -354,7 +354,7 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) // Saturn + mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolAddress, "getExpectedAddress", address) mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getMegapoolDeployed", address) - mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getExpectedAddress", address) } From edf39bfaca8e89f07a1eb9ab1be720e69a389fe4 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:28:43 -0300 Subject: [PATCH 812/878] Add missing stake param --- megapool/megapool-contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 7fa6afc09..087aeea68 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -297,7 +297,7 @@ func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rp // Progress the prelaunch megapool to staking func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) { - tx, err := mp.Contract.Transact(opts, "stake", validatorSignature[:], depositDataRoot, validatorProof) + tx, err := mp.Contract.Transact(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) if err != nil { return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) } From eacd8e2c5ee3bf96bfee2c2195a113dd4490fd47 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:07:21 -0300 Subject: [PATCH 813/878] Fix big int args --- deposit/deposit-pool.go | 10 ++++++---- megapool/megapool-contract.go | 13 +++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 8be70f3dd..24a247e99 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -35,20 +35,22 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo // Estimate the gas required to assign megapools func EstimateAssignMegapoolsGas(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + countBig := big.NewInt(int64(count)) rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDepositPool.GetTransactionGasInfo(opts, "assignMegapools", count) + return rocketDepositPool.GetTransactionGasInfo(opts, "assignMegapools", countBig) } // Assign megapools func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (common.Hash, error) { + countBig := big.NewInt(int64(count)) rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketDepositPool.Transact(opts, "assignMegapools", count) + tx, err := rocketDepositPool.Transact(opts, "assignMegapools", countBig) if err != nil { return common.Hash{}, fmt.Errorf("error assigning megapools: %w", err) } @@ -57,8 +59,8 @@ func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.Transac // Struct to hold queue top (address of the validator at the top of the queue and a boolean indicating if the assignment is possible) type QueueTop struct { - MegapoolAddress common.Address - CanAssign bool + Receiver common.Address + AssignmentPossible bool } func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueTop, error) { diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 087aeea68..0a8c8b692 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -297,6 +297,19 @@ func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rp // Progress the prelaunch megapool to staking func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) { + // callData, err := mp.Contract.ABI.Pack("stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) + // if err != nil { + // return common.Hash{}, fmt.Errorf("error creating calldata for getValidatorInfo: %w", err) + // } + + // fmt.Println("call data:\n") + // fmt.Printf("%s", hex.EncodeToString(callData)) + + // tx, err := mp.Contract.Contract.RawTransact(opts, callData) + // if err != nil { + // return common.Hash{}, fmt.Errorf("error calling getValidatorInfo: %w", err) + // } + tx, err := mp.Contract.Transact(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) if err != nil { return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) From 8865a332e5fcb0e2878a9d4a2497155c154e16b0 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 29 Jan 2025 21:56:40 -0800 Subject: [PATCH 814/878] update ValidatorInfo interface --- megapool/megapool-contract.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 0a8c8b692..ca388902f 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -37,7 +37,7 @@ type ValidatorInfo struct { LastAssignmentTime uint32 `abi:"lastAssignmentTime"` LastRequestedValue uint32 `abi:"lastRequestedValue"` LastRequestedBond uint32 `abi:"lastRequestedBond"` - Active bool `abi:"active"` + Staked bool `abi:"staked"` Exited bool `abi:"exited"` InQueue bool `abi:"inQueue"` InPrestake bool `abi:"inPrestake"` From 24d744a969cabdb3cf8f22a1113afe4c25f4b29f Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Mon, 3 Feb 2025 13:28:46 -0800 Subject: [PATCH 815/878] Init RocketNetworkRevenues bindings --- network/revenues.go | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 network/revenues.go diff --git a/network/revenues.go b/network/revenues.go new file mode 100644 index 000000000..64f63f652 --- /dev/null +++ b/network/revenues.go @@ -0,0 +1,51 @@ +package network + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +type RevenueSplit struct { + NodeShare *big.Int + VoterShare *big.Int + RethShare *big.Int +} + +// Get the current node share +func GetCurrentNodeShare(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) { + rocketNetworkRevenues, err := getRocketNetworkRevenues(rp, opts) + if err != nil { + return nil, err + } + nodeShare := new(*big.Int) + if err := rocketNetworkRevenues.Call(opts, nodeShare, "getCurrentNodeShare"); err != nil { + return nil, fmt.Errorf("error getting network node share: %w", err) + } + return *nodeShare, nil +} + +// Calculates the time-weighted average revenue split values between the supplied block number and now +func CalculateSplit(rp *rocketpool.RocketPool, sinceBlock uint64, opts *bind.CallOpts) (RevenueSplit, error) { + rocketNetworkRevenues, err := getRocketNetworkRevenues(rp, opts) + if err != nil { + return RevenueSplit{}, err + } + revenueSplit := new(RevenueSplit) + if err := rocketNetworkRevenues.Call(opts, revenueSplit, "calculateSplit", big.NewInt(int64(sinceBlock))); err != nil { + return RevenueSplit{}, fmt.Errorf("error calculating the revenue split %w", err) + } + return *revenueSplit, nil +} + +// Get contracts +var rocketNetworkRevenuesLock sync.Mutex + +func getRocketNetworkRevenues(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketNetworkRevenuesLock.Lock() + defer rocketNetworkRevenuesLock.Unlock() + return rp.GetContract("rocketNetworkRevenues", opts) +} From 271d34d08761ee0bb1eae9d19f68a9e0937bd9ee Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 4 Feb 2025 11:42:43 -0800 Subject: [PATCH 816/878] Add GetLastDistributionBlock, update GetValidatorInfo interface --- megapool/megapool-contract.go | 18 +++++++++++++----- megapool/megapool-interface.go | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index ca388902f..9fd66f1b3 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -54,7 +54,7 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "eJztWMlu2zAQ/ZXC56CHtM0ht2wFgiaF6yTtIQgMShw7hGlS5eIFQf+9I1mrRVlyLCU65JTIot4MH4dvlseXARFSrOfS6sHphHANRwMmAmvw8fEF/6WwAjo4NcpGbwwoQfj9OoDB6YBQqkDrwdFAkHn4wxymJJCS4y+muOTfUR2YxefjbycZ2IJwRomR6ppmeMmqAl7q925Aw/BPGekpXXAbu/87sXymNZsKyNmHBQgTWf/grZq3S/hrwX7wti9vV6KatwJLJcNfjjO748qd4KqceRJF93craEiptCY2gCu0IQZurSEe48yscXFA1sTjuf1MrPANk6LoXIbuE+5bjjAjWBK1ZcK5hwJ5QtLcl87TqDlOie8PQlBgnqsBnCwtGCz3oIgTNq+nHi/M3uxTCBT4iNQmfGuRRzf60E/fmNaSLyC9lB0dENNGMc+2e0IZ/hRMkr1wJ1tc18d+NwGPTl2CZ/riy9UqYIqEi8659Gd9cesnSt9Zmup2uFTKh4482J5L51LQPlF0QQJmCO+LS0MQlInp67JdZ16NABf1SwEeNKienV2q9RfSiveUp9ayWH5T12Iit/bky3kgBZaWTqPe2kBOVQLr/YB1Zm3zuqKCyjvLiY6T0BxN3ZfK4dDlZiijsGDQJstlh6HEUlYL4m16i6RexgNb5IxHb2u/ghUz+Yq+2VdM/IorpD0/G6LsGzJ7hZtBmDDwcu7ta1IxlT58KvVIWPNY33waYbYFk7Q/dxijZAo3ZI0h+nk7bEu3zNgAC6GWbv4fZp6pIkvCLxRQjFKGvd1uAYjCPx9aWzcjvogtCkBBbsYeBu/ZPBaq+rameFZjq+Fqc9T3LDyEBoddVINMgYbWmzXShUqEO5QGYqyCpiAFKcQeR2pmLokhIymN+xiSdhKWHRf0CvCTUnV7SC/dIBZIVRzk/YpE70FEsjAa3nTedRVdpBtKqh3UjqbgfZvB+gjWHQfuUV2KDl09+Zphai63WMa3jcYkmdxSWDVTlFJ5sIcM5IlYVoivgw031ONTAUygqkEZAFdVp6JUFYZKyknukIL4uZR1EsbjLPuWd6nBde/ilmfothMVyfAXoHT4+s0r8GZTaffgt9SGS04vgWN1Y3Jbd06mGwJi9joIcP/RdGLuIZgqQruf5E+UnLeztco70gVNV+Y5HDL7wBaHcOR2p1i5ReHsrNZa3hO2ADdoCkuGAIXRva0mNQ3h3CP+rHpCXYiwbvQkGjimF6cXo7TEn2j4CDUTtWIIOPqrNqagkwlEnW3fmEoDsZljHXFVT8BYFAa2DjLS7pyFJQ7T3dYNWx2fUzgK5fduol/nXgOFUBvdRGf+AyRlGdM=" + megapoolV1EncodedAbi string = "eJztWU1v2zgQ/SuFz0EP3W4PubVxChSbLLxusj0EQUCJY4cITWrJoR2j2P/ekWx9WZQlxVKqQ06JTOrxcTjzZoa6+zlhSqvtSjs7OV8waeFsIlTkkB7vftK/HJ6BT87RuGQEwSgmb7YRTM4njHMD1k7OJoqt4h9WsGSR1pJ+wfKU/8+awBw9f/jzUw62ZlJwhtp84zleOquEl/E+DoiC/lSR7rMJ13v6/6Yrf7ZWLBUU1oc1KExWf7Nbvd2m8J8D92a3rna7VKfarSU1RkCE+zrbnMOGGW4vJKOZw+9NaQ6fe9zfWtN4n4AG8LFPvLYHMBUWjQgc+g+hZPLKin98yBd8qA0VmlVYlyXy+dUpHsesdrhfgGZYZAjXDlkgpMAtTY7YlgWysJGFUyEKrcrkcvSQydBJgtlvr7SEdw8VN8nf9B5DC784CSF2hHoAr5XWAjYdTBSHXLPpKfo6W59DZCAkpD7he/M8vktA4+QmrNVyDZnqD3RAWbQPg78ETMsj2smBrZt9fxiHJ1JTCHAsXC6fI2FYPOmL1OHTWGhdMYtZMhgbub/j9J0VekcoVapBTxXYH6UvWvExmeiCRQKZHAulGSgu1PJlqXgwVnOgSeOSp1sLZmRnlyWii31N2sCqmPS8ie5lnHpLsMUtfVMLfbCjUK8irajq9S4abBEKmhK54C/Y5qvthmuKuyJZSRq7y48rWuqmUqLHlNuhzONaxmKeZk9D2QtZI0iw66v3EHSkT8W2IRltfAueBXZ/S6h/9sVbx9dmJPoxz+40ozhdUGh25poWc5UX7yt9G+VbF+K7OeVawLT1/04+ypZwxbbkou8P3bYSZOgiqtF6ivsfAh+5YRsmLwxw8lJB/ebx8E/c3x//6VDPAlCSwIeAnPd463zkrB6chcvdUd+I+BBaHHZZDXIFmrngqZUu1CJ8J2lg6Ay0BSlJIbVf2gqcMmRzrdF/DGmnC5uBew0D9Eql8D6lzW/hC7V3WEVeiejdqkQW5rOrwRvCMkW+M0k9QevpV35vn9rswXZgxz1rStEx1U8fC7lJ6gMr02irG5xcbjk8t1OUSnnQQQaKhtjUiK/HGn6ou/sSmCJVgyoAzapPRZkqzIzWi8IhRfvnStYpVgOvHEstwn2IKM/R3SAqkuOvwdh4+NW7glNu3ytNuJZ8CpKqGyxs3ftVpiUgZa+TALtfl6fL3UZLw/jwX7EWRq/62dqrfta5xMf4/jsEse7/q06l+0B/Vd/znqgFuKKlqGSISBj922pT0zApAxY+1V+elzxsGD1J7kKzwBnFRVrKJ7kXhYb7tLILePqrPi5oFwugOWsYm6UyR2xHbCBbNRvgQZWuaz3GyLpzEZc4wg5bNxx0fF7hKJXfxw39MnotFMLsdJPI/ALRahsK/ZXC56CHtM0ht2wFgiaF6yTtIQgMShw7hGlS5eIFQf+9I1mrRVlyLCU65JTIot4MH4dvlseXARFSrOfS6sHphHANRwMmAmvw8fEF/6WwAjo4NcpGbwwoQfj9OoDB6YBQqkDrwdFAkHn4wxymJJCS4y+muOTfUR2YxefjbycZ2IJwRomR6ppmeMmqAl7q925Aw/BPGekpXXAbu/87sXymNZsKyNmHBQgTWf/grZq3S/hrwX7wti9vV6KatwJLJcNfjjO748qd4KqceRJF93craEiptCY2gCu0IQZurSEe48yscXFA1sTjuf1MrPANk6LoXIbuE+5bjjAjWBK1ZcK5hwJ5QtLcl87TqDlOie8PQlBgnqsBnCwtGCz3oIgTNq+nHi/M3uxTCBT4iNQmfGuRRzf60E/fmNaSLyC9lB0dENNGMc+2e0IZ/hRMkr1wJ1tc18d+NwGPTl2CZ/riy9UqYIqEi8659Gd9cesnSt9Zmup2uFTKh4482J5L51LQPlF0QQJmCO+LS0MQlInp67JdZ16NABf1SwEeNKienV2q9RfSiveUp9ayWH5T12Iit/bky3kgBZaWTqPe2kBOVQLr/YB1Zm3zuqKCyjvLiY6T0BxN3ZfK4dDlZiijsGDQJstlh6HEUlYL4m16i6RexgNb5IxHb2u/ghUz+Yq+2VdM/IorpD0/G6LsGzJ7hZtBmDDwcu7ta1IxlT58KvVIWPNY33waYbYFk7Q/dxijZAo3ZI0h+nk7bEu3zNgAC6GWbv4fZp6pIkvCLxRQjFKGvd1uAYjCPx9aWzcjvogtCkBBbsYeBu/ZPBaq+rameFZjq+Fqc9T3LDyEBoddVINMgYbWmzXShUqEO5QGYqyCpiAFKcQeR2pmLokhIymN+xiSdhKWHRf0CvCTUnV7SC/dIBZIVRzk/YpE70FEsjAa3nTedRVdpBtKqh3UjqbgfZvB+gjWHQfuUV2KDl09+Zphai63WMa3jcYkmdxSWDVTlFJ5sIcM5IlYVoivgw031ONTAUygqkEZAFdVp6JUFYZKyknukIL4uZR1EsbjLPuWd6nBde/ilmfothMVyfAXoHT4+s0r8GZTaffgt9SGS04vgWN1Y3Jbd06mGwJi9joIcP/RdGLuIZgqQruf5E+UnLeztco70gVNV+Y5HDL7wBaHcOR2p1i5ReHsrNZa3hO2ADdoCkuGAIXRva0mNQ3h3CP+rHpCXYiwbvQkGjimF6cXo7TEn2j4CDUTtWIIOPqrNqagkwlEnW3fmEoDsZljHXFVT8BYFAa2DjLS7pyFJQ7T3dYNWx2fUzgK5fduol/nXgOFUBvdRGf+AyRlGdM=" ) // The decoded ABI for megapools @@ -101,12 +101,12 @@ func (mp *megapoolV1) GetVersion() uint8 { return mp.Version } -func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint64, error) { - validatorCount := new(*big.Int) - if err := mp.Contract.Call(opts, validatorCount, "getValidatorCount"); err != nil { +func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint32, error) { + var validatorCount uint32 + if err := mp.Contract.Call(opts, &validatorCount, "getValidatorCount"); err != nil { return 0, fmt.Errorf("error getting megapool %s validator count: %w", mp.Address.Hex(), err) } - return (*validatorCount).Uint64(), nil + return validatorCount, nil } func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) { @@ -130,6 +130,14 @@ func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) return *validatorInfo, nil } +func (mp *megapoolV1) GetLastDistributionBlock(opts *bind.CallOpts) (uint64, error) { + lastDistributionBlock := new(*big.Int) + if err := mp.Contract.Call(opts, lastDistributionBlock, "getLastDistributionBlock"); err != nil { + return 0, fmt.Errorf("error getting megapool %s lastDistributionBlock: %w", mp.Address.Hex(), err) + } + return (*lastDistributionBlock).Uint64(), nil +} + func (mp *megapoolV1) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) { assignedValue := new(*big.Int) if err := mp.Contract.Call(opts, assignedValue, "getAssignedValue"); err != nil { diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index d62cd3200..c1c76c6dd 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -13,8 +13,9 @@ type Megapool interface { GetContract() *rocketpool.Contract GetAddress() common.Address GetVersion() uint8 - GetValidatorCount(opts *bind.CallOpts) (uint64, error) + GetValidatorCount(opts *bind.CallOpts) (uint32, error) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) + GetLastDistributionBlock(opts *bind.CallOpts) (uint64, error) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) GetDebt(opts *bind.CallOpts) (*big.Int, error) GetRefundValue(opts *bind.CallOpts) (*big.Int, error) From 13b3eab85fab239af442ea56b4a30d038e19f6b1 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 5 Feb 2025 23:24:37 -0800 Subject: [PATCH 817/878] Add GetDelegateExpired binding --- megapool/megapool-contract.go | 9 +++++++++ megapool/megapool-interface.go | 1 + 2 files changed, 10 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 9fd66f1b3..03f45d152 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -366,6 +366,15 @@ func (mp *megapoolV1) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, return *address, nil } +// Returns true if the megapools current delegate has expired +func (mp *megapoolV1) GetDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) { + delegateExpired := new(bool) + if err := mp.Contract.Call(opts, delegateExpired, "getDelegateExpired"); err != nil { + return false, fmt.Errorf("error checking if the megapool's delegate has expired:, %w", err) + } + return *delegateExpired, nil +} + // Estimate the gas of DelegateUpgrade func (mp *megapoolV1) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "delegateUpgrade") diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index c1c76c6dd..47280e2a8 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -44,6 +44,7 @@ type Megapool interface { SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) GetDelegate(opts *bind.CallOpts) (common.Address, error) + GetDelegateExpired(rp *rocketpool.RocketPool, opts *bind.CallOpts) (bool, error) GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) From 583d596ad677142e026b2a334c8ad8abdcd9f7a9 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:45:25 -0300 Subject: [PATCH 818/878] New ABI --- megapool/megapool-contract.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 03f45d152..a8bd55ee0 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -45,6 +45,12 @@ type ValidatorInfo struct { Dissolved bool `abi:"dissolved"` } +type ValidatorInfoFromGlobalIndex struct { + ValidatorInfo ValidatorInfo `abi:"validatorInfo"` + MegapoolAddress common.Address `abi:"megapoolAddress"` + ValidatorId uint32 `abi:"validatorId"` +} + // Megapool contract type megapoolV1 struct { Address common.Address @@ -54,13 +60,13 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "eJztWU1v2zgQ/SuFz0EP3W4PubVxChSbLLxusj0EQUCJY4cITWrJoR2j2P/ekWx9WZQlxVKqQ06JTOrxcTjzZoa6+zlhSqvtSjs7OV8waeFsIlTkkB7vftK/HJ6BT87RuGQEwSgmb7YRTM4njHMD1k7OJoqt4h9WsGSR1pJ+wfKU/8+awBw9f/jzUw62ZlJwhtp84zleOquEl/E+DoiC/lSR7rMJ13v6/6Yrf7ZWLBUU1oc1KExWf7Nbvd2m8J8D92a3rna7VKfarSU1RkCE+zrbnMOGGW4vJKOZw+9NaQ6fe9zfWtN4n4AG8LFPvLYHMBUWjQgc+g+hZPLKin98yBd8qA0VmlVYlyXy+dUpHsesdrhfgGZYZAjXDlkgpMAtTY7YlgWysJGFUyEKrcrkcvSQydBJgtlvr7SEdw8VN8nf9B5DC784CSF2hHoAr5XWAjYdTBSHXLPpKfo6W59DZCAkpD7he/M8vktA4+QmrNVyDZnqD3RAWbQPg78ETMsj2smBrZt9fxiHJ1JTCHAsXC6fI2FYPOmL1OHTWGhdMYtZMhgbub/j9J0VekcoVapBTxXYH6UvWvExmeiCRQKZHAulGSgu1PJlqXgwVnOgSeOSp1sLZmRnlyWii31N2sCqmPS8ie5lnHpLsMUtfVMLfbCjUK8irajq9S4abBEKmhK54C/Y5qvthmuKuyJZSRq7y48rWuqmUqLHlNuhzONaxmKeZk9D2QtZI0iw66v3EHSkT8W2IRltfAueBXZ/S6h/9sVbx9dmJPoxz+40ozhdUGh25poWc5UX7yt9G+VbF+K7OeVawLT1/04+ypZwxbbkou8P3bYSZOgiqtF6ivsfAh+5YRsmLwxw8lJB/ebx8E/c3x//6VDPAlCSwIeAnPd463zkrB6chcvdUd+I+BBaHHZZDXIFmrngqZUu1CJ8J2lg6Ay0BSlJIbVf2gqcMmRzrdF/DGmnC5uBew0D9Eql8D6lzW/hC7V3WEVeiejdqkQW5rOrwRvCMkW+M0k9QevpV35vn9rswXZgxz1rStEx1U8fC7lJ6gMr02irG5xcbjk8t1OUSnnQQQaKhtjUiK/HGn6ou/sSmCJVgyoAzapPRZkqzIzWi8IhRfvnStYpVgOvHEstwn2IKM/R3SAqkuOvwdh4+NW7glNu3ytNuJZ8CpKqGyxs3ftVpiUgZa+TALtfl6fL3UZLw/jwX7EWRq/62dqrfta5xMf4/jsEse7/q06l+0B/Vd/znqgFuKKlqGSISBj922pT0zApAxY+1V+elzxsGD1J7kKzwBnFRVrKJ7kXhYb7tLILePqrPi5oFwugOWsYm6UyR2xHbCBbNRvgQZWuaz3GyLpzEZc4wg5bNxx0fF7hKJXfxw39MnotFMLsdJPI/ALRahsK/ZXC56CHtM0ht2wFgiaF6yTtIQgMShw7hGlS5eIFQf+9I1mrRVlyLCU65JTIot4MH4dvlseXARFSrOfS6sHphHANRwMmAmvw8fEF/6WwAjo4NcpGbwwoQfj9OoDB6YBQqkDrwdFAkHn4wxymJJCS4y+muOTfUR2YxefjbycZ2IJwRomR6ppmeMmqAl7q925Aw/BPGekpXXAbu/87sXymNZsKyNmHBQgTWf/grZq3S/hrwX7wti9vV6KatwJLJcNfjjO748qd4KqceRJF93craEiptCY2gCu0IQZurSEe48yscXFA1sTjuf1MrPANk6LoXIbuE+5bjjAjWBK1ZcK5hwJ5QtLcl87TqDlOie8PQlBgnqsBnCwtGCz3oIgTNq+nHi/M3uxTCBT4iNQmfGuRRzf60E/fmNaSLyC9lB0dENNGMc+2e0IZ/hRMkr1wJ1tc18d+NwGPTl2CZ/riy9UqYIqEi8659Gd9cesnSt9Zmup2uFTKh4482J5L51LQPlF0QQJmCO+LS0MQlInp67JdZ16NABf1SwEeNKienV2q9RfSiveUp9ayWH5T12Iit/bky3kgBZaWTqPe2kBOVQLr/YB1Zm3zuqKCyjvLiY6T0BxN3ZfK4dDlZiijsGDQJstlh6HEUlYL4m16i6RexgNb5IxHb2u/ghUz+Yq+2VdM/IorpD0/G6LsGzJ7hZtBmDDwcu7ta1IxlT58KvVIWPNY33waYbYFk7Q/dxijZAo3ZI0h+nk7bEu3zNgAC6GWbv4fZp6pIkvCLxRQjFKGvd1uAYjCPx9aWzcjvogtCkBBbsYeBu/ZPBaq+rameFZjq+Fqc9T3LDyEBoddVINMgYbWmzXShUqEO5QGYqyCpiAFKcQeR2pmLokhIymN+xiSdhKWHRf0CvCTUnV7SC/dIBZIVRzk/YpE70FEsjAa3nTedRVdpBtKqh3UjqbgfZvB+gjWHQfuUV2KDl09+Zphai63WMa3jcYkmdxSWDVTlFJ5sIcM5IlYVoivgw031ONTAUygqkEZAFdVp6JUFYZKyknukIL4uZR1EsbjLPuWd6nBde/ilmfothMVyfAXoHT4+s0r8GZTaffgt9SGS04vgWN1Y3Jbd06mGwJi9joIcP/RdGLuIZgqQruf5E+UnLeztco70gVNV+Y5HDL7wBaHcOR2p1i5ReHsrNZa3hO2ADdoCkuGAIXRva0mNQ3h3CP+rHpCXYiwbvQkGjimF6cXo7TEn2j4CDUTtWIIOPqrNqagkwlEnW3fmEoDsZljHXFVT8BYFAa2DjLS7pyFJQ7T3dYNWx2fUzgK5fduol/nXgOFUBvdRGf+AyRlGdM=" + megapoolV1EncodedAbi string = "eJztWUtz0zAQ/itMzh0OBXrorTRlpkNhQmjh0OlkZGuTaqpIRlolzTD8d9ZJ/Irl2CF28aGn1pH87UOrbx++/z1gSqvVXDs7OJ8yaeFkIFTkkB7vf9O/HJ6BD87RuPUKglFM3q4iGJwPGOcGrB2cDBSbxz/MYcYirSX9gsUtf07qwBw9n344y8AWTArOUJtrnuEluwp4qd77AVHQnzLSQ7rhy1b9H4nkC2vFTEFOPixA4Vr6q9+q/TaEXw7cq98O9duVOtZvDVVjBES4L2PmGJbMcHspGe3s3jalOVy0aN9C03qbgAbwsU28pgcwFBaNCBz6D6Hg8pLEd6eZwEnlVaFdOblsTZ+fnOLxndUOtwJoh0WG8MUhC4QUuKLNEVuxQOYMmToVotCqqFyGHjIZOkkwI1BcqNnWyoIkrymlaMne9J5Gg/A4CiGOh2oAr7MWApZ1nqoXPKmkAY+XX91bGYgxsdUHOHHcwTHOITIQElKb8K3db75J8/3UTVir5QLS3NrRAaWc2g3+DDApQsmSHV/Xx343AU9KDSHAvuhy9RwJw+JNH6UOn/qi1g2zmKbcvin3NS6S0nJ6j0qlmttTa7en0keteJ9cdMkigUz2RaWjKp3OtBoDbeoXPd1ZMD07uzQRXW5rrhqt8knPm+harAr/JcHmTbpWU71jUajnkVbUW3iFBiuEHKdELvgMq0zaZrmiuMsrK4ljN/lxTqJuS41QrHIzlHFcy1jM0uxxKFsiqwUJNtOLLQQd6VO+OVuv1r4FzwIPf0uob9vi7cDXRkT6sZ6HqxnF6YKu5sG6JsVc6cWHUndM+daF+GZMuRYwGbB8pxhlM7hhKwrRt7thW7pk6CKq0Vq69z8FPnLDlkxeGuAUpYK6+v3Xfx3+/vufLHXaFgYUvPsHFHvOauIsXG2O+lbEh9DgsItskDHQyAVPjXihEuE7UQNDZ6ApSIEKqf3SVuCQIRtrjf5jSDpdWHbcaxigV0qF9zHDlHZGBGZDendqTQvj0U3nDWFRRb5xSbWC1tOv/N8+tT6CbceBe1KXomNVz97ncpPUO16m1UYTnIxuOTw3Y5RSeXAADeQdsawgX483/FD3DwUwRawGZQDaVZ2KUlYYGa2nuUOKts+lrJOvBl74LjW47l3c8gzddcIiGf4CjI2XX7wrOOYbR6kJ15IPQVJ1gznTvd++GgJS9joK8PCPEom4u2hmGO/+W+HU6Hk7pr3ox7MrfIzn3yGIRfvfzkrdB/qr+pZtohbghkRRyRARMfrNalLTMCkDFj5VD88LEdYNn6xnoenF6cUgLdFnPReFmnlaMQQ8/VUbA9rpFGjPAvrmqTQQmynWka/qHTBRhXGtxxlpdy7iEkfYbuuGnY7PSxyF8nu/o/9NvQYMYTa8Scr8BRItk48=" ) // The decoded ABI for megapools var megapoolV1Abi *abi.ABI -// Create new minipool contract +// Create new megapool contract func NewMegaPoolV1(rp *rocketpool.RocketPool, address common.Address, opts *bind.CallOpts) (Megapool, error) { var contract *rocketpool.Contract From d1d32cfca52e7339552f3fc7bea5161e7225cfcd Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:46:56 -0300 Subject: [PATCH 819/878] Megapool manager --- megapool/megapool-manager.go | 61 ++++++++++++++++++++++++++++++++++++ utils/state/contracts.go | 4 +++ 2 files changed, 65 insertions(+) create mode 100644 megapool/megapool-manager.go diff --git a/megapool/megapool-manager.go b/megapool/megapool-manager.go new file mode 100644 index 000000000..080359b91 --- /dev/null +++ b/megapool/megapool-manager.go @@ -0,0 +1,61 @@ +package megapool + +import ( + "context" + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func GetValidatorCount(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32, error) { + megapoolManager, err := getRocketMegapoolManager(rp, opts) + if err != nil { + return 0, err + } + var validatorCount *big.Int + if err := megapoolManager.Call(opts, &validatorCount, "getValidatorCount"); err != nil { + return 0, fmt.Errorf("error getting megapool manager validator count: %w", err) + } + return uint32((*validatorCount).Uint64()), nil +} + +func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOpts) (ValidatorInfoFromGlobalIndex, error) { + megapoolManager, err := getRocketMegapoolManager(rp, opts) + if err != nil { + return ValidatorInfoFromGlobalIndex{}, err + } + + validatorInfo := new(ValidatorInfoFromGlobalIndex) + + indexBig := new(big.Int).SetUint64(uint64(index)) + + callData, err := megapoolManager.ABI.Pack("getValidatorInfo", indexBig) + if err != nil { + return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error creating calldata for getValidatorInfo: %w", err) + } + + response, err := megapoolManager.Client.CallContract(context.Background(), ethereum.CallMsg{To: megapoolManager.Address, Data: callData}, nil) + if err != nil { + return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error calling getValidatorInfo: %w", err) + } + + err = megapoolManager.ABI.UnpackIntoInterface(&validatorInfo, "getValidatorInfo", response) + if err != nil { + return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error unpacking getValidatorInfo response: %w", err) + } + + return *validatorInfo, nil +} + +// Get contracts +var rocketMegapoolManagerLock sync.Mutex + +func getRocketMegapoolManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMegapoolManagerLock.Lock() + defer rocketMegapoolManagerLock.Unlock() + return rp.GetContract("rocketMegapoolManager", opts) +} diff --git a/utils/state/contracts.go b/utils/state/contracts.go index 82dfff188..ba53ad559 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -55,6 +55,7 @@ type NetworkContracts struct { // Saturn RocketMegapoolFactory *rocketpool.Contract + RocketMegapoolManager *rocketpool.Contract } type contractArtifacts struct { @@ -180,6 +181,9 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad wrappers = append(wrappers, contractArtifacts{ name: "rocketMegapoolFactory", contract: &contracts.RocketMegapoolFactory, + }, contractArtifacts{ + name: "rocketMegapoolManager", + contract: &contracts.RocketMegapoolManager, }) // Add the address and ABI getters to multicall From c1ee548e21bdafd455c0f8acbd2e6258aef876b3 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 6 Feb 2025 21:31:53 -0300 Subject: [PATCH 820/878] Add GetAllMegapoolValidators --- settings/protocol/megapool.go | 37 ++++++++++++++++++ utils/state/megapool.go | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 settings/protocol/megapool.go create mode 100644 utils/state/megapool.go diff --git a/settings/protocol/megapool.go b/settings/protocol/megapool.go new file mode 100644 index 000000000..18b82f925 --- /dev/null +++ b/settings/protocol/megapool.go @@ -0,0 +1,37 @@ +package protocol + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +// Config +const ( + MegapoolSettingsContractName string = "rocketDAOProtocolSettingsMegapool" +) + +// Megapool time before dissolved +func GetMegapoolTimeBeforeDissolve(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { + minipoolSettingsContract, err := getMegapoolSettingsContract(rp, opts) + if err != nil { + return 0, err + } + value := new(uint64) + if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { + return 0, fmt.Errorf("error getting minipool withdrawable submissions enabled status: %w", err) + } + return *value, nil +} + +// Get contracts +var megapoolSettingsContractLock sync.Mutex + +func getMegapoolSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + megapoolSettingsContractLock.Lock() + defer megapoolSettingsContractLock.Unlock() + return rp.GetContract(MegapoolSettingsContractName, opts) +} diff --git a/utils/state/megapool.go b/utils/state/megapool.go new file mode 100644 index 000000000..c48d04222 --- /dev/null +++ b/utils/state/megapool.go @@ -0,0 +1,71 @@ +package state + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/rocket-pool/rocketpool-go/megapool" + "github.com/rocket-pool/rocketpool-go/rocketpool" + "golang.org/x/sync/errgroup" +) + +const ( + megapoolValidatorsBatchSize int = 1000 +) + +// Get all megapool validators using the multicaller +func GetAllMegapoolValidators(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]megapool.ValidatorInfoFromGlobalIndex, error) { + opts := &bind.CallOpts{ + BlockNumber: contracts.ElBlockNumber, + } + + // Get megapool validators count + megapoolValidatorsCount, err := megapool.GetValidatorCount(rp, opts) + if err != nil { + return []megapool.ValidatorInfoFromGlobalIndex{}, err + } + + // Sync + var wg errgroup.Group + wg.SetLimit(threadLimit) + validators := make([]megapool.ValidatorInfoFromGlobalIndex, megapoolValidatorsCount) + + // Run the getters in batches + count := int(megapoolValidatorsCount) + for i := 0; i < count; i += megapoolValidatorsBatchSize { + i := i + max := i + megapoolValidatorsBatchSize + if max > count { + max = count + } + + wg.Go(func() error { + for j := i; j < max; j++ { + validators[j], err = megapool.GetValidatorInfo(rp, uint32(j), opts) + if err != nil { + return fmt.Errorf("error executing GetValidatorInfo with global index %d", j) + } + } + + // var err error + // mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) + // if err != nil { + // return err + // } + // for j := i; j < max; j++ { + // mc.AddCall(contracts.RocketMegapoolManager, &validators[j], "getValidatorInfo", big.NewInt(int64(j))) + // } + // _, err = mc.FlexibleCall(true, opts) + // if err != nil { + // return fmt.Errorf("error executing multicall: %w", err) + // } + return nil + }) + } + + if err := wg.Wait(); err != nil { + return nil, fmt.Errorf("error getting all megapool validators: %w", err) + } + + return validators, nil +} From 5ee51523176f4adc1689a6a7377ee6688f10a66b Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 10 Feb 2025 00:31:39 -0300 Subject: [PATCH 821/878] Add abi details to RevenueSlit --- network/revenues.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/network/revenues.go b/network/revenues.go index 64f63f652..3f24f1527 100644 --- a/network/revenues.go +++ b/network/revenues.go @@ -10,9 +10,9 @@ import ( ) type RevenueSplit struct { - NodeShare *big.Int - VoterShare *big.Int - RethShare *big.Int + NodeShare *big.Int `abi:"nodeShare"` + VoterShare *big.Int `abi:"voterShare"` + RethShare *big.Int `abi:"rethShare"` } // Get the current node share From 20d489f2303b1c0fea0ba1ab742155e07b468314 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 10 Feb 2025 19:40:51 -0300 Subject: [PATCH 822/878] Add withdraw credit --- node/deposit.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/node/deposit.go b/node/deposit.go index d29f06569..b18e3c90a 100644 --- a/node/deposit.go +++ b/node/deposit.go @@ -58,6 +58,28 @@ func WithdrawEth(rp *rocketpool.RocketPool, nodeAccount common.Address, ethAmoun return tx, nil } +// Estimate the gas required to withdraw credit +func EstimateWithdrawCreditGas(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "withdrawCredit", amount) +} + +// Withdraws credit store on a node as rETH +func WithdrawCredit(rp *rocketpool.RocketPool, amount *big.Int, opts *bind.TransactOpts) (*types.Transaction, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return nil, err + } + tx, err := rocketDepositPool.Transact(opts, "withdrawCredit", amount) + if err != nil { + return nil, fmt.Errorf("error withdrawing credit: %w", err) + } + return tx, nil +} + // Estimate the gas of DepositWithCredit func EstimateDepositWithCreditGas(rp *rocketpool.RocketPool, bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketNodeDeposit, err := getRocketNodeDeposit(rp, nil) @@ -193,3 +215,11 @@ func getRocketNodeDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rock defer rocketNodeDepositLock.Unlock() return rp.GetContract("rocketNodeDeposit", opts) } + +var rocketDepositPoolLock sync.Mutex + +func getRocketDepositPool(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDepositPoolLock.Lock() + defer rocketDepositPoolLock.Unlock() + return rp.GetContract("rocketDepositPool", opts) +} From e340a4428313fe0e47456624ee5af7d91ebd184f Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 10 Feb 2025 23:01:38 -0300 Subject: [PATCH 823/878] Adds checks if saturn is deployed --- utils/state/contracts.go | 36 ++++++++++++++++++++++++++++-------- utils/state/node.go | 7 ++++--- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/utils/state/contracts.go b/utils/state/contracts.go index ba53ad559..d734b29aa 100644 --- a/utils/state/contracts.go +++ b/utils/state/contracts.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/hashicorp/go-version" + "github.com/rocket-pool/rocketpool-go/deposit" "github.com/rocket-pool/rocketpool-go/rocketpool" "github.com/rocket-pool/rocketpool-go/utils/multicall" ) @@ -66,7 +67,7 @@ type contractArtifacts struct { } // Get a new network contracts container -func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) (*NetworkContracts, error) { +func NewNetworkContracts(rp *rocketpool.RocketPool, isSaturnDeployed bool, multicallerAddress common.Address, balanceBatcherAddress common.Address, opts *bind.CallOpts) (*NetworkContracts, error) { // Get the latest block number if it's not provided if opts == nil { latestElBlock, err := rp.Client.BlockNumber(context.Background()) @@ -178,13 +179,15 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad }) // Saturn wrappers - wrappers = append(wrappers, contractArtifacts{ - name: "rocketMegapoolFactory", - contract: &contracts.RocketMegapoolFactory, - }, contractArtifacts{ - name: "rocketMegapoolManager", - contract: &contracts.RocketMegapoolManager, - }) + if isSaturnDeployed { + wrappers = append(wrappers, contractArtifacts{ + name: "rocketMegapoolFactory", + contract: &contracts.RocketMegapoolFactory, + }, contractArtifacts{ + name: "rocketMegapoolManager", + contract: &contracts.RocketMegapoolManager, + }) + } // Add the address and ABI getters to multicall for i, wrapper := range wrappers { @@ -229,12 +232,29 @@ func NewNetworkContracts(rp *rocketpool.RocketPool, multicallerAddress common.Ad return contracts, nil } +// Returns whether or not Saturn has been deployed +func (c *NetworkContracts) isSaturnDeployed() bool { + constraint, _ := version.NewConstraint(">= 1.4.0") + return constraint.Check(c.Version) +} + // Get the current version of the network func (c *NetworkContracts) getCurrentVersion(rp *rocketpool.RocketPool) error { opts := &bind.CallOpts{ BlockNumber: c.ElBlockNumber, } + depositPoolVersion, err := deposit.GetRocketDepositPoolVersion(rp, opts) + if err != nil { + return fmt.Errorf("error checking deposit pool version: %w", err) + } + + // Check for v1.4 (Saturn 1) + if depositPoolVersion > 3 { + c.Version, err = version.NewSemver("1.4.0") + return err + } + // Check for v1.2 nodeStakingVersion, err := rocketpool.GetContractVersion(rp, *c.RocketNodeStaking.Address, opts) if err != nil { diff --git a/utils/state/node.go b/utils/state/node.go index 699feac2e..39a051023 100644 --- a/utils/state/node.go +++ b/utils/state/node.go @@ -354,7 +354,8 @@ func addNodeDetailsCalls(contracts *NetworkContracts, mc *multicall.MultiCaller, mc.AddCall(contracts.RocketNodeStaking, &details.CollateralisationRatio, "getNodeETHCollateralisationRatio", address) // Saturn - mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolAddress, "getExpectedAddress", address) - mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getMegapoolDeployed", address) - + if contracts.isSaturnDeployed() { + mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolAddress, "getExpectedAddress", address) + mc.AddCall(contracts.RocketMegapoolFactory, &details.MegapoolDeployed, "getMegapoolDeployed", address) + } } From b6223702542789ea62ddaea753a0b0dc8accf4c3 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 11 Feb 2025 01:00:30 -0300 Subject: [PATCH 824/878] Add HeadMovedBlock --- deposit/deposit-pool.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 24a247e99..80cb5f830 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -59,8 +59,9 @@ func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.Transac // Struct to hold queue top (address of the validator at the top of the queue and a boolean indicating if the assignment is possible) type QueueTop struct { - Receiver common.Address - AssignmentPossible bool + Receiver common.Address `abi:"receiver"` + AssignmentPossible bool `abi:"assignmentPossible"` + HeadMovedBlock *big.Int `abi:"headMovedBlock"` } func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueTop, error) { From 502208674320597697ee4874ade9b7486e9eb915 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 11 Feb 2025 01:01:03 -0300 Subject: [PATCH 825/878] Add AssignDeposits to legacy v131 --- deposit/deposit.go | 8 ++++---- legacy/v1.3.1/node/deposit.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/deposit/deposit.go b/deposit/deposit.go index 37d046a1a..5c2707cdb 100644 --- a/deposit/deposit.go +++ b/deposit/deposit.go @@ -73,21 +73,21 @@ func Deposit(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of AssignDeposits -func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, max *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return rocketpool.GasInfo{}, err } - return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits") + return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits", max) } // Assign deposits -func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { +func AssignDeposits(rp *rocketpool.RocketPool, max *big.Int, opts *bind.TransactOpts) (common.Hash, error) { rocketDepositPool, err := getRocketDepositPool(rp, nil) if err != nil { return common.Hash{}, err } - tx, err := rocketDepositPool.Transact(opts, "assignDeposits") + tx, err := rocketDepositPool.Transact(opts, "assignDeposits", max) if err != nil { return common.Hash{}, fmt.Errorf("error assigning deposits: %w", err) } diff --git a/legacy/v1.3.1/node/deposit.go b/legacy/v1.3.1/node/deposit.go index 480b20807..75765e55c 100644 --- a/legacy/v1.3.1/node/deposit.go +++ b/legacy/v1.3.1/node/deposit.go @@ -65,3 +65,34 @@ func getRocketNodeDeposit(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rock defer rocketNodeDepositLock.Unlock() return rp.GetContract("rocketNodeDeposit", opts) } + +// Estimate the gas of AssignDeposits +func EstimateAssignDepositsGas(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return rocketDepositPool.GetTransactionGasInfo(opts, "assignDeposits") +} + +// Assign deposits +func AssignDeposits(rp *rocketpool.RocketPool, opts *bind.TransactOpts) (common.Hash, error) { + rocketDepositPool, err := getRocketDepositPool(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := rocketDepositPool.Transact(opts, "assignDeposits") + if err != nil { + return common.Hash{}, fmt.Errorf("error assigning deposits: %w", err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketDepositPoolLock sync.Mutex + +func getRocketDepositPool(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketDepositPoolLock.Lock() + defer rocketDepositPoolLock.Unlock() + return rp.GetContract("rocketDepositPool", opts) +} From 3bdd4235b42f351e7ee0d3e780a8b4dd05e9b287 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 11 Feb 2025 10:03:53 -0800 Subject: [PATCH 826/878] Add helper for grabbing the queue position --- storage/linked-list-storage.go | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/storage/linked-list-storage.go b/storage/linked-list-storage.go index 4a9e1674e..4e9a3fdd7 100644 --- a/storage/linked-list-storage.go +++ b/storage/linked-list-storage.go @@ -11,10 +11,29 @@ import ( ) type DepositQueueValue struct { - Receiver common.Address - ValidatorID uint32 - SuppliedValue uint32 - RequestedValue uint32 + Receiver common.Address `abi:"receiver"` + ValidatorID uint32 `abi:"validatorId"` + SuppliedValue uint32 `abi:"suppliedValue"` + RequestedValue uint32 `abi:"requestedValue"` +} + +type Chunk struct { + Entries []DepositQueueValue `abi:"entries"` + NextIndex *big.Int `abi:"nextIndex"` +} + +// Returns a chunk of the queue along with the next index +func Scan(rp *rocketpool.RocketPool, namespace [32]byte, startIndex *big.Int, count *big.Int, opts *bind.CallOpts) (Chunk, error) { + linkedListStorage, err := getLinkedListStorage(rp, opts) + if err != nil { + return Chunk{}, err + } + + chunk := Chunk{} + if err := linkedListStorage.Call(opts, &chunk, "scan", namespace, startIndex, count); err != nil { + return Chunk{}, fmt.Errorf("error getting chunk for namespace %x: %w", namespace, err) + } + return chunk, nil } // Return the number of items in queue From a91b1beeda718da6a81a71010dc9ea351eb6f13d Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:08:49 -0300 Subject: [PATCH 827/878] Remove AssignMegapools --- deposit/deposit-pool.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 80cb5f830..7cacea4a5 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -33,30 +33,6 @@ func ExitQueue(rp *rocketpool.RocketPool, validatorIndex uint64, expressQueue bo return tx.Hash(), nil } -// Estimate the gas required to assign megapools -func EstimateAssignMegapoolsGas(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - countBig := big.NewInt(int64(count)) - rocketDepositPool, err := getRocketDepositPool(rp, nil) - if err != nil { - return rocketpool.GasInfo{}, err - } - return rocketDepositPool.GetTransactionGasInfo(opts, "assignMegapools", countBig) -} - -// Assign megapools -func AssignMegapools(rp *rocketpool.RocketPool, count uint64, opts *bind.TransactOpts) (common.Hash, error) { - countBig := big.NewInt(int64(count)) - rocketDepositPool, err := getRocketDepositPool(rp, nil) - if err != nil { - return common.Hash{}, err - } - tx, err := rocketDepositPool.Transact(opts, "assignMegapools", countBig) - if err != nil { - return common.Hash{}, fmt.Errorf("error assigning megapools: %w", err) - } - return tx.Hash(), nil -} - // Struct to hold queue top (address of the validator at the top of the queue and a boolean indicating if the assignment is possible) type QueueTop struct { Receiver common.Address `abi:"receiver"` From 741edcdedda950f30015cd411d8dfa9157699a62 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:32:40 -0300 Subject: [PATCH 828/878] Add GetTotalQueueLength --- deposit/deposit-pool.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 80cb5f830..d82fdcb7c 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -75,3 +75,15 @@ func GetQueueTop(rp *rocketpool.RocketPool, opts *bind.CallOpts) (QueueTop, erro } return *queueTop, nil } + +func GetTotalQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32, error) { + rocketDepositPool, err := getRocketDepositPool(rp, opts) + if err != nil { + return 0, err + } + totalLength := new(big.Int) + if err := rocketDepositPool.Call(opts, totalLength, "getTotalQueueLength"); err != nil { + return 0, fmt.Errorf("error getting total queue length: %w", err) + } + return uint32(totalLength.Uint64()), nil +} From ad79c5042b528d0277aeb766f084a8c57989e34b Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:49:32 -0300 Subject: [PATCH 829/878] Fix ptr --- deposit/deposit-pool.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 3fa7057d3..7d722e8fa 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -57,9 +57,9 @@ func GetTotalQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32 if err != nil { return 0, err } - totalLength := new(big.Int) + totalLength := new(*big.Int) if err := rocketDepositPool.Call(opts, totalLength, "getTotalQueueLength"); err != nil { return 0, fmt.Errorf("error getting total queue length: %w", err) } - return uint32(totalLength.Uint64()), nil + return uint32((*totalLength).Uint64()), nil } From e671c116e17678f762c78917eb28aceefdac0aad Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:20:03 -0300 Subject: [PATCH 830/878] GetValidatorInfo from mpManager now working - see comments for details --- megapool/megapool-manager.go | 31 ++++++++++++++++++++++++++++++- settings/protocol/megapool.go | 13 +++++++------ utils/state/megapool.go | 12 ------------ 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/megapool/megapool-manager.go b/megapool/megapool-manager.go index 080359b91..fe214f1b6 100644 --- a/megapool/megapool-manager.go +++ b/megapool/megapool-manager.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" ) @@ -43,11 +44,39 @@ func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOp return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error calling getValidatorInfo: %w", err) } - err = megapoolManager.ABI.UnpackIntoInterface(&validatorInfo, "getValidatorInfo", response) + // Both Call and UnpackIntoStruct were not working with this response (which contains a struct inside a struct) + // For the moment this was the only way for it to work. We should investigate further. + iface, err := megapoolManager.ABI.Unpack("getValidatorInfo", response) if err != nil { return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error unpacking getValidatorInfo response: %w", err) } + + src := iface[0].(struct { + PubKey []byte `json:"pubKey"` + LastAssignmentTime uint32 `json:"lastAssignmentTime"` + LastRequestedValue uint32 `json:"lastRequestedValue"` + LastRequestedBond uint32 `json:"lastRequestedBond"` + Staked bool `json:"staked"` + Exited bool `json:"exited"` + InQueue bool `json:"inQueue"` + InPrestake bool `json:"inPrestake"` + ExpressUsed bool `json:"expressUsed"` + Dissolved bool `json:"dissolved"` + }) + copy(validatorInfo.ValidatorInfo.PubKey[:], src.PubKey) + validatorInfo.ValidatorInfo.LastAssignmentTime = src.LastAssignmentTime + validatorInfo.ValidatorInfo.LastRequestedValue = src.LastRequestedValue + validatorInfo.ValidatorInfo.LastRequestedBond = src.LastRequestedBond + validatorInfo.ValidatorInfo.Staked = src.Staked + validatorInfo.ValidatorInfo.Exited = src.Exited + validatorInfo.ValidatorInfo.InQueue = src.InQueue + validatorInfo.ValidatorInfo.InPrestake = src.InPrestake + validatorInfo.ValidatorInfo.ExpressUsed = src.ExpressUsed + validatorInfo.ValidatorInfo.Dissolved = src.Dissolved + validatorInfo.MegapoolAddress = iface[1].(common.Address) + validatorInfo.ValidatorId = iface[2].(uint32) + return *validatorInfo, nil } diff --git a/settings/protocol/megapool.go b/settings/protocol/megapool.go index 18b82f925..358f06729 100644 --- a/settings/protocol/megapool.go +++ b/settings/protocol/megapool.go @@ -2,6 +2,7 @@ package protocol import ( "fmt" + "math/big" "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -14,17 +15,17 @@ const ( MegapoolSettingsContractName string = "rocketDAOProtocolSettingsMegapool" ) -// Megapool time before dissolved +// Megapool time before dissolve func GetMegapoolTimeBeforeDissolve(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint64, error) { - minipoolSettingsContract, err := getMegapoolSettingsContract(rp, opts) + megapoolSettingsContract, err := getMegapoolSettingsContract(rp, opts) if err != nil { return 0, err } - value := new(uint64) - if err := minipoolSettingsContract.Call(opts, value, "getSubmitWithdrawableEnabled"); err != nil { - return 0, fmt.Errorf("error getting minipool withdrawable submissions enabled status: %w", err) + value := new(*big.Int) + if err := megapoolSettingsContract.Call(opts, value, "getTimeBeforeDissolve"); err != nil { + return 0, fmt.Errorf("error getting megapool time before dissolve value: %w", err) } - return *value, nil + return (*value).Uint64(), nil } // Get contracts diff --git a/utils/state/megapool.go b/utils/state/megapool.go index c48d04222..9fc7ca74c 100644 --- a/utils/state/megapool.go +++ b/utils/state/megapool.go @@ -47,18 +47,6 @@ func GetAllMegapoolValidators(rp *rocketpool.RocketPool, contracts *NetworkContr } } - // var err error - // mc, err := multicall.NewMultiCaller(rp.Client, contracts.Multicaller.ContractAddress) - // if err != nil { - // return err - // } - // for j := i; j < max; j++ { - // mc.AddCall(contracts.RocketMegapoolManager, &validators[j], "getValidatorInfo", big.NewInt(int64(j))) - // } - // _, err = mc.FlexibleCall(true, opts) - // if err != nil { - // return fmt.Errorf("error executing multicall: %w", err) - // } return nil }) } From 3c04da89133eb00c854f57ba2aefabb1af4cb92c Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:57:07 -0300 Subject: [PATCH 831/878] Add standard/express queue length --- deposit/deposit-pool.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/deposit/deposit-pool.go b/deposit/deposit-pool.go index 7d722e8fa..6d2a8484b 100644 --- a/deposit/deposit-pool.go +++ b/deposit/deposit-pool.go @@ -63,3 +63,27 @@ func GetTotalQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32 } return uint32((*totalLength).Uint64()), nil } + +func GetExpressQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32, error) { + rocketDepositPool, err := getRocketDepositPool(rp, opts) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketDepositPool.Call(opts, length, "getExpressQueueLength"); err != nil { + return 0, fmt.Errorf("error getting express queue length: %w", err) + } + return uint32((*length).Uint64()), nil +} + +func GetStandardQueueLength(rp *rocketpool.RocketPool, opts *bind.CallOpts) (uint32, error) { + rocketDepositPool, err := getRocketDepositPool(rp, opts) + if err != nil { + return 0, err + } + length := new(*big.Int) + if err := rocketDepositPool.Call(opts, length, "getStandardQueueLength"); err != nil { + return 0, fmt.Errorf("error getting standard queue length: %w", err) + } + return uint32((*length).Uint64()), nil +} From 597b79c76ef69afe4175364a9a6535cb28ee3b5c Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 16 Feb 2025 17:49:27 -0800 Subject: [PATCH 832/878] Add CalculatePendingRewards and CalculateRewards --- megapool/megapool-contract.go | 22 +++++++++++++++++++++- megapool/megapool-interface.go | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index a8bd55ee0..8c2f7c5b7 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -28,6 +28,12 @@ type withdrawal struct { amountInGwei *big.Int } +type RewardSplit struct { + NodeRewards *big.Int `abi:"nodeRewards"` + VoterRewards *big.Int `abi:"voterRewards"` + RethRewards *big.Int `abi:"rethRewards"` +} + type MegapoolV1 interface { Megapool } @@ -192,7 +198,21 @@ func (mp *megapoolV1) GetUserCapital(opts *bind.CallOpts) (*big.Int, error) { return *userCapital, nil } -//TODO _calculateRewards is currently a view in RocketMegapoolDelegate.sol +func (mp *megapoolV1) CalculatePendingRewards(opts *bind.CallOpts) (RewardSplit, error) { + rewardSplits := new(RewardSplit) + if err := mp.Contract.Call(opts, rewardSplits, "calculatePendingRewards"); err != nil { + return RewardSplit{}, fmt.Errorf("error calculating the pending rewards for megapool %s: %w", mp.Address.Hex(), err) + } + return *rewardSplits, nil +} + +func (mp *megapoolV1) CalculateRewards(amount *big.Int, opts *bind.CallOpts) (RewardSplit, error) { + rewardSplits := new(RewardSplit) + if err := mp.Contract.Call(opts, rewardSplits, "calculateRewards", amount); err != nil { + return RewardSplit{}, fmt.Errorf("error calculating the rewards for amount %s: %w", amount, err) + } + return *rewardSplits, nil +} func (mp *megapoolV1) GetPendingRewards(opts *bind.CallOpts) (*big.Int, error) { pendingRewards := new(*big.Int) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 47280e2a8..f6929827c 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -22,7 +22,8 @@ type Megapool interface { GetNodeCapital(opts *bind.CallOpts) (*big.Int, error) GetNodeBond(opts *bind.CallOpts) (*big.Int, error) GetUserCapital(opts *bind.CallOpts) (*big.Int, error) - // CalculateRewards (not yet implemented) + CalculatePendingRewards(opts *bind.CallOpts) (RewardSplit, error) + CalculateRewards(amount *big.Int, opts *bind.CallOpts) (RewardSplit, error) GetPendingRewards(opts *bind.CallOpts) (*big.Int, error) GetNodeAddress(opts *bind.CallOpts) (common.Address, error) EstimateNewValidatorGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 4410642bf6417b68d50da29877af5408c78c8669 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 16 Feb 2025 21:12:17 -0800 Subject: [PATCH 833/878] Rename 'chunk' to 'slice' and improve error message in Scan --- storage/linked-list-storage.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/storage/linked-list-storage.go b/storage/linked-list-storage.go index 4e9a3fdd7..e3f40215a 100644 --- a/storage/linked-list-storage.go +++ b/storage/linked-list-storage.go @@ -17,23 +17,23 @@ type DepositQueueValue struct { RequestedValue uint32 `abi:"requestedValue"` } -type Chunk struct { +type Slice struct { Entries []DepositQueueValue `abi:"entries"` NextIndex *big.Int `abi:"nextIndex"` } -// Returns a chunk of the queue along with the next index -func Scan(rp *rocketpool.RocketPool, namespace [32]byte, startIndex *big.Int, count *big.Int, opts *bind.CallOpts) (Chunk, error) { +// Returns a slice of the specified queue along with the next index, starting at the supplied index +func Scan(rp *rocketpool.RocketPool, namespace [32]byte, startIndex *big.Int, count *big.Int, opts *bind.CallOpts) (Slice, error) { linkedListStorage, err := getLinkedListStorage(rp, opts) if err != nil { - return Chunk{}, err + return Slice{}, err } - chunk := Chunk{} - if err := linkedListStorage.Call(opts, &chunk, "scan", namespace, startIndex, count); err != nil { - return Chunk{}, fmt.Errorf("error getting chunk for namespace %x: %w", namespace, err) + slice := Slice{} + if err := linkedListStorage.Call(opts, &slice, "scan", namespace, startIndex, count); err != nil { + return Slice{}, fmt.Errorf("error getting slice of size %s for namespace %s starting at %s: %w", count, namespace, startIndex, err) } - return chunk, nil + return slice, nil } // Return the number of items in queue From 5b384846cd6def508de9d9ff962633b12c1261c8 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:09:19 -0300 Subject: [PATCH 834/878] Add GetMegapoolPubkeys --- megapool/megapool-contract.go | 46 ++++++++++++++++++++++++++++++++++ megapool/megapool-interface.go | 1 + 2 files changed, 47 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 8c2f7c5b7..50432ea07 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "sync" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -11,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/rocketpool" rptypes "github.com/rocket-pool/rocketpool-go/types" + "golang.org/x/sync/errgroup" ) type ValidatorProof struct { @@ -415,6 +417,50 @@ func (mp *megapoolV1) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, err return tx.Hash(), nil } +var ValidatorBatchSize = uint32(50) + +func (mp *megapoolV1) GetMegapoolPubkeys(opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) { + validatorCount, err := mp.GetValidatorCount(opts) + if err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + // Load pubkeys in batches + var lock = sync.RWMutex{} + pubkeys := make([]rptypes.ValidatorPubkey, validatorCount) + for bsi := uint32(0); bsi < validatorCount; bsi += ValidatorBatchSize { + + // Get batch start & end index + msi := bsi + mei := bsi + ValidatorBatchSize + if mei > validatorCount { + mei = validatorCount + } + + // Load pubkeys + var wg errgroup.Group + for mi := msi; mi < mei; mi++ { + mi := mi + wg.Go(func() error { + validator, err := mp.GetValidatorInfo(mi, opts) + if err != nil { + return err + } + lock.Lock() + pubkeys[mi] = rptypes.BytesToValidatorPubkey(validator.PubKey) + lock.Unlock() + return nil + }) + } + if err := wg.Wait(); err != nil { + return []rptypes.ValidatorPubkey{}, err + } + + } + // Return + return pubkeys, nil +} + // Create a megapool contract directly from its ABI func createMegapoolContractFromAbi(rp *rocketpool.RocketPool, address common.Address, abi *abi.ABI) (*rocketpool.Contract, error) { // Create and return diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index f6929827c..3e5868138 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -49,4 +49,5 @@ type Megapool interface { GetEffectiveDelegate(opts *bind.CallOpts) (common.Address, error) EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) + GetMegapoolPubkeys(opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) } From 159335edca6a8cfc7bda3feb66208d6a2c108567 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:52:39 -0300 Subject: [PATCH 835/878] Add NativeMegapoolDetails --- utils/state/megapool.go | 132 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/utils/state/megapool.go b/utils/state/megapool.go index 9fc7ca74c..5defb9e9a 100644 --- a/utils/state/megapool.go +++ b/utils/state/megapool.go @@ -2,10 +2,14 @@ package state import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/megapool" + "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/rocketpool-go/tokens" "golang.org/x/sync/errgroup" ) @@ -13,6 +17,27 @@ const ( megapoolValidatorsBatchSize int = 1000 ) +type NativeMegapoolDetails struct { + Address common.Address `json:"address"` + DelegateAddress common.Address `json:"delegate"` + EffectiveDelegateAddress common.Address `json:"effectiveDelegateAddress"` + Deployed bool `json:"deployed"` + ValidatorCount uint32 `json:"validatorCount"` + NodeDebt *big.Int `json:"nodeDebt"` + RefundValue *big.Int `json:"refundValue"` + DelegateExpiry uint64 `json:"delegateExpiry"` + DelegateExpired bool `json:"delegateExpired"` + NodeExpressTicketCount uint64 `json:"nodeExpressTicketCount"` + UseLatestDelegate bool `json:"useLatestDelegate"` + AssignedValue *big.Int `json:"assignedValue"` + NodeCapital *big.Int `json:"nodeCapital"` + NodeBond *big.Int `json:"nodeBond"` + UserCapital *big.Int `json:"userCapital"` + NodeShare *big.Int `json:"nodeShare"` + Balances tokens.Balances `json:"balances"` + LastDistributionBlock uint64 `json:"lastDistributionBlock"` +} + // Get all megapool validators using the multicaller func GetAllMegapoolValidators(rp *rocketpool.RocketPool, contracts *NetworkContracts) ([]megapool.ValidatorInfoFromGlobalIndex, error) { opts := &bind.CallOpts{ @@ -57,3 +82,110 @@ func GetAllMegapoolValidators(rp *rocketpool.RocketPool, contracts *NetworkContr return validators, nil } + +func GetNodeMegapoolDetails(rp *rocketpool.RocketPool, nodeAccount common.Address) (NativeMegapoolDetails, error) { + + megapoolAddress, err := megapool.GetMegapoolExpectedAddress(rp, nodeAccount, nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + + // Sync + var wg errgroup.Group + details := NativeMegapoolDetails{Address: megapoolAddress} + + // Return if megapool isn't deployed + details.Deployed, err = megapool.GetMegapoolDeployed(rp, nodeAccount, nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + if !details.Deployed { + return details, nil + } + + // Load the megapool contract + mega, err := megapool.NewMegaPoolV1(rp, megapoolAddress, nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + + details.EffectiveDelegateAddress, err = mega.GetEffectiveDelegate(nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + details.DelegateAddress, err = mega.GetDelegate(nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + + // Return if delegate is expired + details.DelegateExpired, err = mega.GetDelegateExpired(rp, nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + if details.DelegateExpired { + return details, nil + } + + details.LastDistributionBlock, err = mega.GetLastDistributionBlock(nil) + if err != nil { + return NativeMegapoolDetails{}, err + } + wg.Go(func() error { + var err error + details.NodeShare, err = network.GetCurrentNodeShare(rp, nil) + return err + }) + wg.Go(func() error { + var err error + details.NodeDebt, err = mega.GetDebt(nil) + return err + }) + wg.Go(func() error { + var err error + details.RefundValue, err = mega.GetRefundValue(nil) + return err + }) + wg.Go(func() error { + var err error + details.ValidatorCount, err = mega.GetValidatorCount(nil) + return err + }) + wg.Go(func() error { + var err error + details.UseLatestDelegate, err = mega.GetUseLatestDelegate(nil) + return err + }) + wg.Go(func() error { + var err error + details.DelegateExpiry, err = megapool.GetMegapoolDelegateExpiry(rp, details.DelegateAddress, nil) + return err + }) + wg.Go(func() error { + var err error + details.AssignedValue, err = mega.GetAssignedValue(nil) + return err + }) + wg.Go(func() error { + var err error + details.NodeCapital, err = mega.GetNodeCapital(nil) + return err + }) + wg.Go(func() error { + var err error + details.NodeBond, err = mega.GetNodeBond(nil) + return err + }) + wg.Go(func() error { + var err error + details.UserCapital, err = mega.GetUserCapital(nil) + return err + }) + + // Wait for data + if err := wg.Wait(); err != nil { + return details, err + } + + return details, nil +} From b3c66ca696ea524dbdcd1699fff4203c89101e46 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 19 Feb 2025 18:31:04 -0300 Subject: [PATCH 836/878] Fix loop value capture --- megapool/megapool-manager.go | 2 +- utils/state/megapool.go | 55 ++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/megapool/megapool-manager.go b/megapool/megapool-manager.go index fe214f1b6..7835f062c 100644 --- a/megapool/megapool-manager.go +++ b/megapool/megapool-manager.go @@ -51,7 +51,6 @@ func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOp return ValidatorInfoFromGlobalIndex{}, fmt.Errorf("error unpacking getValidatorInfo response: %w", err) } - src := iface[0].(struct { PubKey []byte `json:"pubKey"` LastAssignmentTime uint32 `json:"lastAssignmentTime"` @@ -64,6 +63,7 @@ func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOp ExpressUsed bool `json:"expressUsed"` Dissolved bool `json:"dissolved"` }) + validatorInfo.ValidatorInfo.PubKey = make([]byte, len(src.PubKey)) copy(validatorInfo.ValidatorInfo.PubKey[:], src.PubKey) validatorInfo.ValidatorInfo.LastAssignmentTime = src.LastAssignmentTime validatorInfo.ValidatorInfo.LastRequestedValue = src.LastRequestedValue diff --git a/utils/state/megapool.go b/utils/state/megapool.go index 5defb9e9a..c90ca961b 100644 --- a/utils/state/megapool.go +++ b/utils/state/megapool.go @@ -1,6 +1,7 @@ package state import ( + "context" "fmt" "math/big" @@ -9,7 +10,6 @@ import ( "github.com/rocket-pool/rocketpool-go/megapool" "github.com/rocket-pool/rocketpool-go/network" "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" "golang.org/x/sync/errgroup" ) @@ -18,24 +18,24 @@ const ( ) type NativeMegapoolDetails struct { - Address common.Address `json:"address"` - DelegateAddress common.Address `json:"delegate"` - EffectiveDelegateAddress common.Address `json:"effectiveDelegateAddress"` - Deployed bool `json:"deployed"` - ValidatorCount uint32 `json:"validatorCount"` - NodeDebt *big.Int `json:"nodeDebt"` - RefundValue *big.Int `json:"refundValue"` - DelegateExpiry uint64 `json:"delegateExpiry"` - DelegateExpired bool `json:"delegateExpired"` - NodeExpressTicketCount uint64 `json:"nodeExpressTicketCount"` - UseLatestDelegate bool `json:"useLatestDelegate"` - AssignedValue *big.Int `json:"assignedValue"` - NodeCapital *big.Int `json:"nodeCapital"` - NodeBond *big.Int `json:"nodeBond"` - UserCapital *big.Int `json:"userCapital"` - NodeShare *big.Int `json:"nodeShare"` - Balances tokens.Balances `json:"balances"` - LastDistributionBlock uint64 `json:"lastDistributionBlock"` + Address common.Address `json:"address"` + DelegateAddress common.Address `json:"delegate"` + EffectiveDelegateAddress common.Address `json:"effectiveDelegateAddress"` + Deployed bool `json:"deployed"` + ValidatorCount uint32 `json:"validatorCount"` + NodeDebt *big.Int `json:"nodeDebt"` + RefundValue *big.Int `json:"refundValue"` + DelegateExpiry uint64 `json:"delegateExpiry"` + DelegateExpired bool `json:"delegateExpired"` + NodeExpressTicketCount uint64 `json:"nodeExpressTicketCount"` + UseLatestDelegate bool `json:"useLatestDelegate"` + AssignedValue *big.Int `json:"assignedValue"` + NodeCapital *big.Int `json:"nodeCapital"` + NodeBond *big.Int `json:"nodeBond"` + UserCapital *big.Int `json:"userCapital"` + NodeShare *big.Int `json:"nodeShare"` + EthBalance *big.Int `json:"ethBalance"` + LastDistributionBlock uint64 `json:"lastDistributionBlock"` } // Get all megapool validators using the multicaller @@ -64,16 +64,16 @@ func GetAllMegapoolValidators(rp *rocketpool.RocketPool, contracts *NetworkContr max = count } - wg.Go(func() error { - for j := i; j < max; j++ { + for j := i; j < max; j++ { + j := j // Create a new variable `j` scoped to the loop iteration + wg.Go(func() error { validators[j], err = megapool.GetValidatorInfo(rp, uint32(j), opts) if err != nil { return fmt.Errorf("error executing GetValidatorInfo with global index %d", j) } - } - - return nil - }) + return nil + }) + } } if err := wg.Wait(); err != nil { @@ -181,6 +181,11 @@ func GetNodeMegapoolDetails(rp *rocketpool.RocketPool, nodeAccount common.Addres details.UserCapital, err = mega.GetUserCapital(nil) return err }) + wg.Go(func() error { + var err error + details.EthBalance, err = rp.Client.BalanceAt(context.Background(), details.Address, nil) + return err + }) // Wait for data if err := wg.Wait(); err != nil { From 270925a6e88bb4675de5c83480bab0e39bda2a2f Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 19 Feb 2025 21:08:48 -0800 Subject: [PATCH 837/878] Update megapool encoded abi and added GetActiveValidatorCount binding --- megapool/megapool-contract.go | 12 +++++++++++- megapool/megapool-interface.go | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 50432ea07..cc10949d6 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -68,7 +68,7 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "eJztWUtz0zAQ/itMzh0OBXrorTRlpkNhQmjh0OlkZGuTaqpIRlolzTD8d9ZJ/Irl2CF28aGn1pH87UOrbx++/z1gSqvVXDs7OJ8yaeFkIFTkkB7vf9O/HJ6BD87RuPUKglFM3q4iGJwPGOcGrB2cDBSbxz/MYcYirSX9gsUtf07qwBw9n344y8AWTArOUJtrnuEluwp4qd77AVHQnzLSQ7rhy1b9H4nkC2vFTEFOPixA4Vr6q9+q/TaEXw7cq98O9duVOtZvDVVjBES4L2PmGJbMcHspGe3s3jalOVy0aN9C03qbgAbwsU28pgcwFBaNCBz6D6Hg8pLEd6eZwEnlVaFdOblsTZ+fnOLxndUOtwJoh0WG8MUhC4QUuKLNEVuxQOYMmToVotCqqFyGHjIZOkkwI1BcqNnWyoIkrymlaMne9J5Gg/A4CiGOh2oAr7MWApZ1nqoXPKmkAY+XX91bGYgxsdUHOHHcwTHOITIQElKb8K3db75J8/3UTVir5QLS3NrRAaWc2g3+DDApQsmSHV/Xx343AU9KDSHAvuhy9RwJw+JNH6UOn/qi1g2zmKbcvin3NS6S0nJ6j0qlmttTa7en0keteJ9cdMkigUz2RaWjKp3OtBoDbeoXPd1ZMD07uzQRXW5rrhqt8knPm+harAr/JcHmTbpWU71jUajnkVbUW3iFBiuEHKdELvgMq0zaZrmiuMsrK4ljN/lxTqJuS41QrHIzlHFcy1jM0uxxKFsiqwUJNtOLLQQd6VO+OVuv1r4FzwIPf0uob9vi7cDXRkT6sZ6HqxnF6YKu5sG6JsVc6cWHUndM+daF+GZMuRYwGbB8pxhlM7hhKwrRt7thW7pk6CKq0Vq69z8FPnLDlkxeGuAUpYK6+v3Xfx3+/vufLHXaFgYUvPsHFHvOauIsXG2O+lbEh9DgsItskDHQyAVPjXihEuE7UQNDZ6ApSIEKqf3SVuCQIRtrjf5jSDpdWHbcaxigV0qF9zHDlHZGBGZDendqTQvj0U3nDWFRRb5xSbWC1tOv/N8+tT6CbceBe1KXomNVz97ncpPUO16m1UYTnIxuOTw3Y5RSeXAADeQdsawgX483/FD3DwUwRawGZQDaVZ2KUlYYGa2nuUOKts+lrJOvBl74LjW47l3c8gzddcIiGf4CjI2XX7wrOOYbR6kJ15IPQVJ1gznTvd++GgJS9joK8PCPEom4u2hmGO/+W+HU6Hk7pr3ox7MrfIzn3yGIRfvfzkrdB/qr+pZtohbghkRRyRARMfrNalLTMCkDFj5VD88LEdYNn6xnoenF6cUgLdFnPReFmnlaMQQ8/VUbA9rpFGjPAvrmqTQQmynWka/qHTBRhXGtxxlpdy7iEkfYbuuGnY7PSxyF8nu/o/9NvQYMYTa8Scr8BRItk48=" + megapoolV1EncodedAbi string = "eJztWUtT2zAQ/iudnJkeaMuBGxA6wxQ6NEB7YBhGtjZBgyK50iohw/S/d504fsRy7DQ29YETOJK/Xa12v334/nXAlFaLqXZ2cDxm0sLBQKjIIT3ev9K/HF6AD47RuOUKglFM3i4iGBwPGOcGrB0cDBSbxj9MYcIirSX9gsUtfw7qwBw9H345ysBmTArOUJsLnuGtdxXwUr23A6KgP2Wkh3TDVaL+z7XkE2vFREFOPsxA4VL6u92q7TaE3w7cu912tdu52tduDVVjBES4b3PMEcyZ4fZMMtrZ/dmU5nDS4vlmmtbbBDSAT23iNb2AobBoRODQfwkFk5ckfjrMBD5WhgrtysllS/r86hSPY1Y7TATQDosM4cohC4QUuKDNEVuwQOYOMnYqRKFVUbkMPWQydJJgrkFxoSbJKQuSvEcpeUv2pvc2GrjHXgixP1QDeI01EzCvs1S94MdKGvBY+d28lY4YE1u9gxPH7ezjHCIDISG1Cd9afPNVmu+nbsJaLWeQ5taOLijl1G7wJ4AntCF3jrMkZGuiMG8zr5329fpYs6Q8Jt02vKA+KrsJRVJqCEED87yNLucvkTAs3nQqdfjcF7UumcW0GOibct/j8i0t9LeoVOoGPF1AeyqdasX7ZKIzFglksi8q7VWDdabVCGhTv+jpzoLp2d31JLW0lvrzR7pQY71xolBPI62o6/EKDRYIOU6JXPANFpm01XJF2ZlXVhLHrvLjlETdllq0WOVmKKO4yrKYpdn9UBIiqwUJVnOVBIKu9DnfNi5Xa9+CF4G7vyXUj6Ss3PG1ayL9WM/d1YzidEGhubOu6zKz9OJDqW+nfOtC/DCiXAu4Hv3ckI+yCVyyBbnox023LQUZuoiqx5bi/pfAJ27YnMkzA5y8VDBZQ91L9/fH/3qp04Y1IOfdPjrZclePzsL56qpvRXwJDS67yAYZA1274LkRL1Qi3BA1MHQGmoIUqJAaQ20FDhmykdbov4Z1Dw7zjrsgA/RKqfDeZ8zTwBf4Sl716MJ6moH/257Wu4ft2CsO6vJfrOrR5xzxS71hZVptNLjJuIzDS7NwLeXeHWIsb4h5BbN5rOGHun8ogCmiDCgD0K5qnk9D7tpoPc5dUpQ8lyg9n2q7idMZGBsvv3nhuc+Av9TnacmHICmBYu7o3g8/DQGJIPcC3H0ivxZ3F00M491/KBsbPW3naG/65egcn+Lhbwhi1v6Ho1KBi/7CseUzUZV5SaIs3kVED/5jNUmbTMqAhc/Vk+OCh3XDJ8txWxo4vZjVrPVZjt6gZmRTdAFPCd/GDHA8huUEt2+WSh2xmWId2areAI+qMBH0GCNtAEWc6IXt9ovERlPhJY5CEbrd0P+mXgOGMCveJGX+Ag4qOps=" ) // The decoded ABI for megapools @@ -115,6 +115,7 @@ func (mp *megapoolV1) GetVersion() uint8 { return mp.Version } +// Get the count of all validators on a megapool func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint32, error) { var validatorCount uint32 if err := mp.Contract.Call(opts, &validatorCount, "getValidatorCount"); err != nil { @@ -123,6 +124,15 @@ func (mp *megapoolV1) GetValidatorCount(opts *bind.CallOpts) (uint32, error) { return validatorCount, nil } +// Get the count of validators on a megapool, excluding inactive validators +func (mp *megapoolV1) GetActiveValidatorCount(opts *bind.CallOpts) (uint32, error) { + var validatorCount uint32 + if err := mp.Contract.Call(opts, &validatorCount, "getActiveValidatorCount"); err != nil { + return 0, fmt.Errorf("error getting megapool %s active validator count: %w", mp.Address.Hex(), err) + } + return validatorCount, nil +} + func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) { validatorInfo := new(ValidatorInfo) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 3e5868138..5b26ed6cf 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -14,6 +14,7 @@ type Megapool interface { GetAddress() common.Address GetVersion() uint8 GetValidatorCount(opts *bind.CallOpts) (uint32, error) + GetActiveValidatorCount(opts *bind.CallOpts) (uint32, error) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) GetLastDistributionBlock(opts *bind.CallOpts) (uint64, error) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) From 469275160607e00f0816a7018ebb610bf5e63177 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:19:03 -0300 Subject: [PATCH 838/878] Add EstimateDistribute and Distribute --- megapool/megapool-contract.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index cc10949d6..ffe053194 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -363,6 +363,20 @@ func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.Valid return tx.Hash(), nil } +// Estimate the gas required to distribute megapool rewards +func (mp *megapoolV1) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "distribute") +} + +// Distribute megapool rewards +func (mp *megapoolV1) Distribute(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "distribute") + if err != nil { + return common.Hash{}, fmt.Errorf("error distributing megapool rewards: %w", err) + } + return tx.Hash(), nil +} + // Estimate the gas of SetUseLatestDelegate func (mp *megapoolV1) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "setUseLatestDelegate", setting) From 51fa7bbb6d95e9e4de976bb8994020367a3489a7 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:26:55 -0300 Subject: [PATCH 839/878] Add functions to interface --- megapool/megapool-interface.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 5b26ed6cf..36b3f3e95 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -31,6 +31,8 @@ type Megapool interface { NewValidator(bondAmount *big.Int, useExpressTicket bool, validatorPubkey rptypes.ValidatorPubkey, validatorSignature rptypes.ValidatorSignature, opts *bind.TransactOpts) (common.Hash, error) EstimateDequeueGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Dequeue(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Distribute(opts *bind.TransactOpts) (common.Hash, error) EstimateAssignFundsGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) EstimateDissolveValidatorGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 819230bb46bf161210ef549b1c5d339c80a3f865 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:49:08 -0300 Subject: [PATCH 840/878] Add NotifyExit --- megapool/megapool-contract.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index ffe053194..92d303963 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -363,6 +363,20 @@ func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.Valid return tx.Hash(), nil } +// Estimate the gas to call NotifyExit +func (mp *megapoolV1) EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "notifyExit", validatorId, withdrawalEpoch, slot, exitProof) +} + +// Notify the megapool that one of its validators is exiting +func (mp *megapoolV1) NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "notifyExit", validatorId, withdrawalEpoch, slot, exitProof) + if err != nil { + return common.Hash{}, fmt.Errorf("error calling notify exit: %w", err) + } + return tx.Hash(), nil +} + // Estimate the gas required to distribute megapool rewards func (mp *megapoolV1) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distribute") From c9434373664519eafb095817b9606fc407207ed1 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:54:00 -0300 Subject: [PATCH 841/878] Add NotifyExit to the interface --- megapool/megapool-interface.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 36b3f3e95..3362ebd14 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -44,6 +44,8 @@ type Megapool interface { RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) + EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + NotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) From 50776cc96da6149a0dcdfd1f0c02e81b60f306e6 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:55:34 -0300 Subject: [PATCH 842/878] Fix name --- megapool/megapool-interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 3362ebd14..179317623 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -45,7 +45,7 @@ type Megapool interface { EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - NotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) From d279c20b5ff902cbb161093ecdf8956f8c855735 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:58:46 -0300 Subject: [PATCH 843/878] Adjust return type --- megapool/megapool-interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 179317623..d11ef321d 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -45,7 +45,7 @@ type Megapool interface { EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) From 4696997445b60fd400570c504ff64659736bcc42 Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 23 Mar 2025 20:43:14 -0700 Subject: [PATCH 844/878] Remove NodeCapital --- megapool/megapool-contract.go | 8 -------- megapool/megapool-interface.go | 1 - utils/state/megapool.go | 6 ------ 3 files changed, 15 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 92d303963..b05d50d0a 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -186,14 +186,6 @@ func (mp *megapoolV1) GetRefundValue(opts *bind.CallOpts) (*big.Int, error) { return *refundValue, nil } -func (mp *megapoolV1) GetNodeCapital(opts *bind.CallOpts) (*big.Int, error) { - nodeCapital := new(*big.Int) - if err := mp.Contract.Call(opts, nodeCapital, "getNodeCapital"); err != nil { - return nil, fmt.Errorf("error getting megapool %s node capital: %w", mp.Address.Hex(), err) - } - return *nodeCapital, nil -} - func (mp *megapoolV1) GetNodeBond(opts *bind.CallOpts) (*big.Int, error) { nodeBond := new(*big.Int) if err := mp.Contract.Call(opts, nodeBond, "getNodeBond"); err != nil { diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index d11ef321d..f0486352d 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -20,7 +20,6 @@ type Megapool interface { GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) GetDebt(opts *bind.CallOpts) (*big.Int, error) GetRefundValue(opts *bind.CallOpts) (*big.Int, error) - GetNodeCapital(opts *bind.CallOpts) (*big.Int, error) GetNodeBond(opts *bind.CallOpts) (*big.Int, error) GetUserCapital(opts *bind.CallOpts) (*big.Int, error) CalculatePendingRewards(opts *bind.CallOpts) (RewardSplit, error) diff --git a/utils/state/megapool.go b/utils/state/megapool.go index c90ca961b..0cc66358a 100644 --- a/utils/state/megapool.go +++ b/utils/state/megapool.go @@ -30,7 +30,6 @@ type NativeMegapoolDetails struct { NodeExpressTicketCount uint64 `json:"nodeExpressTicketCount"` UseLatestDelegate bool `json:"useLatestDelegate"` AssignedValue *big.Int `json:"assignedValue"` - NodeCapital *big.Int `json:"nodeCapital"` NodeBond *big.Int `json:"nodeBond"` UserCapital *big.Int `json:"userCapital"` NodeShare *big.Int `json:"nodeShare"` @@ -166,11 +165,6 @@ func GetNodeMegapoolDetails(rp *rocketpool.RocketPool, nodeAccount common.Addres details.AssignedValue, err = mega.GetAssignedValue(nil) return err }) - wg.Go(func() error { - var err error - details.NodeCapital, err = mega.GetNodeCapital(nil) - return err - }) wg.Go(func() error { var err error details.NodeBond, err = mega.GetNodeBond(nil) From 8cdf187fab7305b5238f5c429d3621addebe8c2a Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 23 Mar 2025 20:53:15 -0700 Subject: [PATCH 845/878] Add bindings for getExitingValidatorCount and getSoonestWithdrawableEpoch --- megapool/megapool-contract.go | 18 ++++++++++++++++++ megapool/megapool-interface.go | 2 ++ 2 files changed, 20 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index b05d50d0a..a1992556d 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -154,6 +154,24 @@ func (mp *megapoolV1) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) return *validatorInfo, nil } +// Get the number of validators currently exiting +func (mp *megapoolV1) GetExitingValidatorCount(opts *bind.CallOpts) (uint32, error) { + var exitingValidatorCount uint32 + if err := mp.Contract.Call(opts, &exitingValidatorCount, "getExitingValidatorCount"); err != nil { + return 0, fmt.Errorf("error getting megapool %s exiting validator count: %w", mp.Address.Hex(), err) + } + return exitingValidatorCount, nil +} + +// Gets the soonest epoch a validator within this megapool can be withdrawn +func (mp *megapoolV1) GetSoonestWithdrawableEpoch(opts *bind.CallOpts) (uint32, error) { + var soonestWithdrawableEpoch uint32 + if err := mp.Contract.Call(opts, &soonestWithdrawableEpoch, "getSoonestWithdrawableEpoch"); err != nil { + return 0, fmt.Errorf("error getting megapool %s soonest withdrawable epoch: %w", mp.Address.Hex(), err) + } + return soonestWithdrawableEpoch, nil +} + func (mp *megapoolV1) GetLastDistributionBlock(opts *bind.CallOpts) (uint64, error) { lastDistributionBlock := new(*big.Int) if err := mp.Contract.Call(opts, lastDistributionBlock, "getLastDistributionBlock"); err != nil { diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index f0486352d..769b970bd 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -15,6 +15,8 @@ type Megapool interface { GetVersion() uint8 GetValidatorCount(opts *bind.CallOpts) (uint32, error) GetActiveValidatorCount(opts *bind.CallOpts) (uint32, error) + GetExitingValidatorCount(opts *bind.CallOpts) (uint32, error) + GetSoonestWithdrawableEpoch(opts *bind.CallOpts) (uint32, error) GetValidatorInfo(validatorId uint32, opts *bind.CallOpts) (ValidatorInfo, error) GetLastDistributionBlock(opts *bind.CallOpts) (uint64, error) GetAssignedValue(opts *bind.CallOpts) (*big.Int, error) From 141fa811ad8f58b8f4b109ef799ab3df9322a7fd Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 23 Mar 2025 21:07:14 -0700 Subject: [PATCH 846/878] Add new fields to ValidatorInfo struct --- megapool/megapool-contract.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index a1992556d..e2f85929d 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -45,12 +45,16 @@ type ValidatorInfo struct { LastAssignmentTime uint32 `abi:"lastAssignmentTime"` LastRequestedValue uint32 `abi:"lastRequestedValue"` LastRequestedBond uint32 `abi:"lastRequestedBond"` + DepositValue uint32 `abi:"depositValue"` Staked bool `abi:"staked"` Exited bool `abi:"exited"` InQueue bool `abi:"inQueue"` InPrestake bool `abi:"inPrestake"` ExpressUsed bool `abi:"expressUsed"` Dissolved bool `abi:"dissolved"` + Exiting bool `abi:"exiting"` + ValidatorIndex uint64 `abi:"validatorIndex"` + ExitBalance uint64 `abi:"exitBalance"` } type ValidatorInfoFromGlobalIndex struct { From 3d1be708930bedddb6c141b5b8d73328e199eede Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 25 Mar 2025 16:43:52 -0700 Subject: [PATCH 847/878] Add bindings and update interface for NotifyFinalBalance --- megapool/beacon-state-verifier.go | 2 +- megapool/megapool-contract.go | 16 +++++++++++++++- megapool/megapool-interface.go | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/megapool/beacon-state-verifier.go b/megapool/beacon-state-verifier.go index 38ac836bd..3b237a3b9 100644 --- a/megapool/beacon-state-verifier.go +++ b/megapool/beacon-state-verifier.go @@ -33,7 +33,7 @@ func verifyExit(rp *rocketpool.RocketPool, validatorIndex *big.Int, withdrawable return *verifiedExit, nil } -func verifyWithdrawal(rp *rocketpool.RocketPool, validatorIndex *big.Int, withdrawalSlot uint64, withdrawalNum *big.Int, withdrawal withdrawal, slot uint64, proof [][32]byte, opts *bind.CallOpts) (bool, error) { +func verifyWithdrawal(rp *rocketpool.RocketPool, validatorIndex *big.Int, withdrawalSlot uint64, withdrawalNum *big.Int, withdrawal Withdrawal, slot uint64, proof [][32]byte, opts *bind.CallOpts) (bool, error) { beaconStateVerifier, err := getBeaconStateVerifier(rp, opts) if err != nil { return false, err diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index e2f85929d..c619c9c1f 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -23,7 +23,7 @@ type ValidatorProof struct { Witnesses [][32]byte } -type withdrawal struct { +type Withdrawal struct { index *big.Int validatorIndex *big.Int withdrawalCredentials [32]byte @@ -391,6 +391,20 @@ func (mp *megapoolV1) NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, s return tx.Hash(), nil } +// Estimate the gas to call NotifyFinalBalance +func (mp *megapoolV1) EstimateNotifyFinalBalance(validatorId uint32, withdrawalSlot *big.Int, withdrawalNum *big.Int, withdrawal Withdrawal, slot *big.Int, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "notifyFinalBalance", validatorId, withdrawalSlot, withdrawalNum, withdrawal, slot, exitProof) +} + +// Notify the megapool of the final balance of an exited validator +func (mp *megapoolV1) NotifyFinalBalance(validatorId uint32, withdrawalSlot *big.Int, withdrawalNum *big.Int, withdrawal Withdrawal, slot *big.Int, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "notifyFinalBalance", validatorId, withdrawalSlot, withdrawalNum, withdrawal, slot, exitProof) + if err != nil { + return common.Hash{}, fmt.Errorf("error calling notify final balance: %w", err) + } + return tx.Hash(), nil +} + // Estimate the gas required to distribute megapool rewards func (mp *megapoolV1) EstimateDistributeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "distribute") diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 769b970bd..696009f36 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -47,6 +47,8 @@ type Megapool interface { Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) + EstimateNotifyFinalBalance(validatorId uint32, withdrawalSlot *big.Int, withdrawalNum *big.Int, withdrawal Withdrawal, slot *big.Int, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + NotifyFinalBalance(validatorId uint32, withdrawalSlot *big.Int, withdrawalNum *big.Int, withdrawal Withdrawal, slot *big.Int, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) EstimateSetUseLatestDelegateGas(setting bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) SetUseLatestDelegate(setting bool, opts *bind.TransactOpts) (common.Hash, error) GetUseLatestDelegate(opts *bind.CallOpts) (bool, error) From 4423b23ad9117645beb294d23572b2a42600bbfb Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 26 Mar 2025 15:06:28 -0700 Subject: [PATCH 848/878] Update Withdrawal type to match beacon chain spec --- megapool/megapool-contract.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index c619c9c1f..4b85cd5dd 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -24,10 +24,10 @@ type ValidatorProof struct { } type Withdrawal struct { - index *big.Int - validatorIndex *big.Int - withdrawalCredentials [32]byte - amountInGwei *big.Int + Index uint64 + ValidatorIndex *big.Int + WithdrawalCredentials [20]byte + AmountInGwei uint64 } type RewardSplit struct { From b9e89e46c30ba3423cbd77e4b7b8afafbf90c2ab Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 26 Mar 2025 15:15:43 -0700 Subject: [PATCH 849/878] Update Stake and EstimateStakeGas signature --- megapool/megapool-contract.go | 8 ++++---- megapool/megapool-interface.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 4b85cd5dd..2d9c832bd 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -351,12 +351,12 @@ func (mp *megapoolV1) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, e } // Estimate the gas of Stake -func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { - return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) +func (mp *megapoolV1) EstimateStakeGas(validatorId uint32, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "stake", validatorId, validatorProof) } // Progress the prelaunch megapool to staking -func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) { +func (mp *megapoolV1) Stake(validatorId uint32, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) { // callData, err := mp.Contract.ABI.Pack("stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) // if err != nil { // return common.Hash{}, fmt.Errorf("error creating calldata for getValidatorInfo: %w", err) @@ -370,7 +370,7 @@ func (mp *megapoolV1) Stake(validatorId uint32, validatorSignature rptypes.Valid // return common.Hash{}, fmt.Errorf("error calling getValidatorInfo: %w", err) // } - tx, err := mp.Contract.Transact(opts, "stake", validatorId, validatorSignature[:], depositDataRoot, validatorProof) + tx, err := mp.Contract.Transact(opts, "stake", validatorId, validatorProof) if err != nil { return common.Hash{}, fmt.Errorf("error staking megapool %s: %w", mp.Address.Hex(), err) } diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 696009f36..6198a5208 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -43,8 +43,8 @@ type Megapool interface { GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) - EstimateStakeGas(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - Stake(validatorId uint32, validatorSignature rptypes.ValidatorSignature, depositDataRoot common.Hash, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) + EstimateStakeGas(validatorId uint32, validatorProof ValidatorProof, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Stake(validatorId uint32, validatorProof ValidatorProof, opts *bind.TransactOpts) (common.Hash, error) EstimateNotifyExitGas(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) NotifyExit(validatorId uint32, withdrawalEpoch *big.Int, slot uint64, exitProof [][32]byte, opts *bind.TransactOpts) (common.Hash, error) EstimateNotifyFinalBalance(validatorId uint32, withdrawalSlot *big.Int, withdrawalNum *big.Int, withdrawal Withdrawal, slot *big.Int, exitProof [][32]byte, opts *bind.TransactOpts) (rocketpool.GasInfo, error) From 1b64248585ec681e132a8ac91f87768b6614696e Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 4 Apr 2025 15:37:40 -0300 Subject: [PATCH 850/878] Add ClaimRefund --- megapool/megapool-contract.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index 2d9c832bd..d663b6924 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -326,6 +326,20 @@ func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Estimate the gas required to claim a megapool refund +func (mp *megapoolV1) EstimateClaimRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "claim") +} + +// Claim megapool rewards that were distributed but not yet claimed +func (mp *megapoolV1) ClaimRefund(opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "claim") + if err != nil { + return common.Hash{}, fmt.Errorf("error claiming megapool refund %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Get the expected withdrawal credentials for any validator within this megapool func (mp *megapoolV1) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) { withdrawalCredentials := new(common.Hash) From 8aadbd8bae892789bd7d9bff3001189b98375fda Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 4 Apr 2025 15:41:25 -0300 Subject: [PATCH 851/878] Add ClaimRefund to interface --- megapool/megapool-interface.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index 6198a5208..d8000c19a 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -38,6 +38,8 @@ type Megapool interface { AssignFunds(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) EstimateDissolveValidatorGas(validatorId uint32, opts *bind.TransactOpts) (rocketpool.GasInfo, error) DissolveValidator(validatorId uint32, opts *bind.TransactOpts) (common.Hash, error) + EstimateClaimRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) + ClaimRefund(opts *bind.TransactOpts) (common.Hash, error) EstimateRepayDebtGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) From 80e4fd35246682a85316a571839408da8e8c14e2 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:31:33 -0300 Subject: [PATCH 852/878] Add NodeComissionShareSecurityCouncilAdder --- settings/protocol/network.go | 29 +++++++++++++++-------------- settings/security/network.go | 8 ++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/settings/protocol/network.go b/settings/protocol/network.go index 1baebf614..1e641a2d7 100644 --- a/settings/protocol/network.go +++ b/settings/protocol/network.go @@ -17,20 +17,21 @@ import ( // Config const ( - NetworkSettingsContractName string = "rocketDAOProtocolSettingsNetwork" - NodeConsensusThresholdSettingPath string = "network.consensus.threshold" - SubmitBalancesEnabledSettingPath string = "network.submit.balances.enabled" - SubmitBalancesFrequencySettingPath string = "network.submit.balances.frequency" - SubmitPricesEnabledSettingPath string = "network.submit.prices.enabled" - SubmitPricesFrequencySettingPath string = "network.submit.prices.frequency" - MinimumNodeFeeSettingPath string = "network.node.fee.minimum" - TargetNodeFeeSettingPath string = "network.node.fee.target" - MaximumNodeFeeSettingPath string = "network.node.fee.maximum" - NodeFeeDemandRangeSettingPath string = "network.node.fee.demand.range" - TargetRethCollateralRateSettingPath string = "network.reth.collateral.target" - NetworkPenaltyThresholdSettingPath string = "network.penalty.threshold" - NetworkPenaltyPerRateSettingPath string = "network.penalty.per.rate" - SubmitRewardsEnabledSettingPath string = "network.submit.rewards.enabled" + NetworkSettingsContractName string = "rocketDAOProtocolSettingsNetwork" + NodeConsensusThresholdSettingPath string = "network.consensus.threshold" + SubmitBalancesEnabledSettingPath string = "network.submit.balances.enabled" + SubmitBalancesFrequencySettingPath string = "network.submit.balances.frequency" + SubmitPricesEnabledSettingPath string = "network.submit.prices.enabled" + SubmitPricesFrequencySettingPath string = "network.submit.prices.frequency" + MinimumNodeFeeSettingPath string = "network.node.fee.minimum" + TargetNodeFeeSettingPath string = "network.node.fee.target" + MaximumNodeFeeSettingPath string = "network.node.fee.maximum" + NodeFeeDemandRangeSettingPath string = "network.node.fee.demand.range" + NodeComissionShareSecurityCouncilAdder string = "network.node.commission.share.security.council.adder" + TargetRethCollateralRateSettingPath string = "network.reth.collateral.target" + NetworkPenaltyThresholdSettingPath string = "network.penalty.threshold" + NetworkPenaltyPerRateSettingPath string = "network.penalty.per.rate" + SubmitRewardsEnabledSettingPath string = "network.submit.rewards.enabled" ) // The threshold of trusted nodes that must reach consensus on oracle data to commit it diff --git a/settings/security/network.go b/settings/security/network.go index 8bbcc161e..ec39d89f8 100644 --- a/settings/security/network.go +++ b/settings/security/network.go @@ -2,6 +2,7 @@ package security import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -30,3 +31,10 @@ func ProposeSubmitRewardsEnabled(rp *rocketpool.RocketPool, value bool, opts *bi func EstimateProposeSubmitRewardsEnabledGas(rp *rocketpool.RocketPool, value bool, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return security.EstimateProposeSetBoolGas(rp, fmt.Sprintf("set %s", psettings.SubmitRewardsEnabledSettingPath), networkNamespace, psettings.SubmitRewardsEnabledSettingPath, value, opts) } + +func ProposeNodeComissionShareSecurityCouncilAdder(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { + return security.ProposeSetUint(rp, fmt.Sprintf("set %s", psettings.NodeComissionShareSecurityCouncilAdder), networkNamespace, psettings.NodeComissionShareSecurityCouncilAdder, value, opts) +} +func EstimateProposeMaximumNodeFeeGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return security.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", psettings.NodeComissionShareSecurityCouncilAdder), networkNamespace, psettings.NodeComissionShareSecurityCouncilAdder, value, opts) +} From d1cf1d441b68c8760f8824502c12f48e5f378dcc Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:38:55 -0300 Subject: [PATCH 853/878] Fix estimate function name --- settings/security/network.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/security/network.go b/settings/security/network.go index ec39d89f8..61808413b 100644 --- a/settings/security/network.go +++ b/settings/security/network.go @@ -35,6 +35,6 @@ func EstimateProposeSubmitRewardsEnabledGas(rp *rocketpool.RocketPool, value boo func ProposeNodeComissionShareSecurityCouncilAdder(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (uint64, common.Hash, error) { return security.ProposeSetUint(rp, fmt.Sprintf("set %s", psettings.NodeComissionShareSecurityCouncilAdder), networkNamespace, psettings.NodeComissionShareSecurityCouncilAdder, value, opts) } -func EstimateProposeMaximumNodeFeeGas(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { +func EstimateProposeNodeComissionShareSecurityCouncilAdder(rp *rocketpool.RocketPool, value *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return security.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", psettings.NodeComissionShareSecurityCouncilAdder), networkNamespace, psettings.NodeComissionShareSecurityCouncilAdder, value, opts) } From 3f7df251889f66a1377ff69a6ced3dd0d1ba564a Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 7 Apr 2025 20:06:54 -0300 Subject: [PATCH 854/878] Add reduceBond function --- megapool/megapool-contract.go | 14 ++++++++++++++ megapool/megapool-interface.go | 2 ++ 2 files changed, 16 insertions(+) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index d663b6924..cbe6819aa 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -326,6 +326,20 @@ func (mp *megapoolV1) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) { return tx.Hash(), nil } +// Estimate the gas required to reduce a megapool bond +func (mp *megapoolV1) EstimateReduceBondGas(amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + return mp.Contract.GetTransactionGasInfo(opts, "reduceBond", amount) +} + +// If the megapool is overbonded, reduce the bond by the specified amount +func (mp *megapoolV1) ReduceBond(amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + tx, err := mp.Contract.Transact(opts, "reduceBond", amount) + if err != nil { + return common.Hash{}, fmt.Errorf("error reducing the megapool bond %s: %w", mp.Address.Hex(), err) + } + return tx.Hash(), nil +} + // Estimate the gas required to claim a megapool refund func (mp *megapoolV1) EstimateClaimRefundGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) { return mp.Contract.GetTransactionGasInfo(opts, "claim") diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index d8000c19a..a4dbadb25 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -42,6 +42,8 @@ type Megapool interface { ClaimRefund(opts *bind.TransactOpts) (common.Hash, error) EstimateRepayDebtGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RepayDebt(opts *bind.TransactOpts) (common.Hash, error) + EstimateReduceBondGas(amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + ReduceBond(amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) GetWithdrawalCredentials(opts *bind.CallOpts) (common.Hash, error) EstimateRequestUnstakeRPL(opts *bind.TransactOpts) (rocketpool.GasInfo, error) RequestUnstakeRPL(opts *bind.TransactOpts) (common.Hash, error) From 9200a0337f23a795ac699275471bd1f47f7f3b73 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:08:42 -0300 Subject: [PATCH 855/878] Add ActiveValidatorCount to getNodeMegapoolDetails --- utils/state/megapool.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/utils/state/megapool.go b/utils/state/megapool.go index 0cc66358a..229349158 100644 --- a/utils/state/megapool.go +++ b/utils/state/megapool.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/rocketpool-go/megapool" "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/rocketpool-go/node" "github.com/rocket-pool/rocketpool-go/rocketpool" "golang.org/x/sync/errgroup" ) @@ -23,6 +24,7 @@ type NativeMegapoolDetails struct { EffectiveDelegateAddress common.Address `json:"effectiveDelegateAddress"` Deployed bool `json:"deployed"` ValidatorCount uint32 `json:"validatorCount"` + ActiveValidatorCount uint32 `json:"activeValidatorCount"` NodeDebt *big.Int `json:"nodeDebt"` RefundValue *big.Int `json:"refundValue"` DelegateExpiry uint64 `json:"delegateExpiry"` @@ -33,6 +35,7 @@ type NativeMegapoolDetails struct { NodeBond *big.Int `json:"nodeBond"` UserCapital *big.Int `json:"userCapital"` NodeShare *big.Int `json:"nodeShare"` + BondRequirement *big.Int `json:"bondRequirement"` EthBalance *big.Int `json:"ethBalance"` LastDistributionBlock uint64 `json:"lastDistributionBlock"` } @@ -150,6 +153,11 @@ func GetNodeMegapoolDetails(rp *rocketpool.RocketPool, nodeAccount common.Addres details.ValidatorCount, err = mega.GetValidatorCount(nil) return err }) + wg.Go(func() error { + var err error + details.ActiveValidatorCount, err = mega.GetActiveValidatorCount(nil) + return err + }) wg.Go(func() error { var err error details.UseLatestDelegate, err = mega.GetUseLatestDelegate(nil) @@ -186,5 +194,9 @@ func GetNodeMegapoolDetails(rp *rocketpool.RocketPool, nodeAccount common.Addres return details, err } + details.BondRequirement, err = node.GetBondRequirement(rp, big.NewInt(int64(details.ActiveValidatorCount)), nil) + if err != nil { + return details, err + } return details, nil } From b773578fdea167b3bf1aa1f8f41084167a1c82c7 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 15 Apr 2025 16:08:03 -0300 Subject: [PATCH 856/878] Add megapool Penalise --- megapool/megapool-interface.go | 2 ++ megapool/megapool-penalties.go | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 megapool/megapool-penalties.go diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index a4dbadb25..ff12d00eb 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -62,4 +62,6 @@ type Megapool interface { EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) GetMegapoolPubkeys(opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) + EstimatePenaliseGas(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) + Penalise(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) } diff --git a/megapool/megapool-penalties.go b/megapool/megapool-penalties.go new file mode 100644 index 000000000..567a3021c --- /dev/null +++ b/megapool/megapool-penalties.go @@ -0,0 +1,40 @@ +package megapool + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/rocketpool-go/rocketpool" +) + +func EstimatePenaliseGas(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) { + megapoolPenalties, err := getRocketMegapoolPenalties(rp, nil) + if err != nil { + return rocketpool.GasInfo{}, err + } + return megapoolPenalties.GetTransactionGasInfo(opts, "penalise", megapoolAddress, block, amount) +} + +func Penalise(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) { + megapoolPenalties, err := getRocketMegapoolPenalties(rp, nil) + if err != nil { + return common.Hash{}, err + } + tx, err := megapoolPenalties.Transact(opts, "penalise", megapoolAddress, block, amount) + if err != nil { + return common.Hash{}, fmt.Errorf("error voting to penalise megapool: %w", err) + } + return tx.Hash(), nil +} + +// Get contracts +var rocketMegapoolPenaltiesLock sync.Mutex + +func getRocketMegapoolPenalties(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { + rocketMegapoolPenaltiesLock.Lock() + defer rocketMegapoolPenaltiesLock.Unlock() + return rp.GetContract("rocketMegapoolPenalties", opts) +} From 29d33b2c7f601ab49cbcf7d54e22e60ecb468342 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:17:59 -0300 Subject: [PATCH 857/878] Remove penalise from interface --- megapool/megapool-interface.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/megapool/megapool-interface.go b/megapool/megapool-interface.go index ff12d00eb..a4dbadb25 100644 --- a/megapool/megapool-interface.go +++ b/megapool/megapool-interface.go @@ -62,6 +62,4 @@ type Megapool interface { EstimateDelegateUpgradeGas(opts *bind.TransactOpts) (rocketpool.GasInfo, error) DelegateUpgrade(opts *bind.TransactOpts) (common.Hash, error) GetMegapoolPubkeys(opts *bind.CallOpts) ([]rptypes.ValidatorPubkey, error) - EstimatePenaliseGas(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (rocketpool.GasInfo, error) - Penalise(rp *rocketpool.RocketPool, megapoolAddress common.Address, block *big.Int, amount *big.Int, opts *bind.TransactOpts) (common.Hash, error) } From 25919fb0a38070001bd8688b9b83014b575e331d Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 16 Apr 2025 22:34:00 -0700 Subject: [PATCH 858/878] Update megapool encoded abi, add WithdrawableEpoch to ValidatorInfo --- megapool/megapool-contract.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/megapool/megapool-contract.go b/megapool/megapool-contract.go index cbe6819aa..82d8ba3cf 100644 --- a/megapool/megapool-contract.go +++ b/megapool/megapool-contract.go @@ -55,6 +55,7 @@ type ValidatorInfo struct { Exiting bool `abi:"exiting"` ValidatorIndex uint64 `abi:"validatorIndex"` ExitBalance uint64 `abi:"exitBalance"` + WithdrawableEpoch uint64 `abi:"withdrawableEpoch"` } type ValidatorInfoFromGlobalIndex struct { @@ -72,7 +73,7 @@ type megapoolV1 struct { } const ( - megapoolV1EncodedAbi string = "eJztWUtT2zAQ/iudnJkeaMuBGxA6wxQ6NEB7YBhGtjZBgyK50iohw/S/d504fsRy7DQ29YETOJK/Xa12v334/nXAlFaLqXZ2cDxm0sLBQKjIIT3ev9K/HF6AD47RuOUKglFM3i4iGBwPGOcGrB0cDBSbxj9MYcIirSX9gsUtfw7qwBw9H345ysBmTArOUJsLnuGtdxXwUr23A6KgP2Wkh3TDVaL+z7XkE2vFREFOPsxA4VL6u92q7TaE3w7cu912tdu52tduDVVjBES4b3PMEcyZ4fZMMtrZ/dmU5nDS4vlmmtbbBDSAT23iNb2AobBoRODQfwkFk5ckfjrMBD5WhgrtysllS/r86hSPY1Y7TATQDosM4cohC4QUuKDNEVuwQOYOMnYqRKFVUbkMPWQydJJgrkFxoSbJKQuSvEcpeUv2pvc2GrjHXgixP1QDeI01EzCvs1S94MdKGvBY+d28lY4YE1u9gxPH7ezjHCIDISG1Cd9afPNVmu+nbsJaLWeQ5taOLijl1G7wJ4AntCF3jrMkZGuiMG8zr5329fpYs6Q8Jt02vKA+KrsJRVJqCEED87yNLucvkTAs3nQqdfjcF7UumcW0GOibct/j8i0t9LeoVOoGPF1AeyqdasX7ZKIzFglksi8q7VWDdabVCGhTv+jpzoLp2d31JLW0lvrzR7pQY71xolBPI62o6/EKDRYIOU6JXPANFpm01XJF2ZlXVhLHrvLjlETdllq0WOVmKKO4yrKYpdn9UBIiqwUJVnOVBIKu9DnfNi5Xa9+CF4G7vyXUj6Ss3PG1ayL9WM/d1YzidEGhubOu6zKz9OJDqW+nfOtC/DCiXAu4Hv3ckI+yCVyyBbnox023LQUZuoiqx5bi/pfAJ27YnMkzA5y8VDBZQ91L9/fH/3qp04Y1IOfdPjrZclePzsL56qpvRXwJDS67yAYZA1274LkRL1Qi3BA1MHQGmoIUqJAaQ20FDhmykdbov4Z1Dw7zjrsgA/RKqfDeZ8zTwBf4Sl716MJ6moH/257Wu4ft2CsO6vJfrOrR5xzxS71hZVptNLjJuIzDS7NwLeXeHWIsb4h5BbN5rOGHun8ogCmiDCgD0K5qnk9D7tpoPc5dUpQ8lyg9n2q7idMZGBsvv3nhuc+Av9TnacmHICmBYu7o3g8/DQGJIPcC3H0ivxZ3F00M491/KBsbPW3naG/65egcn+Lhbwhi1v6Ho1KBi/7CseUzUZV5SaIs3kVED/5jNUmbTMqAhc/Vk+OCh3XDJ8txWxo4vZjVrPVZjt6gZmRTdAFPCd/GDHA8huUEt2+WSh2xmWId2areAI+qMBH0GCNtAEWc6IXt9ovERlPhJY5CEbrd0P+mXgOGMCveJGX+Ag4qOps=" + megapoolV1EncodedAbi string = "eJztWktv2zgQ/isLn4Nike320Fse7iJoWmTtZPcQFAYljR0iNKnlw45Q7H/foS3rLYuKpECt99Q6JIffDGe+GQ71+H1CuODRWhg1+bgkTMHZhPLQaPz5+B3/G8ALBJkhDZITdh+FMPk4Mfj7/PcPk7MJJ2v7B4KCuMbfOj/h37P2sjTFf8qSviUTvsCKhEKwS8GDGQTGR+HJfNgAArH7/vgKXoOnb7gvgaifWcXOZ6ilccC0IYwGRAt5E7yxkn8ddr5Qiq74Sah6Df8YMKehKlVKsM1J6Drlgx3rb+cOmuKkN1L0herTOFFUlPLVCWg61+T5Z8ujM9gSGagrRnDm8LpxEcBFj/ptBI73KVCCfupTnusBYA7QknqmhjNyJj++46LWf9JNSRiy6A5Qio5wojA6Fo9TlCYavhhNPMooDttD4yGJiMcymiwN9zUV3AFdlpcXR4k5A3BX6HwyPFDN+BzBpdJ9wnzDUAyaIEDuis8gt1Ozoa0vpysrfcXBeTtJsN5aL6DSWBsK21cdY2snS6z8v3lrHdHSbp8BmIoOIJTgo6RRxnewr+7HiS0ux5O8P9ABJYw/jPwV6AuckNHjKg7ZhijM2qzSTl293iKLL7KIreAFzVE5TCgiKNtLGAuWuKoe49lNX0IqiZ10yYT/PBaL3RKlkypqbOC+2ro3CCSohjRIkkklSIehHiHZDuhYTNSpFhsM1Qxw0rhoai4EB6X/pvopkGRrs8I0FP5TM74P7+vg4UhP6B4UyCsSUk3YWAw2EhLtrUDJqnTDl6KgkS/WIXoIr97UizRk6CU03meI0t32wzXFcRYsQ7rdZ/E1bnVfuuYmjbZGKTNbCyqdFgPdpMSc1loIFsxCUe0MwhOCpatVoTe0G21cBYUmodsqyv+Mi+eWy+4wf1ic7WGGNvM8qPZYg3Jv2900ubZi3bIisaVBZFs1ZZprlmC3viSMcB9es3xbQcxlqi0IwbrF+PqXGdYsoA+dxzlqQVZwSyKM73fFmC8xlDYhXhB6Is0kvbArCQGGOCWsISvvuKOaPA9Dg/YkPIz84727I/62MAqmez+/p/YQHBw2T6Upfd8Z79mJVGslzJFXiTYSXIXk8khMZddEk5kQuvoYDm0W2A5y0e2Y7ZrDbOEQZw5SFBPaZWFsusdvmbWhFGJZsi5OydpXaLqM7HXuB7UumztaqByQqYyvZl0dk8eLlSIq+lpKb58Udod5/msFrRcIUefnO4DZ905v+B9boC1yQ8rIlSYu5YHROP8nipLShDpsELRuU8vd1yOlm3BvfTgJuKTUWurykNE9+NtFnauX9BR0uctJizyatYBLsNaU9WVXR2F44VZQFhB7e3W8Jmn1Lo6UmshJy7bsXWIYZ9yAVHb4zW/mXV6RSz0xwYJrYFgk64zqSXus+ZW2JBCLoE4C2z/7HrZ7CFeSBL1/KFLScCnFuh/V3vTzhKl+sm94PtBOn0dVwynd4HX1zbhnnfAafYtbKf0QIj1Uq+WSGwhjHvGf6x8Acx42DJ/sXk2SwBlFX/uAZ/dMAQ3t7bwLFE+/p/eS5RJ2D3Fjs1TiiG7ABrJVswEWPPd6UmGM5HpAbaKnatgys9A4qCSOTDZvMvTr4DkwhNzzJoL5DzTANyg=" ) // The decoded ABI for megapools From 1b5bee89c92590549fcc07f1756a7d37fe132d8d Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Sat, 26 Apr 2025 14:51:22 -0300 Subject: [PATCH 859/878] Add fields to validator info --- megapool/megapool-manager.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/megapool/megapool-manager.go b/megapool/megapool-manager.go index 7835f062c..35fcdd807 100644 --- a/megapool/megapool-manager.go +++ b/megapool/megapool-manager.go @@ -56,12 +56,17 @@ func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOp LastAssignmentTime uint32 `json:"lastAssignmentTime"` LastRequestedValue uint32 `json:"lastRequestedValue"` LastRequestedBond uint32 `json:"lastRequestedBond"` + DepositValue uint32 `json:"depositValue"` Staked bool `json:"staked"` Exited bool `json:"exited"` InQueue bool `json:"inQueue"` InPrestake bool `json:"inPrestake"` ExpressUsed bool `json:"expressUsed"` Dissolved bool `json:"dissolved"` + Exiting bool `json:"exiting"` + ValidatorIndex uint64 `json:"validatorIndex"` + ExitBalance uint64 `json:"exitBalance"` + WithdrawableEpoch uint64 `json:"withdrawableEpoch"` }) validatorInfo.ValidatorInfo.PubKey = make([]byte, len(src.PubKey)) copy(validatorInfo.ValidatorInfo.PubKey[:], src.PubKey) @@ -69,6 +74,11 @@ func GetValidatorInfo(rp *rocketpool.RocketPool, index uint32, opts *bind.CallOp validatorInfo.ValidatorInfo.LastRequestedValue = src.LastRequestedValue validatorInfo.ValidatorInfo.LastRequestedBond = src.LastRequestedBond validatorInfo.ValidatorInfo.Staked = src.Staked + validatorInfo.ValidatorInfo.DepositValue = src.DepositValue + validatorInfo.ValidatorInfo.ExitBalance = src.ExitBalance + validatorInfo.ValidatorInfo.WithdrawableEpoch = src.WithdrawableEpoch + validatorInfo.ValidatorInfo.Exiting = src.Exiting + validatorInfo.ValidatorInfo.ValidatorIndex = src.ValidatorIndex validatorInfo.ValidatorInfo.Exited = src.Exited validatorInfo.ValidatorInfo.InQueue = src.InQueue validatorInfo.ValidatorInfo.InPrestake = src.InPrestake From 6214253de8f0e344b63dcb60f5fadaef5e8e6381 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 12 May 2025 15:15:34 -0300 Subject: [PATCH 860/878] Add AmountWithDecimalsToInt --- utils/eth/units.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/utils/eth/units.go b/utils/eth/units.go index a21582076..acdb751ce 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -1,6 +1,7 @@ package eth import ( + "math" "math/big" "strconv" ) @@ -55,3 +56,14 @@ func GweiToWei(gwei float64) *big.Int { weiFloat.Int(&wei) return &wei } + +// Converts float amount to big.Int considering a token's decimals +func AmountWithDecimalsToInt(amountRaw float64, decimals uint8) *big.Int { + var ethFloat big.Float + var weiFloat big.Float + var wei big.Int + ethFloat.SetString(strconv.FormatFloat(amountRaw, 'f', -1, 64)) + weiFloat.Mul(ðFloat, big.NewFloat(math.Pow(10, float64(decimals)))) + weiFloat.Int(&wei) + return &wei +} From 269ab0b6091b6160542e0548341890bf76f5a66e Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 12 May 2025 16:54:39 -0300 Subject: [PATCH 861/878] Add IntToFloatWithDecimals --- utils/eth/units.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/utils/eth/units.go b/utils/eth/units.go index acdb751ce..77d99cdde 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -67,3 +67,16 @@ func AmountWithDecimalsToInt(amountRaw float64, decimals uint8) *big.Int { weiFloat.Int(&wei) return &wei } + +// Converts float amount to big.Int considering a token's decimals +func IntToFloatWithDecimals(amount *big.Int, decimals uint8) float64 { + if amount == nil { + return 0 + } + var weiFloat big.Float + var eth big.Float + weiFloat.SetInt(amount) + eth.Quo(&weiFloat, big.NewFloat(math.Pow(10, float64(decimals)))) + eth64, _ := eth.Float64() + return eth64 +} From 48e87a4a441bad75500938e02a0b43bcb01e39ce Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Mon, 12 May 2025 17:02:17 -0300 Subject: [PATCH 862/878] Rename EthToWeiWithDecimals --- utils/eth/units.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/eth/units.go b/utils/eth/units.go index 77d99cdde..1278f83ee 100644 --- a/utils/eth/units.go +++ b/utils/eth/units.go @@ -58,7 +58,7 @@ func GweiToWei(gwei float64) *big.Int { } // Converts float amount to big.Int considering a token's decimals -func AmountWithDecimalsToInt(amountRaw float64, decimals uint8) *big.Int { +func EthToWeiWithDecimals(amountRaw float64, decimals uint8) *big.Int { var ethFloat big.Float var weiFloat big.Float var wei big.Int @@ -68,8 +68,8 @@ func AmountWithDecimalsToInt(amountRaw float64, decimals uint8) *big.Int { return &wei } -// Converts float amount to big.Int considering a token's decimals -func IntToFloatWithDecimals(amount *big.Int, decimals uint8) float64 { +// Converts big.Int to float64 considering a token's decimals +func WeiToEthWithDecimals(amount *big.Int, decimals uint8) float64 { if amount == nil { return 0 } From b67dcbca3a168915c0193653231d11727dc58bf5 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 20 May 2025 12:34:49 -0300 Subject: [PATCH 863/878] Searching a range of blocks and using the block as index on the query --- network/prices.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/network/prices.go b/network/prices.go index b47e27be7..4ba071bbd 100644 --- a/network/prices.go +++ b/network/prices.go @@ -130,6 +130,8 @@ func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *b return false, PriceUpdatedEvent{}, err } + indexBig := big.NewInt(0).SetUint64(blockNumber) + // Create the list of addresses to check currentAddress := *rocketNetworkPrices.Address rocketNetworkPricesAddress := []common.Address{currentAddress} @@ -137,11 +139,12 @@ func GetPriceUpdatedEvent(rp *rocketpool.RocketPool, blockNumber uint64, opts *b // Construct a filter query for relevant logs pricesUpdatedEvent := rocketNetworkPrices.ABI.Events["PricesUpdated"] indexBytes := [32]byte{} + indexBig.FillBytes(indexBytes[:]) addressFilter := rocketNetworkPricesAddress topicFilter := [][]common.Hash{{pricesUpdatedEvent.ID}, {indexBytes}} // Get the event logs - logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(1), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber)), nil) + logs, err := eth.GetLogs(rp, addressFilter, topicFilter, big.NewInt(100), big.NewInt(int64(blockNumber)), big.NewInt(int64(blockNumber+1000)), nil) if err != nil { return false, PriceUpdatedEvent{}, err } From 63de825e804ab6803a08ea5fb57645ff9d9c58b5 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 20 May 2025 12:41:16 -0300 Subject: [PATCH 864/878] If the event is not found, find the next submission target anyway --- go.work | 2 ++ rocketpool/watchtower/submit-rpl-price.go | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/go.work b/go.work index 7d04138ac..a928ef83e 100644 --- a/go.work +++ b/go.work @@ -11,3 +11,5 @@ use ( replace github.com/wealdtech/go-merkletree v1.0.1-0.20190605192610-2bb163c2ea2a => github.com/rocket-pool/go-merkletree v1.0.1-0.20220406020931-c262d9b976dd replace github.com/rocket-pool/smartnode => ./ + +// replace github.com/rocket-pool/rocketpool-go => ../rocketpool-go \ No newline at end of file diff --git a/rocketpool/watchtower/submit-rpl-price.go b/rocketpool/watchtower/submit-rpl-price.go index 56a463da8..d6298a4f5 100644 --- a/rocketpool/watchtower/submit-rpl-price.go +++ b/rocketpool/watchtower/submit-rpl-price.go @@ -375,29 +375,30 @@ func (t *submitRplPrice) run(state *state.NetworkState) error { eth2Config := state.BeaconConfig var hasSubmittedPastBlock bool + var eventFound bool var nextSubmissionTime time.Time var targetBlockNumber uint64 var lastSubmissionSlotTimestamp uint64 // Check if the node has submitted prices for the latest block if lastSubmissionBlock != 0 { - found, lastSubmissionEvent, err := network.GetPriceUpdatedEvent(t.rp, lastSubmissionBlock, nil) + eventFound, lastSubmissionEvent, err := network.GetPriceUpdatedEvent(t.rp, lastSubmissionBlock, nil) if err != nil { t.log.Printlnf("Error getting price submission event for block %d", lastSubmissionBlock) return err } - if !found { + if !eventFound { t.log.Printlnf("No price submission event found for block %d", lastSubmissionBlock) - return fmt.Errorf("no price submission event found for block %d", lastSubmissionBlock) - } - lastSubmissionSlotTimestamp = lastSubmissionEvent.SlotTimestamp.Uint64() + } else { + lastSubmissionSlotTimestamp = lastSubmissionEvent.SlotTimestamp.Uint64() - hasSubmittedPastBlock, err = t.hasSubmittedSpecificBlockPrices(nodeAccount.Address, lastSubmissionBlock, lastSubmissionSlotTimestamp, state.NetworkDetails.RplPrice) - if err != nil { - t.log.Printlnf("Error checking if node has submitted prices for block %d: %s", lastSubmissionBlock, err.Error()) - return err + hasSubmittedPastBlock, err = t.hasSubmittedSpecificBlockPrices(nodeAccount.Address, lastSubmissionBlock, lastSubmissionSlotTimestamp, state.NetworkDetails.RplPrice) + if err != nil { + t.log.Printlnf("Error checking if node has submitted prices for block %d: %s", lastSubmissionBlock, err.Error()) + return err + } } } - if hasSubmittedPastBlock || lastSubmissionBlock == 0 { + if hasSubmittedPastBlock || lastSubmissionBlock == 0 || !eventFound{ // If the node participated in consensus, find the next submission target var targetBlockHeader *types.Header _, nextSubmissionTime, targetBlockHeader, err = utils.FindNextSubmissionTarget(t.rp, eth2Config, t.bc, t.ec, lastSubmissionBlock, referenceTimestamp, submissionIntervalInSeconds) From 46992dae7690dd73af6dac46bde0a30c2a71c2af Mon Sep 17 00:00:00 2001 From: Fornax <23104993+0xfornax@users.noreply.github.com> Date: Tue, 20 May 2025 12:48:11 -0300 Subject: [PATCH 865/878] Fix lint err --- rocketpool/watchtower/submit-rpl-price.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpool/watchtower/submit-rpl-price.go b/rocketpool/watchtower/submit-rpl-price.go index d6298a4f5..c87982f12 100644 --- a/rocketpool/watchtower/submit-rpl-price.go +++ b/rocketpool/watchtower/submit-rpl-price.go @@ -398,7 +398,7 @@ func (t *submitRplPrice) run(state *state.NetworkState) error { } } } - if hasSubmittedPastBlock || lastSubmissionBlock == 0 || !eventFound{ + if hasSubmittedPastBlock || lastSubmissionBlock == 0 || !eventFound { // If the node participated in consensus, find the next submission target var targetBlockHeader *types.Header _, nextSubmissionTime, targetBlockHeader, err = utils.FindNextSubmissionTarget(t.rp, eth2Config, t.bc, t.ec, lastSubmissionBlock, referenceTimestamp, submissionIntervalInSeconds) From 424b11ab528a15e7bc25b6e660c66751675bc0fe Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 11:17:18 -0400 Subject: [PATCH 866/878] format repo with goimports --- tests/node/distributor_test.go | 3 ++- tests/rewards/trusted_node_test.go | 5 +++-- utils/json/json.go | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/node/distributor_test.go b/tests/node/distributor_test.go index a33dd5488..426f1c0d6 100644 --- a/tests/node/distributor_test.go +++ b/tests/node/distributor_test.go @@ -1,9 +1,10 @@ package node import ( - "github.com/rocket-pool/rocketpool-go/node" "testing" + "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" ) diff --git a/tests/rewards/trusted_node_test.go b/tests/rewards/trusted_node_test.go index 179ea580d..4d6d341f9 100644 --- a/tests/rewards/trusted_node_test.go +++ b/tests/rewards/trusted_node_test.go @@ -2,11 +2,12 @@ package rewards import ( "context" + "math/big" + "testing" + "github.com/rocket-pool/rocketpool-go/rewards" "github.com/rocket-pool/rocketpool-go/settings/protocol" "github.com/rocket-pool/rocketpool-go/tokens" - "math/big" - "testing" "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" diff --git a/utils/json/json.go b/utils/json/json.go index 4f6aed640..ec15a007b 100644 --- a/utils/json/json.go +++ b/utils/json/json.go @@ -1,4 +1,4 @@ -package json +package json import ( "encoding/json" From f430205f33e93e3a474dea589a44dcd0a1f079e0 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 11:20:49 -0400 Subject: [PATCH 867/878] Switch to go 1.21 --- go.mod | 2 +- go.sum | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e109879de..b5c67df2f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/rocket-pool/rocketpool-go -go 1.19 +go 1.21 require ( github.com/ethereum/go-ethereum v1.10.26 diff --git a/go.sum b/go.sum index 1026c10be..6758191ab 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,7 @@ github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpz github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= @@ -17,7 +18,9 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -26,6 +29,7 @@ github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWc github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -43,6 +47,7 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= @@ -55,11 +60,13 @@ github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= @@ -77,9 +84,11 @@ github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dT github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= @@ -88,15 +97,21 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= @@ -116,6 +131,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -141,12 +157,16 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -157,6 +177,7 @@ github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBP github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= @@ -164,6 +185,7 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -171,6 +193,7 @@ github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeC github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -183,23 +206,29 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= +github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= @@ -238,10 +267,13 @@ golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -267,5 +299,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= From 0a40159b0da794b62377ae40b55387059ce3ec55 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 10:27:56 -0400 Subject: [PATCH 868/878] Move everything into bindings directory to prepare for monorepo transition --- LICENSE => bindings/LICENSE | 0 README.md => bindings/README.md | 0 {auction => bindings/auction}/auction.go | 0 azure-pipelines.yml => bindings/azure-pipelines.yml | 0 {contracts => bindings/contracts}/rocket-storage.go | 0 {dao => bindings/dao}/claim.go | 0 {dao => bindings/dao}/proposal-payload.go | 0 {dao => bindings/dao}/proposals.go | 0 {dao => bindings/dao}/protocol/dao.go | 0 {dao => bindings/dao}/protocol/proposal.go | 0 {dao => bindings/dao}/protocol/proposals.go | 0 {dao => bindings/dao}/protocol/verify.go | 0 {dao => bindings/dao}/security/actions.go | 0 {dao => bindings/dao}/security/proposals.go | 0 {dao => bindings/dao}/security/security.go | 0 {dao => bindings/dao}/trustednode/actions.go | 0 {dao => bindings/dao}/trustednode/dao.go | 0 {dao => bindings/dao}/trustednode/proposals.go | 0 {deposit => bindings/deposit}/deposit.go | 0 {docs => bindings/docs}/docgen.go | 0 go.mod => bindings/go.mod | 0 go.sum => bindings/go.sum | 0 {legacy => bindings/legacy}/v1.0.0/minipool/minipool.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/node.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/rewards.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/trusted-node.go | 0 {legacy => bindings/legacy}/v1.0.0/utils/address_generation.go | 0 {legacy => bindings/legacy}/v1.1.0-rc1/rewards/rewards.go | 0 {legacy => bindings/legacy}/v1.1.0/minipool/factory.go | 0 {legacy => bindings/legacy}/v1.1.0/minipool/queue.go | 0 {legacy => bindings/legacy}/v1.1.0/network/prices.go | 0 {legacy => bindings/legacy}/v1.1.0/node/deposit.go | 0 {legacy => bindings/legacy}/v1.1.0/node/staking.go | 0 {legacy => bindings/legacy}/v1.1.0/utils/address_generation.go | 0 {legacy => bindings/legacy}/v1.2.0/network/balances.go | 0 {legacy => bindings/legacy}/v1.2.0/network/prices.go | 0 {minipool => bindings/minipool}/bond-reducer.go | 0 {minipool => bindings/minipool}/factory.go | 0 {minipool => bindings/minipool}/minipool-constructor.go | 0 {minipool => bindings/minipool}/minipool-contract-v2.go | 0 {minipool => bindings/minipool}/minipool-contract-v3.go | 0 {minipool => bindings/minipool}/minipool-interface.go | 0 {minipool => bindings/minipool}/minipool.go | 0 {minipool => bindings/minipool}/queue.go | 0 {minipool => bindings/minipool}/status.go | 0 {network => bindings/network}/balances.go | 0 {network => bindings/network}/fees.go | 0 {network => bindings/network}/penalties.go | 0 {network => bindings/network}/prices.go | 0 {network => bindings/network}/voting.go | 0 {node => bindings/node}/deposit.go | 0 {node => bindings/node}/distributor.go | 0 {node => bindings/node}/node.go | 0 {node => bindings/node}/staking.go | 0 {rewards => bindings/rewards}/distributor-mainnet.go | 0 {rewards => bindings/rewards}/rewards.go | 0 {rocketpool => bindings/rocketpool}/abi.go | 0 {rocketpool => bindings/rocketpool}/contract.go | 0 {rocketpool => bindings/rocketpool}/ec-interface.go | 0 {rocketpool => bindings/rocketpool}/rewards.go | 0 {rocketpool => bindings/rocketpool}/rocketpool.go | 0 {rocketpool => bindings/rocketpool}/v1.0.0-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.1.0-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.1.0-rc1-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.2.0-manager.go | 0 {rocketpool => bindings/rocketpool}/version-interface.go | 0 {rocketpool => bindings/rocketpool}/version-manager.go | 0 {settings => bindings/settings}/protocol/auction.go | 0 {settings => bindings/settings}/protocol/deposit.go | 0 {settings => bindings/settings}/protocol/inflation.go | 0 {settings => bindings/settings}/protocol/minipool.go | 0 {settings => bindings/settings}/protocol/network.go | 0 {settings => bindings/settings}/protocol/node.go | 0 {settings => bindings/settings}/protocol/proposals.go | 0 {settings => bindings/settings}/protocol/rewards.go | 0 {settings => bindings/settings}/protocol/security.go | 0 {settings => bindings/settings}/security/auction.go | 0 {settings => bindings/settings}/security/deposit.go | 0 {settings => bindings/settings}/security/minipool.go | 0 {settings => bindings/settings}/security/network.go | 0 {settings => bindings/settings}/security/node.go | 0 {settings => bindings/settings}/trustednode/members.go | 0 {settings => bindings/settings}/trustednode/minipool.go | 0 {settings => bindings/settings}/trustednode/proposals.go | 0 {settings => bindings/settings}/trustednode/rewards.go | 0 {storage => bindings/storage}/address-queue-storage.go | 0 {storage => bindings/storage}/rocket-storage.go | 0 test.sh => bindings/test.sh | 0 {tests => bindings/tests}/auction/auction_test.go | 0 {tests => bindings/tests}/auction/main_test.go | 0 {tests => bindings/tests}/config.go | 0 {tests => bindings/tests}/dao/main_test.go | 0 {tests => bindings/tests}/dao/proposals_test.go | 0 {tests => bindings/tests}/dao/trustednode/dao_test.go | 0 {tests => bindings/tests}/dao/trustednode/main_test.go | 0 {tests => bindings/tests}/dao/trustednode/proposals_test.go | 0 {tests => bindings/tests}/deposit/deposit_test.go | 0 {tests => bindings/tests}/deposit/main_test.go | 0 {tests => bindings/tests}/minipool/contract_test.go | 0 {tests => bindings/tests}/minipool/main_test.go | 0 {tests => bindings/tests}/minipool/minipool_test.go | 0 {tests => bindings/tests}/minipool/queue_test.go | 0 {tests => bindings/tests}/minipool/status_test.go | 0 {tests => bindings/tests}/network/balances_test.go | 0 {tests => bindings/tests}/network/fees_test.go | 0 {tests => bindings/tests}/network/main_test.go | 0 {tests => bindings/tests}/network/prices_test.go | 0 {tests => bindings/tests}/node/deposit_test.go | 0 {tests => bindings/tests}/node/distributor_test.go | 0 {tests => bindings/tests}/node/main_test.go | 0 {tests => bindings/tests}/node/node_test.go | 0 {tests => bindings/tests}/node/staking_test.go | 0 {tests => bindings/tests}/rewards/main_test.go | 0 {tests => bindings/tests}/rewards/node_test.go | 0 {tests => bindings/tests}/rewards/trusted_node_test.go | 0 {tests => bindings/tests}/rocketpool/main_test.go | 0 {tests => bindings/tests}/rocketpool/rocketpool_test.go | 0 {tests => bindings/tests}/settings/protocol/auction_test.go | 0 {tests => bindings/tests}/settings/protocol/deposit_test.go | 0 {tests => bindings/tests}/settings/protocol/inflation_test.go | 0 {tests => bindings/tests}/settings/protocol/main_test.go | 0 {tests => bindings/tests}/settings/protocol/minipool_test.go | 0 {tests => bindings/tests}/settings/protocol/network_test.go | 0 {tests => bindings/tests}/settings/protocol/node_test.go | 0 {tests => bindings/tests}/settings/protocol/rewards_test.go | 0 {tests => bindings/tests}/settings/trustednode/main_test.go | 0 {tests => bindings/tests}/settings/trustednode/members_test.go | 0 {tests => bindings/tests}/settings/trustednode/proposals_test.go | 0 {tests => bindings/tests}/testutils/accounts/accounts.go | 0 {tests => bindings/tests}/testutils/auction/auction.go | 0 {tests => bindings/tests}/testutils/dao/proposals.go | 0 {tests => bindings/tests}/testutils/evm/mining.go | 0 {tests => bindings/tests}/testutils/evm/snapshots.go | 0 {tests => bindings/tests}/testutils/minipool/minipool.go | 0 {tests => bindings/tests}/testutils/node/deposit.go | 0 {tests => bindings/tests}/testutils/node/node.go | 0 {tests => bindings/tests}/testutils/node/staking.go | 0 {tests => bindings/tests}/testutils/tokens/reth/reth.go | 0 {tests => bindings/tests}/testutils/tokens/rpl/rpl.go | 0 {tests => bindings/tests}/testutils/validator/deposit-data.go | 0 {tests => bindings/tests}/tokens/main_test.go | 0 {tests => bindings/tests}/tokens/reth_test.go | 0 {tests => bindings/tests}/tokens/rpl_fixed_test.go | 0 {tests => bindings/tests}/tokens/rpl_test.go | 0 {tests => bindings/tests}/tokens/tokens_test.go | 0 {tests => bindings/tests}/utils/eth/transactions_test.go | 0 {tests => bindings/tests}/utils/eth/units_test.go | 0 {tests => bindings/tests}/utils/stage4_bootstrap.go | 0 {tokens => bindings/tokens}/reth.go | 0 {tokens => bindings/tokens}/rpl-fixed.go | 0 {tokens => bindings/tokens}/rpl.go | 0 {tokens => bindings/tokens}/tokens.go | 0 {types => bindings/types}/beacon.go | 0 {types => bindings/types}/dao.go | 0 {types => bindings/types}/minipool.go | 0 {utils => bindings/utils}/address_generation.go | 0 {utils => bindings/utils}/deposit_retrieval.go | 0 {utils => bindings/utils}/eth/erc20.go | 0 {utils => bindings/utils}/eth/logs.go | 0 {utils => bindings/utils}/eth/transactions.go | 0 {utils => bindings/utils}/eth/units.go | 0 {utils => bindings/utils}/json/json.go | 0 {utils => bindings/utils}/multicall/abi.go | 0 {utils => bindings/utils}/multicall/balances.go | 0 {utils => bindings/utils}/multicall/multicaller.go | 0 {utils => bindings/utils}/state/common.go | 0 {utils => bindings/utils}/state/contracts.go | 0 {utils => bindings/utils}/state/minipool.go | 0 {utils => bindings/utils}/state/network.go | 0 {utils => bindings/utils}/state/node.go | 0 {utils => bindings/utils}/state/odao.go | 0 {utils => bindings/utils}/state/pdao.go | 0 {utils => bindings/utils}/strings/sanitize.go | 0 {utils => bindings/utils}/version-checker.go | 0 {utils => bindings/utils}/wait.go | 0 175 files changed, 0 insertions(+), 0 deletions(-) rename LICENSE => bindings/LICENSE (100%) rename README.md => bindings/README.md (100%) rename {auction => bindings/auction}/auction.go (100%) rename azure-pipelines.yml => bindings/azure-pipelines.yml (100%) rename {contracts => bindings/contracts}/rocket-storage.go (100%) rename {dao => bindings/dao}/claim.go (100%) rename {dao => bindings/dao}/proposal-payload.go (100%) rename {dao => bindings/dao}/proposals.go (100%) rename {dao => bindings/dao}/protocol/dao.go (100%) rename {dao => bindings/dao}/protocol/proposal.go (100%) rename {dao => bindings/dao}/protocol/proposals.go (100%) rename {dao => bindings/dao}/protocol/verify.go (100%) rename {dao => bindings/dao}/security/actions.go (100%) rename {dao => bindings/dao}/security/proposals.go (100%) rename {dao => bindings/dao}/security/security.go (100%) rename {dao => bindings/dao}/trustednode/actions.go (100%) rename {dao => bindings/dao}/trustednode/dao.go (100%) rename {dao => bindings/dao}/trustednode/proposals.go (100%) rename {deposit => bindings/deposit}/deposit.go (100%) rename {docs => bindings/docs}/docgen.go (100%) rename go.mod => bindings/go.mod (100%) rename go.sum => bindings/go.sum (100%) rename {legacy => bindings/legacy}/v1.0.0/minipool/minipool.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/node.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/rewards.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/trusted-node.go (100%) rename {legacy => bindings/legacy}/v1.0.0/utils/address_generation.go (100%) rename {legacy => bindings/legacy}/v1.1.0-rc1/rewards/rewards.go (100%) rename {legacy => bindings/legacy}/v1.1.0/minipool/factory.go (100%) rename {legacy => bindings/legacy}/v1.1.0/minipool/queue.go (100%) rename {legacy => bindings/legacy}/v1.1.0/network/prices.go (100%) rename {legacy => bindings/legacy}/v1.1.0/node/deposit.go (100%) rename {legacy => bindings/legacy}/v1.1.0/node/staking.go (100%) rename {legacy => bindings/legacy}/v1.1.0/utils/address_generation.go (100%) rename {legacy => bindings/legacy}/v1.2.0/network/balances.go (100%) rename {legacy => bindings/legacy}/v1.2.0/network/prices.go (100%) rename {minipool => bindings/minipool}/bond-reducer.go (100%) rename {minipool => bindings/minipool}/factory.go (100%) rename {minipool => bindings/minipool}/minipool-constructor.go (100%) rename {minipool => bindings/minipool}/minipool-contract-v2.go (100%) rename {minipool => bindings/minipool}/minipool-contract-v3.go (100%) rename {minipool => bindings/minipool}/minipool-interface.go (100%) rename {minipool => bindings/minipool}/minipool.go (100%) rename {minipool => bindings/minipool}/queue.go (100%) rename {minipool => bindings/minipool}/status.go (100%) rename {network => bindings/network}/balances.go (100%) rename {network => bindings/network}/fees.go (100%) rename {network => bindings/network}/penalties.go (100%) rename {network => bindings/network}/prices.go (100%) rename {network => bindings/network}/voting.go (100%) rename {node => bindings/node}/deposit.go (100%) rename {node => bindings/node}/distributor.go (100%) rename {node => bindings/node}/node.go (100%) rename {node => bindings/node}/staking.go (100%) rename {rewards => bindings/rewards}/distributor-mainnet.go (100%) rename {rewards => bindings/rewards}/rewards.go (100%) rename {rocketpool => bindings/rocketpool}/abi.go (100%) rename {rocketpool => bindings/rocketpool}/contract.go (100%) rename {rocketpool => bindings/rocketpool}/ec-interface.go (100%) rename {rocketpool => bindings/rocketpool}/rewards.go (100%) rename {rocketpool => bindings/rocketpool}/rocketpool.go (100%) rename {rocketpool => bindings/rocketpool}/v1.0.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.1.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.1.0-rc1-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.2.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/version-interface.go (100%) rename {rocketpool => bindings/rocketpool}/version-manager.go (100%) rename {settings => bindings/settings}/protocol/auction.go (100%) rename {settings => bindings/settings}/protocol/deposit.go (100%) rename {settings => bindings/settings}/protocol/inflation.go (100%) rename {settings => bindings/settings}/protocol/minipool.go (100%) rename {settings => bindings/settings}/protocol/network.go (100%) rename {settings => bindings/settings}/protocol/node.go (100%) rename {settings => bindings/settings}/protocol/proposals.go (100%) rename {settings => bindings/settings}/protocol/rewards.go (100%) rename {settings => bindings/settings}/protocol/security.go (100%) rename {settings => bindings/settings}/security/auction.go (100%) rename {settings => bindings/settings}/security/deposit.go (100%) rename {settings => bindings/settings}/security/minipool.go (100%) rename {settings => bindings/settings}/security/network.go (100%) rename {settings => bindings/settings}/security/node.go (100%) rename {settings => bindings/settings}/trustednode/members.go (100%) rename {settings => bindings/settings}/trustednode/minipool.go (100%) rename {settings => bindings/settings}/trustednode/proposals.go (100%) rename {settings => bindings/settings}/trustednode/rewards.go (100%) rename {storage => bindings/storage}/address-queue-storage.go (100%) rename {storage => bindings/storage}/rocket-storage.go (100%) rename test.sh => bindings/test.sh (100%) rename {tests => bindings/tests}/auction/auction_test.go (100%) rename {tests => bindings/tests}/auction/main_test.go (100%) rename {tests => bindings/tests}/config.go (100%) rename {tests => bindings/tests}/dao/main_test.go (100%) rename {tests => bindings/tests}/dao/proposals_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/dao_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/main_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/proposals_test.go (100%) rename {tests => bindings/tests}/deposit/deposit_test.go (100%) rename {tests => bindings/tests}/deposit/main_test.go (100%) rename {tests => bindings/tests}/minipool/contract_test.go (100%) rename {tests => bindings/tests}/minipool/main_test.go (100%) rename {tests => bindings/tests}/minipool/minipool_test.go (100%) rename {tests => bindings/tests}/minipool/queue_test.go (100%) rename {tests => bindings/tests}/minipool/status_test.go (100%) rename {tests => bindings/tests}/network/balances_test.go (100%) rename {tests => bindings/tests}/network/fees_test.go (100%) rename {tests => bindings/tests}/network/main_test.go (100%) rename {tests => bindings/tests}/network/prices_test.go (100%) rename {tests => bindings/tests}/node/deposit_test.go (100%) rename {tests => bindings/tests}/node/distributor_test.go (100%) rename {tests => bindings/tests}/node/main_test.go (100%) rename {tests => bindings/tests}/node/node_test.go (100%) rename {tests => bindings/tests}/node/staking_test.go (100%) rename {tests => bindings/tests}/rewards/main_test.go (100%) rename {tests => bindings/tests}/rewards/node_test.go (100%) rename {tests => bindings/tests}/rewards/trusted_node_test.go (100%) rename {tests => bindings/tests}/rocketpool/main_test.go (100%) rename {tests => bindings/tests}/rocketpool/rocketpool_test.go (100%) rename {tests => bindings/tests}/settings/protocol/auction_test.go (100%) rename {tests => bindings/tests}/settings/protocol/deposit_test.go (100%) rename {tests => bindings/tests}/settings/protocol/inflation_test.go (100%) rename {tests => bindings/tests}/settings/protocol/main_test.go (100%) rename {tests => bindings/tests}/settings/protocol/minipool_test.go (100%) rename {tests => bindings/tests}/settings/protocol/network_test.go (100%) rename {tests => bindings/tests}/settings/protocol/node_test.go (100%) rename {tests => bindings/tests}/settings/protocol/rewards_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/main_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/members_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/proposals_test.go (100%) rename {tests => bindings/tests}/testutils/accounts/accounts.go (100%) rename {tests => bindings/tests}/testutils/auction/auction.go (100%) rename {tests => bindings/tests}/testutils/dao/proposals.go (100%) rename {tests => bindings/tests}/testutils/evm/mining.go (100%) rename {tests => bindings/tests}/testutils/evm/snapshots.go (100%) rename {tests => bindings/tests}/testutils/minipool/minipool.go (100%) rename {tests => bindings/tests}/testutils/node/deposit.go (100%) rename {tests => bindings/tests}/testutils/node/node.go (100%) rename {tests => bindings/tests}/testutils/node/staking.go (100%) rename {tests => bindings/tests}/testutils/tokens/reth/reth.go (100%) rename {tests => bindings/tests}/testutils/tokens/rpl/rpl.go (100%) rename {tests => bindings/tests}/testutils/validator/deposit-data.go (100%) rename {tests => bindings/tests}/tokens/main_test.go (100%) rename {tests => bindings/tests}/tokens/reth_test.go (100%) rename {tests => bindings/tests}/tokens/rpl_fixed_test.go (100%) rename {tests => bindings/tests}/tokens/rpl_test.go (100%) rename {tests => bindings/tests}/tokens/tokens_test.go (100%) rename {tests => bindings/tests}/utils/eth/transactions_test.go (100%) rename {tests => bindings/tests}/utils/eth/units_test.go (100%) rename {tests => bindings/tests}/utils/stage4_bootstrap.go (100%) rename {tokens => bindings/tokens}/reth.go (100%) rename {tokens => bindings/tokens}/rpl-fixed.go (100%) rename {tokens => bindings/tokens}/rpl.go (100%) rename {tokens => bindings/tokens}/tokens.go (100%) rename {types => bindings/types}/beacon.go (100%) rename {types => bindings/types}/dao.go (100%) rename {types => bindings/types}/minipool.go (100%) rename {utils => bindings/utils}/address_generation.go (100%) rename {utils => bindings/utils}/deposit_retrieval.go (100%) rename {utils => bindings/utils}/eth/erc20.go (100%) rename {utils => bindings/utils}/eth/logs.go (100%) rename {utils => bindings/utils}/eth/transactions.go (100%) rename {utils => bindings/utils}/eth/units.go (100%) rename {utils => bindings/utils}/json/json.go (100%) rename {utils => bindings/utils}/multicall/abi.go (100%) rename {utils => bindings/utils}/multicall/balances.go (100%) rename {utils => bindings/utils}/multicall/multicaller.go (100%) rename {utils => bindings/utils}/state/common.go (100%) rename {utils => bindings/utils}/state/contracts.go (100%) rename {utils => bindings/utils}/state/minipool.go (100%) rename {utils => bindings/utils}/state/network.go (100%) rename {utils => bindings/utils}/state/node.go (100%) rename {utils => bindings/utils}/state/odao.go (100%) rename {utils => bindings/utils}/state/pdao.go (100%) rename {utils => bindings/utils}/strings/sanitize.go (100%) rename {utils => bindings/utils}/version-checker.go (100%) rename {utils => bindings/utils}/wait.go (100%) diff --git a/LICENSE b/bindings/LICENSE similarity index 100% rename from LICENSE rename to bindings/LICENSE diff --git a/README.md b/bindings/README.md similarity index 100% rename from README.md rename to bindings/README.md diff --git a/auction/auction.go b/bindings/auction/auction.go similarity index 100% rename from auction/auction.go rename to bindings/auction/auction.go diff --git a/azure-pipelines.yml b/bindings/azure-pipelines.yml similarity index 100% rename from azure-pipelines.yml rename to bindings/azure-pipelines.yml diff --git a/contracts/rocket-storage.go b/bindings/contracts/rocket-storage.go similarity index 100% rename from contracts/rocket-storage.go rename to bindings/contracts/rocket-storage.go diff --git a/dao/claim.go b/bindings/dao/claim.go similarity index 100% rename from dao/claim.go rename to bindings/dao/claim.go diff --git a/dao/proposal-payload.go b/bindings/dao/proposal-payload.go similarity index 100% rename from dao/proposal-payload.go rename to bindings/dao/proposal-payload.go diff --git a/dao/proposals.go b/bindings/dao/proposals.go similarity index 100% rename from dao/proposals.go rename to bindings/dao/proposals.go diff --git a/dao/protocol/dao.go b/bindings/dao/protocol/dao.go similarity index 100% rename from dao/protocol/dao.go rename to bindings/dao/protocol/dao.go diff --git a/dao/protocol/proposal.go b/bindings/dao/protocol/proposal.go similarity index 100% rename from dao/protocol/proposal.go rename to bindings/dao/protocol/proposal.go diff --git a/dao/protocol/proposals.go b/bindings/dao/protocol/proposals.go similarity index 100% rename from dao/protocol/proposals.go rename to bindings/dao/protocol/proposals.go diff --git a/dao/protocol/verify.go b/bindings/dao/protocol/verify.go similarity index 100% rename from dao/protocol/verify.go rename to bindings/dao/protocol/verify.go diff --git a/dao/security/actions.go b/bindings/dao/security/actions.go similarity index 100% rename from dao/security/actions.go rename to bindings/dao/security/actions.go diff --git a/dao/security/proposals.go b/bindings/dao/security/proposals.go similarity index 100% rename from dao/security/proposals.go rename to bindings/dao/security/proposals.go diff --git a/dao/security/security.go b/bindings/dao/security/security.go similarity index 100% rename from dao/security/security.go rename to bindings/dao/security/security.go diff --git a/dao/trustednode/actions.go b/bindings/dao/trustednode/actions.go similarity index 100% rename from dao/trustednode/actions.go rename to bindings/dao/trustednode/actions.go diff --git a/dao/trustednode/dao.go b/bindings/dao/trustednode/dao.go similarity index 100% rename from dao/trustednode/dao.go rename to bindings/dao/trustednode/dao.go diff --git a/dao/trustednode/proposals.go b/bindings/dao/trustednode/proposals.go similarity index 100% rename from dao/trustednode/proposals.go rename to bindings/dao/trustednode/proposals.go diff --git a/deposit/deposit.go b/bindings/deposit/deposit.go similarity index 100% rename from deposit/deposit.go rename to bindings/deposit/deposit.go diff --git a/docs/docgen.go b/bindings/docs/docgen.go similarity index 100% rename from docs/docgen.go rename to bindings/docs/docgen.go diff --git a/go.mod b/bindings/go.mod similarity index 100% rename from go.mod rename to bindings/go.mod diff --git a/go.sum b/bindings/go.sum similarity index 100% rename from go.sum rename to bindings/go.sum diff --git a/legacy/v1.0.0/minipool/minipool.go b/bindings/legacy/v1.0.0/minipool/minipool.go similarity index 100% rename from legacy/v1.0.0/minipool/minipool.go rename to bindings/legacy/v1.0.0/minipool/minipool.go diff --git a/legacy/v1.0.0/rewards/node.go b/bindings/legacy/v1.0.0/rewards/node.go similarity index 100% rename from legacy/v1.0.0/rewards/node.go rename to bindings/legacy/v1.0.0/rewards/node.go diff --git a/legacy/v1.0.0/rewards/rewards.go b/bindings/legacy/v1.0.0/rewards/rewards.go similarity index 100% rename from legacy/v1.0.0/rewards/rewards.go rename to bindings/legacy/v1.0.0/rewards/rewards.go diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/bindings/legacy/v1.0.0/rewards/trusted-node.go similarity index 100% rename from legacy/v1.0.0/rewards/trusted-node.go rename to bindings/legacy/v1.0.0/rewards/trusted-node.go diff --git a/legacy/v1.0.0/utils/address_generation.go b/bindings/legacy/v1.0.0/utils/address_generation.go similarity index 100% rename from legacy/v1.0.0/utils/address_generation.go rename to bindings/legacy/v1.0.0/utils/address_generation.go diff --git a/legacy/v1.1.0-rc1/rewards/rewards.go b/bindings/legacy/v1.1.0-rc1/rewards/rewards.go similarity index 100% rename from legacy/v1.1.0-rc1/rewards/rewards.go rename to bindings/legacy/v1.1.0-rc1/rewards/rewards.go diff --git a/legacy/v1.1.0/minipool/factory.go b/bindings/legacy/v1.1.0/minipool/factory.go similarity index 100% rename from legacy/v1.1.0/minipool/factory.go rename to bindings/legacy/v1.1.0/minipool/factory.go diff --git a/legacy/v1.1.0/minipool/queue.go b/bindings/legacy/v1.1.0/minipool/queue.go similarity index 100% rename from legacy/v1.1.0/minipool/queue.go rename to bindings/legacy/v1.1.0/minipool/queue.go diff --git a/legacy/v1.1.0/network/prices.go b/bindings/legacy/v1.1.0/network/prices.go similarity index 100% rename from legacy/v1.1.0/network/prices.go rename to bindings/legacy/v1.1.0/network/prices.go diff --git a/legacy/v1.1.0/node/deposit.go b/bindings/legacy/v1.1.0/node/deposit.go similarity index 100% rename from legacy/v1.1.0/node/deposit.go rename to bindings/legacy/v1.1.0/node/deposit.go diff --git a/legacy/v1.1.0/node/staking.go b/bindings/legacy/v1.1.0/node/staking.go similarity index 100% rename from legacy/v1.1.0/node/staking.go rename to bindings/legacy/v1.1.0/node/staking.go diff --git a/legacy/v1.1.0/utils/address_generation.go b/bindings/legacy/v1.1.0/utils/address_generation.go similarity index 100% rename from legacy/v1.1.0/utils/address_generation.go rename to bindings/legacy/v1.1.0/utils/address_generation.go diff --git a/legacy/v1.2.0/network/balances.go b/bindings/legacy/v1.2.0/network/balances.go similarity index 100% rename from legacy/v1.2.0/network/balances.go rename to bindings/legacy/v1.2.0/network/balances.go diff --git a/legacy/v1.2.0/network/prices.go b/bindings/legacy/v1.2.0/network/prices.go similarity index 100% rename from legacy/v1.2.0/network/prices.go rename to bindings/legacy/v1.2.0/network/prices.go diff --git a/minipool/bond-reducer.go b/bindings/minipool/bond-reducer.go similarity index 100% rename from minipool/bond-reducer.go rename to bindings/minipool/bond-reducer.go diff --git a/minipool/factory.go b/bindings/minipool/factory.go similarity index 100% rename from minipool/factory.go rename to bindings/minipool/factory.go diff --git a/minipool/minipool-constructor.go b/bindings/minipool/minipool-constructor.go similarity index 100% rename from minipool/minipool-constructor.go rename to bindings/minipool/minipool-constructor.go diff --git a/minipool/minipool-contract-v2.go b/bindings/minipool/minipool-contract-v2.go similarity index 100% rename from minipool/minipool-contract-v2.go rename to bindings/minipool/minipool-contract-v2.go diff --git a/minipool/minipool-contract-v3.go b/bindings/minipool/minipool-contract-v3.go similarity index 100% rename from minipool/minipool-contract-v3.go rename to bindings/minipool/minipool-contract-v3.go diff --git a/minipool/minipool-interface.go b/bindings/minipool/minipool-interface.go similarity index 100% rename from minipool/minipool-interface.go rename to bindings/minipool/minipool-interface.go diff --git a/minipool/minipool.go b/bindings/minipool/minipool.go similarity index 100% rename from minipool/minipool.go rename to bindings/minipool/minipool.go diff --git a/minipool/queue.go b/bindings/minipool/queue.go similarity index 100% rename from minipool/queue.go rename to bindings/minipool/queue.go diff --git a/minipool/status.go b/bindings/minipool/status.go similarity index 100% rename from minipool/status.go rename to bindings/minipool/status.go diff --git a/network/balances.go b/bindings/network/balances.go similarity index 100% rename from network/balances.go rename to bindings/network/balances.go diff --git a/network/fees.go b/bindings/network/fees.go similarity index 100% rename from network/fees.go rename to bindings/network/fees.go diff --git a/network/penalties.go b/bindings/network/penalties.go similarity index 100% rename from network/penalties.go rename to bindings/network/penalties.go diff --git a/network/prices.go b/bindings/network/prices.go similarity index 100% rename from network/prices.go rename to bindings/network/prices.go diff --git a/network/voting.go b/bindings/network/voting.go similarity index 100% rename from network/voting.go rename to bindings/network/voting.go diff --git a/node/deposit.go b/bindings/node/deposit.go similarity index 100% rename from node/deposit.go rename to bindings/node/deposit.go diff --git a/node/distributor.go b/bindings/node/distributor.go similarity index 100% rename from node/distributor.go rename to bindings/node/distributor.go diff --git a/node/node.go b/bindings/node/node.go similarity index 100% rename from node/node.go rename to bindings/node/node.go diff --git a/node/staking.go b/bindings/node/staking.go similarity index 100% rename from node/staking.go rename to bindings/node/staking.go diff --git a/rewards/distributor-mainnet.go b/bindings/rewards/distributor-mainnet.go similarity index 100% rename from rewards/distributor-mainnet.go rename to bindings/rewards/distributor-mainnet.go diff --git a/rewards/rewards.go b/bindings/rewards/rewards.go similarity index 100% rename from rewards/rewards.go rename to bindings/rewards/rewards.go diff --git a/rocketpool/abi.go b/bindings/rocketpool/abi.go similarity index 100% rename from rocketpool/abi.go rename to bindings/rocketpool/abi.go diff --git a/rocketpool/contract.go b/bindings/rocketpool/contract.go similarity index 100% rename from rocketpool/contract.go rename to bindings/rocketpool/contract.go diff --git a/rocketpool/ec-interface.go b/bindings/rocketpool/ec-interface.go similarity index 100% rename from rocketpool/ec-interface.go rename to bindings/rocketpool/ec-interface.go diff --git a/rocketpool/rewards.go b/bindings/rocketpool/rewards.go similarity index 100% rename from rocketpool/rewards.go rename to bindings/rocketpool/rewards.go diff --git a/rocketpool/rocketpool.go b/bindings/rocketpool/rocketpool.go similarity index 100% rename from rocketpool/rocketpool.go rename to bindings/rocketpool/rocketpool.go diff --git a/rocketpool/v1.0.0-manager.go b/bindings/rocketpool/v1.0.0-manager.go similarity index 100% rename from rocketpool/v1.0.0-manager.go rename to bindings/rocketpool/v1.0.0-manager.go diff --git a/rocketpool/v1.1.0-manager.go b/bindings/rocketpool/v1.1.0-manager.go similarity index 100% rename from rocketpool/v1.1.0-manager.go rename to bindings/rocketpool/v1.1.0-manager.go diff --git a/rocketpool/v1.1.0-rc1-manager.go b/bindings/rocketpool/v1.1.0-rc1-manager.go similarity index 100% rename from rocketpool/v1.1.0-rc1-manager.go rename to bindings/rocketpool/v1.1.0-rc1-manager.go diff --git a/rocketpool/v1.2.0-manager.go b/bindings/rocketpool/v1.2.0-manager.go similarity index 100% rename from rocketpool/v1.2.0-manager.go rename to bindings/rocketpool/v1.2.0-manager.go diff --git a/rocketpool/version-interface.go b/bindings/rocketpool/version-interface.go similarity index 100% rename from rocketpool/version-interface.go rename to bindings/rocketpool/version-interface.go diff --git a/rocketpool/version-manager.go b/bindings/rocketpool/version-manager.go similarity index 100% rename from rocketpool/version-manager.go rename to bindings/rocketpool/version-manager.go diff --git a/settings/protocol/auction.go b/bindings/settings/protocol/auction.go similarity index 100% rename from settings/protocol/auction.go rename to bindings/settings/protocol/auction.go diff --git a/settings/protocol/deposit.go b/bindings/settings/protocol/deposit.go similarity index 100% rename from settings/protocol/deposit.go rename to bindings/settings/protocol/deposit.go diff --git a/settings/protocol/inflation.go b/bindings/settings/protocol/inflation.go similarity index 100% rename from settings/protocol/inflation.go rename to bindings/settings/protocol/inflation.go diff --git a/settings/protocol/minipool.go b/bindings/settings/protocol/minipool.go similarity index 100% rename from settings/protocol/minipool.go rename to bindings/settings/protocol/minipool.go diff --git a/settings/protocol/network.go b/bindings/settings/protocol/network.go similarity index 100% rename from settings/protocol/network.go rename to bindings/settings/protocol/network.go diff --git a/settings/protocol/node.go b/bindings/settings/protocol/node.go similarity index 100% rename from settings/protocol/node.go rename to bindings/settings/protocol/node.go diff --git a/settings/protocol/proposals.go b/bindings/settings/protocol/proposals.go similarity index 100% rename from settings/protocol/proposals.go rename to bindings/settings/protocol/proposals.go diff --git a/settings/protocol/rewards.go b/bindings/settings/protocol/rewards.go similarity index 100% rename from settings/protocol/rewards.go rename to bindings/settings/protocol/rewards.go diff --git a/settings/protocol/security.go b/bindings/settings/protocol/security.go similarity index 100% rename from settings/protocol/security.go rename to bindings/settings/protocol/security.go diff --git a/settings/security/auction.go b/bindings/settings/security/auction.go similarity index 100% rename from settings/security/auction.go rename to bindings/settings/security/auction.go diff --git a/settings/security/deposit.go b/bindings/settings/security/deposit.go similarity index 100% rename from settings/security/deposit.go rename to bindings/settings/security/deposit.go diff --git a/settings/security/minipool.go b/bindings/settings/security/minipool.go similarity index 100% rename from settings/security/minipool.go rename to bindings/settings/security/minipool.go diff --git a/settings/security/network.go b/bindings/settings/security/network.go similarity index 100% rename from settings/security/network.go rename to bindings/settings/security/network.go diff --git a/settings/security/node.go b/bindings/settings/security/node.go similarity index 100% rename from settings/security/node.go rename to bindings/settings/security/node.go diff --git a/settings/trustednode/members.go b/bindings/settings/trustednode/members.go similarity index 100% rename from settings/trustednode/members.go rename to bindings/settings/trustednode/members.go diff --git a/settings/trustednode/minipool.go b/bindings/settings/trustednode/minipool.go similarity index 100% rename from settings/trustednode/minipool.go rename to bindings/settings/trustednode/minipool.go diff --git a/settings/trustednode/proposals.go b/bindings/settings/trustednode/proposals.go similarity index 100% rename from settings/trustednode/proposals.go rename to bindings/settings/trustednode/proposals.go diff --git a/settings/trustednode/rewards.go b/bindings/settings/trustednode/rewards.go similarity index 100% rename from settings/trustednode/rewards.go rename to bindings/settings/trustednode/rewards.go diff --git a/storage/address-queue-storage.go b/bindings/storage/address-queue-storage.go similarity index 100% rename from storage/address-queue-storage.go rename to bindings/storage/address-queue-storage.go diff --git a/storage/rocket-storage.go b/bindings/storage/rocket-storage.go similarity index 100% rename from storage/rocket-storage.go rename to bindings/storage/rocket-storage.go diff --git a/test.sh b/bindings/test.sh similarity index 100% rename from test.sh rename to bindings/test.sh diff --git a/tests/auction/auction_test.go b/bindings/tests/auction/auction_test.go similarity index 100% rename from tests/auction/auction_test.go rename to bindings/tests/auction/auction_test.go diff --git a/tests/auction/main_test.go b/bindings/tests/auction/main_test.go similarity index 100% rename from tests/auction/main_test.go rename to bindings/tests/auction/main_test.go diff --git a/tests/config.go b/bindings/tests/config.go similarity index 100% rename from tests/config.go rename to bindings/tests/config.go diff --git a/tests/dao/main_test.go b/bindings/tests/dao/main_test.go similarity index 100% rename from tests/dao/main_test.go rename to bindings/tests/dao/main_test.go diff --git a/tests/dao/proposals_test.go b/bindings/tests/dao/proposals_test.go similarity index 100% rename from tests/dao/proposals_test.go rename to bindings/tests/dao/proposals_test.go diff --git a/tests/dao/trustednode/dao_test.go b/bindings/tests/dao/trustednode/dao_test.go similarity index 100% rename from tests/dao/trustednode/dao_test.go rename to bindings/tests/dao/trustednode/dao_test.go diff --git a/tests/dao/trustednode/main_test.go b/bindings/tests/dao/trustednode/main_test.go similarity index 100% rename from tests/dao/trustednode/main_test.go rename to bindings/tests/dao/trustednode/main_test.go diff --git a/tests/dao/trustednode/proposals_test.go b/bindings/tests/dao/trustednode/proposals_test.go similarity index 100% rename from tests/dao/trustednode/proposals_test.go rename to bindings/tests/dao/trustednode/proposals_test.go diff --git a/tests/deposit/deposit_test.go b/bindings/tests/deposit/deposit_test.go similarity index 100% rename from tests/deposit/deposit_test.go rename to bindings/tests/deposit/deposit_test.go diff --git a/tests/deposit/main_test.go b/bindings/tests/deposit/main_test.go similarity index 100% rename from tests/deposit/main_test.go rename to bindings/tests/deposit/main_test.go diff --git a/tests/minipool/contract_test.go b/bindings/tests/minipool/contract_test.go similarity index 100% rename from tests/minipool/contract_test.go rename to bindings/tests/minipool/contract_test.go diff --git a/tests/minipool/main_test.go b/bindings/tests/minipool/main_test.go similarity index 100% rename from tests/minipool/main_test.go rename to bindings/tests/minipool/main_test.go diff --git a/tests/minipool/minipool_test.go b/bindings/tests/minipool/minipool_test.go similarity index 100% rename from tests/minipool/minipool_test.go rename to bindings/tests/minipool/minipool_test.go diff --git a/tests/minipool/queue_test.go b/bindings/tests/minipool/queue_test.go similarity index 100% rename from tests/minipool/queue_test.go rename to bindings/tests/minipool/queue_test.go diff --git a/tests/minipool/status_test.go b/bindings/tests/minipool/status_test.go similarity index 100% rename from tests/minipool/status_test.go rename to bindings/tests/minipool/status_test.go diff --git a/tests/network/balances_test.go b/bindings/tests/network/balances_test.go similarity index 100% rename from tests/network/balances_test.go rename to bindings/tests/network/balances_test.go diff --git a/tests/network/fees_test.go b/bindings/tests/network/fees_test.go similarity index 100% rename from tests/network/fees_test.go rename to bindings/tests/network/fees_test.go diff --git a/tests/network/main_test.go b/bindings/tests/network/main_test.go similarity index 100% rename from tests/network/main_test.go rename to bindings/tests/network/main_test.go diff --git a/tests/network/prices_test.go b/bindings/tests/network/prices_test.go similarity index 100% rename from tests/network/prices_test.go rename to bindings/tests/network/prices_test.go diff --git a/tests/node/deposit_test.go b/bindings/tests/node/deposit_test.go similarity index 100% rename from tests/node/deposit_test.go rename to bindings/tests/node/deposit_test.go diff --git a/tests/node/distributor_test.go b/bindings/tests/node/distributor_test.go similarity index 100% rename from tests/node/distributor_test.go rename to bindings/tests/node/distributor_test.go diff --git a/tests/node/main_test.go b/bindings/tests/node/main_test.go similarity index 100% rename from tests/node/main_test.go rename to bindings/tests/node/main_test.go diff --git a/tests/node/node_test.go b/bindings/tests/node/node_test.go similarity index 100% rename from tests/node/node_test.go rename to bindings/tests/node/node_test.go diff --git a/tests/node/staking_test.go b/bindings/tests/node/staking_test.go similarity index 100% rename from tests/node/staking_test.go rename to bindings/tests/node/staking_test.go diff --git a/tests/rewards/main_test.go b/bindings/tests/rewards/main_test.go similarity index 100% rename from tests/rewards/main_test.go rename to bindings/tests/rewards/main_test.go diff --git a/tests/rewards/node_test.go b/bindings/tests/rewards/node_test.go similarity index 100% rename from tests/rewards/node_test.go rename to bindings/tests/rewards/node_test.go diff --git a/tests/rewards/trusted_node_test.go b/bindings/tests/rewards/trusted_node_test.go similarity index 100% rename from tests/rewards/trusted_node_test.go rename to bindings/tests/rewards/trusted_node_test.go diff --git a/tests/rocketpool/main_test.go b/bindings/tests/rocketpool/main_test.go similarity index 100% rename from tests/rocketpool/main_test.go rename to bindings/tests/rocketpool/main_test.go diff --git a/tests/rocketpool/rocketpool_test.go b/bindings/tests/rocketpool/rocketpool_test.go similarity index 100% rename from tests/rocketpool/rocketpool_test.go rename to bindings/tests/rocketpool/rocketpool_test.go diff --git a/tests/settings/protocol/auction_test.go b/bindings/tests/settings/protocol/auction_test.go similarity index 100% rename from tests/settings/protocol/auction_test.go rename to bindings/tests/settings/protocol/auction_test.go diff --git a/tests/settings/protocol/deposit_test.go b/bindings/tests/settings/protocol/deposit_test.go similarity index 100% rename from tests/settings/protocol/deposit_test.go rename to bindings/tests/settings/protocol/deposit_test.go diff --git a/tests/settings/protocol/inflation_test.go b/bindings/tests/settings/protocol/inflation_test.go similarity index 100% rename from tests/settings/protocol/inflation_test.go rename to bindings/tests/settings/protocol/inflation_test.go diff --git a/tests/settings/protocol/main_test.go b/bindings/tests/settings/protocol/main_test.go similarity index 100% rename from tests/settings/protocol/main_test.go rename to bindings/tests/settings/protocol/main_test.go diff --git a/tests/settings/protocol/minipool_test.go b/bindings/tests/settings/protocol/minipool_test.go similarity index 100% rename from tests/settings/protocol/minipool_test.go rename to bindings/tests/settings/protocol/minipool_test.go diff --git a/tests/settings/protocol/network_test.go b/bindings/tests/settings/protocol/network_test.go similarity index 100% rename from tests/settings/protocol/network_test.go rename to bindings/tests/settings/protocol/network_test.go diff --git a/tests/settings/protocol/node_test.go b/bindings/tests/settings/protocol/node_test.go similarity index 100% rename from tests/settings/protocol/node_test.go rename to bindings/tests/settings/protocol/node_test.go diff --git a/tests/settings/protocol/rewards_test.go b/bindings/tests/settings/protocol/rewards_test.go similarity index 100% rename from tests/settings/protocol/rewards_test.go rename to bindings/tests/settings/protocol/rewards_test.go diff --git a/tests/settings/trustednode/main_test.go b/bindings/tests/settings/trustednode/main_test.go similarity index 100% rename from tests/settings/trustednode/main_test.go rename to bindings/tests/settings/trustednode/main_test.go diff --git a/tests/settings/trustednode/members_test.go b/bindings/tests/settings/trustednode/members_test.go similarity index 100% rename from tests/settings/trustednode/members_test.go rename to bindings/tests/settings/trustednode/members_test.go diff --git a/tests/settings/trustednode/proposals_test.go b/bindings/tests/settings/trustednode/proposals_test.go similarity index 100% rename from tests/settings/trustednode/proposals_test.go rename to bindings/tests/settings/trustednode/proposals_test.go diff --git a/tests/testutils/accounts/accounts.go b/bindings/tests/testutils/accounts/accounts.go similarity index 100% rename from tests/testutils/accounts/accounts.go rename to bindings/tests/testutils/accounts/accounts.go diff --git a/tests/testutils/auction/auction.go b/bindings/tests/testutils/auction/auction.go similarity index 100% rename from tests/testutils/auction/auction.go rename to bindings/tests/testutils/auction/auction.go diff --git a/tests/testutils/dao/proposals.go b/bindings/tests/testutils/dao/proposals.go similarity index 100% rename from tests/testutils/dao/proposals.go rename to bindings/tests/testutils/dao/proposals.go diff --git a/tests/testutils/evm/mining.go b/bindings/tests/testutils/evm/mining.go similarity index 100% rename from tests/testutils/evm/mining.go rename to bindings/tests/testutils/evm/mining.go diff --git a/tests/testutils/evm/snapshots.go b/bindings/tests/testutils/evm/snapshots.go similarity index 100% rename from tests/testutils/evm/snapshots.go rename to bindings/tests/testutils/evm/snapshots.go diff --git a/tests/testutils/minipool/minipool.go b/bindings/tests/testutils/minipool/minipool.go similarity index 100% rename from tests/testutils/minipool/minipool.go rename to bindings/tests/testutils/minipool/minipool.go diff --git a/tests/testutils/node/deposit.go b/bindings/tests/testutils/node/deposit.go similarity index 100% rename from tests/testutils/node/deposit.go rename to bindings/tests/testutils/node/deposit.go diff --git a/tests/testutils/node/node.go b/bindings/tests/testutils/node/node.go similarity index 100% rename from tests/testutils/node/node.go rename to bindings/tests/testutils/node/node.go diff --git a/tests/testutils/node/staking.go b/bindings/tests/testutils/node/staking.go similarity index 100% rename from tests/testutils/node/staking.go rename to bindings/tests/testutils/node/staking.go diff --git a/tests/testutils/tokens/reth/reth.go b/bindings/tests/testutils/tokens/reth/reth.go similarity index 100% rename from tests/testutils/tokens/reth/reth.go rename to bindings/tests/testutils/tokens/reth/reth.go diff --git a/tests/testutils/tokens/rpl/rpl.go b/bindings/tests/testutils/tokens/rpl/rpl.go similarity index 100% rename from tests/testutils/tokens/rpl/rpl.go rename to bindings/tests/testutils/tokens/rpl/rpl.go diff --git a/tests/testutils/validator/deposit-data.go b/bindings/tests/testutils/validator/deposit-data.go similarity index 100% rename from tests/testutils/validator/deposit-data.go rename to bindings/tests/testutils/validator/deposit-data.go diff --git a/tests/tokens/main_test.go b/bindings/tests/tokens/main_test.go similarity index 100% rename from tests/tokens/main_test.go rename to bindings/tests/tokens/main_test.go diff --git a/tests/tokens/reth_test.go b/bindings/tests/tokens/reth_test.go similarity index 100% rename from tests/tokens/reth_test.go rename to bindings/tests/tokens/reth_test.go diff --git a/tests/tokens/rpl_fixed_test.go b/bindings/tests/tokens/rpl_fixed_test.go similarity index 100% rename from tests/tokens/rpl_fixed_test.go rename to bindings/tests/tokens/rpl_fixed_test.go diff --git a/tests/tokens/rpl_test.go b/bindings/tests/tokens/rpl_test.go similarity index 100% rename from tests/tokens/rpl_test.go rename to bindings/tests/tokens/rpl_test.go diff --git a/tests/tokens/tokens_test.go b/bindings/tests/tokens/tokens_test.go similarity index 100% rename from tests/tokens/tokens_test.go rename to bindings/tests/tokens/tokens_test.go diff --git a/tests/utils/eth/transactions_test.go b/bindings/tests/utils/eth/transactions_test.go similarity index 100% rename from tests/utils/eth/transactions_test.go rename to bindings/tests/utils/eth/transactions_test.go diff --git a/tests/utils/eth/units_test.go b/bindings/tests/utils/eth/units_test.go similarity index 100% rename from tests/utils/eth/units_test.go rename to bindings/tests/utils/eth/units_test.go diff --git a/tests/utils/stage4_bootstrap.go b/bindings/tests/utils/stage4_bootstrap.go similarity index 100% rename from tests/utils/stage4_bootstrap.go rename to bindings/tests/utils/stage4_bootstrap.go diff --git a/tokens/reth.go b/bindings/tokens/reth.go similarity index 100% rename from tokens/reth.go rename to bindings/tokens/reth.go diff --git a/tokens/rpl-fixed.go b/bindings/tokens/rpl-fixed.go similarity index 100% rename from tokens/rpl-fixed.go rename to bindings/tokens/rpl-fixed.go diff --git a/tokens/rpl.go b/bindings/tokens/rpl.go similarity index 100% rename from tokens/rpl.go rename to bindings/tokens/rpl.go diff --git a/tokens/tokens.go b/bindings/tokens/tokens.go similarity index 100% rename from tokens/tokens.go rename to bindings/tokens/tokens.go diff --git a/types/beacon.go b/bindings/types/beacon.go similarity index 100% rename from types/beacon.go rename to bindings/types/beacon.go diff --git a/types/dao.go b/bindings/types/dao.go similarity index 100% rename from types/dao.go rename to bindings/types/dao.go diff --git a/types/minipool.go b/bindings/types/minipool.go similarity index 100% rename from types/minipool.go rename to bindings/types/minipool.go diff --git a/utils/address_generation.go b/bindings/utils/address_generation.go similarity index 100% rename from utils/address_generation.go rename to bindings/utils/address_generation.go diff --git a/utils/deposit_retrieval.go b/bindings/utils/deposit_retrieval.go similarity index 100% rename from utils/deposit_retrieval.go rename to bindings/utils/deposit_retrieval.go diff --git a/utils/eth/erc20.go b/bindings/utils/eth/erc20.go similarity index 100% rename from utils/eth/erc20.go rename to bindings/utils/eth/erc20.go diff --git a/utils/eth/logs.go b/bindings/utils/eth/logs.go similarity index 100% rename from utils/eth/logs.go rename to bindings/utils/eth/logs.go diff --git a/utils/eth/transactions.go b/bindings/utils/eth/transactions.go similarity index 100% rename from utils/eth/transactions.go rename to bindings/utils/eth/transactions.go diff --git a/utils/eth/units.go b/bindings/utils/eth/units.go similarity index 100% rename from utils/eth/units.go rename to bindings/utils/eth/units.go diff --git a/utils/json/json.go b/bindings/utils/json/json.go similarity index 100% rename from utils/json/json.go rename to bindings/utils/json/json.go diff --git a/utils/multicall/abi.go b/bindings/utils/multicall/abi.go similarity index 100% rename from utils/multicall/abi.go rename to bindings/utils/multicall/abi.go diff --git a/utils/multicall/balances.go b/bindings/utils/multicall/balances.go similarity index 100% rename from utils/multicall/balances.go rename to bindings/utils/multicall/balances.go diff --git a/utils/multicall/multicaller.go b/bindings/utils/multicall/multicaller.go similarity index 100% rename from utils/multicall/multicaller.go rename to bindings/utils/multicall/multicaller.go diff --git a/utils/state/common.go b/bindings/utils/state/common.go similarity index 100% rename from utils/state/common.go rename to bindings/utils/state/common.go diff --git a/utils/state/contracts.go b/bindings/utils/state/contracts.go similarity index 100% rename from utils/state/contracts.go rename to bindings/utils/state/contracts.go diff --git a/utils/state/minipool.go b/bindings/utils/state/minipool.go similarity index 100% rename from utils/state/minipool.go rename to bindings/utils/state/minipool.go diff --git a/utils/state/network.go b/bindings/utils/state/network.go similarity index 100% rename from utils/state/network.go rename to bindings/utils/state/network.go diff --git a/utils/state/node.go b/bindings/utils/state/node.go similarity index 100% rename from utils/state/node.go rename to bindings/utils/state/node.go diff --git a/utils/state/odao.go b/bindings/utils/state/odao.go similarity index 100% rename from utils/state/odao.go rename to bindings/utils/state/odao.go diff --git a/utils/state/pdao.go b/bindings/utils/state/pdao.go similarity index 100% rename from utils/state/pdao.go rename to bindings/utils/state/pdao.go diff --git a/utils/strings/sanitize.go b/bindings/utils/strings/sanitize.go similarity index 100% rename from utils/strings/sanitize.go rename to bindings/utils/strings/sanitize.go diff --git a/utils/version-checker.go b/bindings/utils/version-checker.go similarity index 100% rename from utils/version-checker.go rename to bindings/utils/version-checker.go diff --git a/utils/wait.go b/bindings/utils/wait.go similarity index 100% rename from utils/wait.go rename to bindings/utils/wait.go From 9f9f0dc5d369be90f15399c12a21a25f26e03c19 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 14:05:30 -0400 Subject: [PATCH 869/878] Remove unused files --- bindings/LICENSE | 674 ----------------------------------- bindings/README.md | 2 - bindings/azure-pipelines.yml | 36 -- bindings/go.sum | 304 ---------------- 4 files changed, 1016 deletions(-) delete mode 100644 bindings/LICENSE delete mode 100644 bindings/README.md delete mode 100644 bindings/azure-pipelines.yml delete mode 100644 bindings/go.sum diff --git a/bindings/LICENSE b/bindings/LICENSE deleted file mode 100644 index 94a9ed024..000000000 --- a/bindings/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/bindings/README.md b/bindings/README.md deleted file mode 100644 index 8a595cc3c..000000000 --- a/bindings/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# rocketpool-go -A Golang library for interacting with the Rocket Pool network. diff --git a/bindings/azure-pipelines.yml b/bindings/azure-pipelines.yml deleted file mode 100644 index a1338bf3a..000000000 --- a/bindings/azure-pipelines.yml +++ /dev/null @@ -1,36 +0,0 @@ -# Go -# Build your Go project. -# Add steps that test, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/go - -trigger: - branches: - include: - - '*' - - refs/tags/* - -pool: - vmImage: ubuntu-latest - -steps: -- task: DownloadSecureFile@1 - name: githubPEM - displayName: 'Download Github PEM' - inputs: - secureFile: 'rp-azure-pipeline-github.pem' -- bash: | - eval $(ruby -e "require 'openssl'; require 'jwt'; private_pem = File.read(ENV['GITHUB_PEM_PATH']); private_key = OpenSSL::PKey::RSA.new(private_pem); payload = { iat: Time.now.to_i - 60, exp: Time.now.to_i + (10 * 60), iss: ENV['GITHUB_APP_ID'] }; jwt = JWT.encode(payload, private_key, 'RS256'); puts 'PUSH_JWT='+jwt;") - TOKEN=$(curl -s -X POST \ - -H "Authorization: Bearer $PUSH_JWT" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/app/installations/$GITHUB_APP_INSTALLATION_ID/access_tokens \ - | jq -r '.token') - git remote add github https://x-access-token:$TOKEN@github.com/rocket-pool/$REPO_NAME - git fetch github - git push github HEAD:$(Build.SourceBranch) -f --verbose - git push github HEAD:$(Build.SourceBranch) --tags --verbose - displayName: 'Push to Github' - env: - GITHUB_PEM_PATH: $(githubPEM.secureFilePath) - GITHUB_APP_ID: $(GITHUB_APP_ID) - GITHUB_APP_INSTALLATION_ID: $(GITHUB_APP_INSTALLATION_ID) diff --git a/bindings/go.sum b/bindings/go.sum deleted file mode 100644 index 6758191ab..000000000 --- a/bindings/go.sum +++ /dev/null @@ -1,304 +0,0 @@ -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= -github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= -github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= -github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.11.0 h1:l4iX0RqNnx/pU7rY2DB/I+znuYY0K3x6Ywac6EIr0PA= -github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= -github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= -github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= -github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= -github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3PquxglBM= -github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBPMVVDOOTLec= -github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= -github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= -github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= -github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= -github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= -github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= -github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v2 v2.0.7/go.mod h1:0CiZ1p8pvtxBlQpLXkHuUTpdJ1shm3OqCF1QugkjHL4= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fatih/color.v1 v1.7.0/go.mod h1:P7yosIhqIl/sX8J8UypY5M+dDpD2KmyfP5IRs5v/fo0= -gopkg.in/mattn/go-colorable.v0 v0.1.0/go.mod h1:BVJlBXzARQxdi3nZo6f6bnl5yR20/tOL6p+V0KejgSY= -gopkg.in/mattn/go-isatty.v0 v0.0.4/go.mod h1:wt691ab7g0X4ilKZNmMII3egK0bTxl37fEn/Fwbd8gc= -gopkg.in/mattn/go-runewidth.v0 v0.0.4/go.mod h1:BmXejnxvhwdaATwiJbB1vZ2dtXkQKZGu9yLFCZb4msQ= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= -mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= From 548818d41d2d9770e6d764a57876f025668bc3bd Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 10:44:28 -0400 Subject: [PATCH 870/878] find . -type f -exec sed -i 's#"github.com/rocket-pool/rocketpool-go#"github.com/rocket-pool/smartnode/bindings#g' {} \; --- bindings/auction/auction.go | 2 +- bindings/dao/claim.go | 2 +- bindings/dao/proposal-payload.go | 4 +-- bindings/dao/proposals.go | 8 ++--- bindings/dao/protocol/dao.go | 2 +- bindings/dao/protocol/proposal.go | 8 ++--- bindings/dao/protocol/proposals.go | 4 +-- bindings/dao/protocol/verify.go | 8 ++--- bindings/dao/security/actions.go | 2 +- bindings/dao/security/proposals.go | 4 +-- bindings/dao/security/security.go | 4 +-- bindings/dao/trustednode/actions.go | 4 +-- bindings/dao/trustednode/dao.go | 4 +-- bindings/dao/trustednode/proposals.go | 6 ++-- bindings/deposit/deposit.go | 2 +- bindings/legacy/v1.0.0/minipool/minipool.go | 4 +-- bindings/legacy/v1.0.0/rewards/node.go | 4 +-- bindings/legacy/v1.0.0/rewards/rewards.go | 4 +-- .../legacy/v1.0.0/rewards/trusted-node.go | 4 +-- .../legacy/v1.0.0/utils/address_generation.go | 6 ++-- bindings/legacy/v1.1.0-rc1/rewards/rewards.go | 4 +-- bindings/legacy/v1.1.0/minipool/factory.go | 2 +- bindings/legacy/v1.1.0/minipool/queue.go | 8 ++--- bindings/legacy/v1.1.0/network/prices.go | 2 +- bindings/legacy/v1.1.0/node/deposit.go | 6 ++-- bindings/legacy/v1.1.0/node/staking.go | 2 +- .../legacy/v1.1.0/utils/address_generation.go | 6 ++-- bindings/legacy/v1.2.0/network/balances.go | 4 +-- bindings/legacy/v1.2.0/network/prices.go | 2 +- bindings/minipool/bond-reducer.go | 2 +- bindings/minipool/factory.go | 2 +- bindings/minipool/minipool-constructor.go | 2 +- bindings/minipool/minipool-contract-v2.go | 8 ++--- bindings/minipool/minipool-contract-v3.go | 8 ++--- bindings/minipool/minipool-interface.go | 4 +-- bindings/minipool/minipool.go | 6 ++-- bindings/minipool/queue.go | 2 +- bindings/minipool/status.go | 2 +- bindings/network/balances.go | 4 +-- bindings/network/fees.go | 4 +-- bindings/network/penalties.go | 2 +- bindings/network/prices.go | 4 +-- bindings/network/voting.go | 8 ++--- bindings/node/deposit.go | 6 ++-- bindings/node/distributor.go | 2 +- bindings/node/node.go | 10 +++--- bindings/node/staking.go | 2 +- bindings/rewards/distributor-mainnet.go | 2 +- bindings/rewards/rewards.go | 4 +-- bindings/rocketpool/rocketpool.go | 2 +- bindings/settings/protocol/auction.go | 8 ++--- bindings/settings/protocol/deposit.go | 6 ++-- bindings/settings/protocol/inflation.go | 4 +-- bindings/settings/protocol/minipool.go | 6 ++-- bindings/settings/protocol/network.go | 8 ++--- bindings/settings/protocol/node.go | 8 ++--- bindings/settings/protocol/proposals.go | 8 ++--- bindings/settings/protocol/rewards.go | 8 ++--- bindings/settings/protocol/security.go | 6 ++-- bindings/settings/security/auction.go | 6 ++-- bindings/settings/security/deposit.go | 6 ++-- bindings/settings/security/minipool.go | 6 ++-- bindings/settings/security/network.go | 6 ++-- bindings/settings/security/node.go | 6 ++-- bindings/settings/trustednode/members.go | 6 ++-- bindings/settings/trustednode/minipool.go | 4 +-- bindings/settings/trustednode/proposals.go | 4 +-- bindings/settings/trustednode/rewards.go | 2 +- bindings/storage/address-queue-storage.go | 2 +- bindings/storage/rocket-storage.go | 2 +- bindings/tests/auction/auction_test.go | 18 +++++------ bindings/tests/auction/main_test.go | 8 ++--- bindings/tests/dao/main_test.go | 8 ++--- bindings/tests/dao/proposals_test.go | 16 +++++----- bindings/tests/dao/trustednode/dao_test.go | 16 +++++----- bindings/tests/dao/trustednode/main_test.go | 6 ++-- .../tests/dao/trustednode/proposals_test.go | 22 ++++++------- bindings/tests/deposit/deposit_test.go | 12 +++---- bindings/tests/deposit/main_test.go | 6 ++-- bindings/tests/minipool/contract_test.go | 32 +++++++++---------- bindings/tests/minipool/main_test.go | 6 ++-- bindings/tests/minipool/minipool_test.go | 18 +++++------ bindings/tests/minipool/queue_test.go | 14 ++++---- bindings/tests/minipool/status_test.go | 16 +++++----- bindings/tests/network/balances_test.go | 8 ++--- bindings/tests/network/fees_test.go | 8 ++--- bindings/tests/network/main_test.go | 6 ++-- bindings/tests/network/prices_test.go | 8 ++--- bindings/tests/node/deposit_test.go | 12 +++---- bindings/tests/node/distributor_test.go | 4 +-- bindings/tests/node/main_test.go | 6 ++-- bindings/tests/node/node_test.go | 6 ++-- bindings/tests/node/staking_test.go | 22 ++++++------- bindings/tests/rewards/main_test.go | 6 ++-- bindings/tests/rewards/node_test.go | 18 +++++------ bindings/tests/rewards/trusted_node_test.go | 10 +++--- bindings/tests/rocketpool/main_test.go | 4 +-- .../tests/settings/protocol/auction_test.go | 6 ++-- .../tests/settings/protocol/deposit_test.go | 6 ++-- .../tests/settings/protocol/inflation_test.go | 4 +-- bindings/tests/settings/protocol/main_test.go | 6 ++-- .../tests/settings/protocol/minipool_test.go | 6 ++-- .../tests/settings/protocol/network_test.go | 6 ++-- bindings/tests/settings/protocol/node_test.go | 4 +-- .../tests/settings/protocol/rewards_test.go | 6 ++-- .../tests/settings/trustednode/main_test.go | 6 ++-- .../settings/trustednode/members_test.go | 12 +++---- .../settings/trustednode/proposals_test.go | 10 +++--- bindings/tests/testutils/accounts/accounts.go | 2 +- bindings/tests/testutils/auction/auction.go | 18 +++++------ bindings/tests/testutils/dao/proposals.go | 16 +++++----- bindings/tests/testutils/evm/mining.go | 2 +- bindings/tests/testutils/evm/snapshots.go | 2 +- bindings/tests/testutils/minipool/minipool.go | 18 +++++------ bindings/tests/testutils/node/deposit.go | 12 +++---- bindings/tests/testutils/node/node.go | 16 +++++----- bindings/tests/testutils/node/staking.go | 10 +++--- bindings/tests/testutils/tokens/reth/reth.go | 8 ++--- bindings/tests/testutils/tokens/rpl/rpl.go | 6 ++-- .../tests/testutils/validator/deposit-data.go | 4 +-- bindings/tests/tokens/main_test.go | 6 ++-- bindings/tests/tokens/reth_test.go | 12 +++---- bindings/tests/tokens/rpl_fixed_test.go | 8 ++--- bindings/tests/tokens/rpl_test.go | 10 +++--- bindings/tests/tokens/tokens_test.go | 10 +++--- bindings/tests/utils/eth/transactions_test.go | 10 +++--- bindings/tests/utils/eth/units_test.go | 2 +- bindings/tests/utils/stage4_bootstrap.go | 8 ++--- bindings/tokens/reth.go | 4 +-- bindings/tokens/rpl-fixed.go | 2 +- bindings/tokens/rpl.go | 2 +- bindings/tokens/tokens.go | 2 +- bindings/types/beacon.go | 2 +- bindings/types/dao.go | 2 +- bindings/types/minipool.go | 2 +- bindings/utils/deposit_retrieval.go | 6 ++-- bindings/utils/eth/erc20.go | 2 +- bindings/utils/eth/logs.go | 4 +-- bindings/utils/eth/transactions.go | 2 +- bindings/utils/multicall/balances.go | 2 +- bindings/utils/multicall/multicaller.go | 2 +- bindings/utils/state/contracts.go | 4 +-- bindings/utils/state/minipool.go | 8 ++--- bindings/utils/state/network.go | 8 ++--- bindings/utils/state/node.go | 8 ++--- bindings/utils/state/odao.go | 6 ++-- bindings/utils/state/pdao.go | 8 ++--- bindings/utils/version-checker.go | 6 ++-- bindings/utils/wait.go | 2 +- rocketpool-cli/auction/bid-lot.go | 2 +- rocketpool-cli/auction/claim-lot.go | 4 +-- rocketpool-cli/auction/lots.go | 2 +- rocketpool-cli/auction/recover-lot.go | 4 +-- rocketpool-cli/auction/status.go | 2 +- rocketpool-cli/minipool/close.go | 6 ++-- rocketpool-cli/minipool/delegate.go | 2 +- rocketpool-cli/minipool/dissolve.go | 6 ++-- rocketpool-cli/minipool/distribute.go | 6 ++-- rocketpool-cli/minipool/exit.go | 2 +- rocketpool-cli/minipool/promote.go | 2 +- rocketpool-cli/minipool/reduce-bond.go | 6 ++-- rocketpool-cli/minipool/refund.go | 4 +-- rocketpool-cli/minipool/rescue-dissolved.go | 4 +-- rocketpool-cli/minipool/stake.go | 2 +- rocketpool-cli/minipool/status.go | 4 +-- rocketpool-cli/minipool/vanity.go | 2 +- rocketpool-cli/network/dao-proposals.go | 2 +- rocketpool-cli/network/rpl-price.go | 2 +- rocketpool-cli/node/burn.go | 2 +- rocketpool-cli/node/claim-rewards.go | 2 +- rocketpool-cli/node/create-vacant-minipool.go | 4 +-- rocketpool-cli/node/deposit.go | 2 +- rocketpool-cli/node/distributor.go | 2 +- rocketpool-cli/node/rpl-withdrawal-address.go | 2 +- rocketpool-cli/node/stake-rpl.go | 2 +- rocketpool-cli/node/status.go | 2 +- rocketpool-cli/node/swap-rpl.go | 2 +- rocketpool-cli/node/utils.go | 2 +- rocketpool-cli/node/withdraw-eth.go | 2 +- rocketpool-cli/node/withdraw-rpl.go | 2 +- rocketpool-cli/odao/cancel-proposal.go | 4 +-- rocketpool-cli/odao/execute-proposal.go | 6 ++-- rocketpool-cli/odao/get-settings.go | 2 +- rocketpool-cli/odao/join.go | 2 +- rocketpool-cli/odao/members.go | 2 +- rocketpool-cli/odao/proposals.go | 4 +-- rocketpool-cli/odao/propose-kick.go | 4 +-- rocketpool-cli/odao/propose-settings.go | 2 +- rocketpool-cli/odao/vote-proposal.go | 4 +-- rocketpool-cli/pdao/claim-bonds.go | 4 +-- rocketpool-cli/pdao/commands.go | 2 +- rocketpool-cli/pdao/execute-proposal.go | 6 ++-- rocketpool-cli/pdao/get-settings.go | 2 +- rocketpool-cli/pdao/percentages.go | 2 +- rocketpool-cli/pdao/proposals.go | 6 ++-- rocketpool-cli/pdao/propose-settings.go | 4 +-- rocketpool-cli/pdao/status.go | 6 ++-- rocketpool-cli/pdao/utils.go | 2 +- rocketpool-cli/pdao/vote-proposal.go | 4 +-- rocketpool-cli/queue/status.go | 2 +- rocketpool-cli/security/cancel-proposal.go | 4 +-- rocketpool-cli/security/commands.go | 2 +- rocketpool-cli/security/execute-proposal.go | 6 ++-- rocketpool-cli/security/proposals.go | 4 +-- rocketpool-cli/security/propose-settings.go | 2 +- rocketpool-cli/security/vote-proposal.go | 4 +-- rocketpool-cli/wallet/utils.go | 2 +- rocketpool/api/api.go | 2 +- rocketpool/api/auction/bid-lot.go | 4 +-- rocketpool/api/auction/claim-lot.go | 2 +- rocketpool/api/auction/create-lot.go | 4 +-- rocketpool/api/auction/recover-lot.go | 2 +- rocketpool/api/auction/status.go | 2 +- rocketpool/api/auction/utils.go | 10 +++--- rocketpool/api/debug/validators.go | 8 ++--- .../api/minipool/change-withdrawal-creds.go | 4 +-- rocketpool/api/minipool/close.go | 10 +++--- rocketpool/api/minipool/delegate.go | 6 ++-- rocketpool/api/minipool/dissolve.go | 4 +-- rocketpool/api/minipool/distribute.go | 6 ++-- rocketpool/api/minipool/exit.go | 4 +-- rocketpool/api/minipool/import-key.go | 4 +-- rocketpool/api/minipool/promote.go | 4 +-- rocketpool/api/minipool/reduce-bond.go | 6 ++-- rocketpool/api/minipool/refund.go | 2 +- rocketpool/api/minipool/rescue-dissolved.go | 8 ++--- rocketpool/api/minipool/stake.go | 6 ++-- rocketpool/api/minipool/utils.go | 14 ++++---- rocketpool/api/network/dao-proposals.go | 4 +-- rocketpool/api/network/node-fee.go | 4 +-- rocketpool/api/network/rpl-price.go | 2 +- rocketpool/api/network/stats.go | 14 ++++---- rocketpool/api/network/timezones.go | 2 +- rocketpool/api/node/burn.go | 2 +- rocketpool/api/node/claim-rewards.go | 12 +++---- rocketpool/api/node/claim-rpl.go | 2 +- rocketpool/api/node/create-vacant-minipool.go | 12 +++---- rocketpool/api/node/deposit.go | 14 ++++---- rocketpool/api/node/distributor.go | 4 +-- .../api/node/primary-withdrawal-address.go | 2 +- rocketpool/api/node/register.go | 4 +-- rocketpool/api/node/rewards.go | 14 ++++---- rocketpool/api/node/rpl-withdrawal-address.go | 4 +-- rocketpool/api/node/send-message.go | 2 +- rocketpool/api/node/send.go | 4 +-- rocketpool/api/node/set-rpl-lock-allowed.go | 2 +- .../api/node/set-stake-rpl-for-allowed.go | 2 +- rocketpool/api/node/set-timezone.go | 2 +- rocketpool/api/node/smoothing-pool.go | 6 ++-- rocketpool/api/node/stake-rpl.go | 8 ++--- rocketpool/api/node/status.go | 20 ++++++------ rocketpool/api/node/swap-rpl.go | 4 +-- rocketpool/api/node/utils.go | 6 ++-- rocketpool/api/node/withdraw-eth.go | 2 +- rocketpool/api/node/withdraw-rpl.go | 4 +-- rocketpool/api/odao/cancel-proposal.go | 6 ++-- rocketpool/api/odao/execute-proposal.go | 6 ++-- rocketpool/api/odao/get-settings.go | 2 +- rocketpool/api/odao/join.go | 8 ++--- rocketpool/api/odao/leave.go | 2 +- rocketpool/api/odao/members.go | 2 +- rocketpool/api/odao/proposals.go | 2 +- rocketpool/api/odao/propose-invite.go | 2 +- rocketpool/api/odao/propose-kick.go | 4 +-- rocketpool/api/odao/propose-leave.go | 2 +- rocketpool/api/odao/propose-settings.go | 4 +-- rocketpool/api/odao/status.go | 4 +-- rocketpool/api/odao/utils.go | 10 +++--- rocketpool/api/odao/vote-proposal.go | 6 ++-- rocketpool/api/pdao/claim-bonds.go | 6 ++-- rocketpool/api/pdao/claimable-bonds.go | 6 ++-- rocketpool/api/pdao/defeat-proposal.go | 4 +-- rocketpool/api/pdao/execute-proposal.go | 4 +-- rocketpool/api/pdao/finalize-proposal.go | 4 +-- rocketpool/api/pdao/get-settings.go | 2 +- .../pdao/initialize-voting-with-delegate.go | 2 +- rocketpool/api/pdao/initialize-voting.go | 2 +- rocketpool/api/pdao/invite-security.go | 6 ++-- rocketpool/api/pdao/kick-multi-security.go | 2 +- rocketpool/api/pdao/kick-security.go | 4 +-- rocketpool/api/pdao/one-time-spend.go | 4 +-- rocketpool/api/pdao/override-vote.go | 6 ++-- rocketpool/api/pdao/percentages.go | 8 ++--- rocketpool/api/pdao/proposals.go | 6 ++-- rocketpool/api/pdao/propose-settings.go | 6 ++-- rocketpool/api/pdao/recurring-spend.go | 4 +-- rocketpool/api/pdao/replace-security.go | 6 ++-- rocketpool/api/pdao/set-snapshot-address.go | 4 +-- rocketpool/api/pdao/status.go | 4 +-- rocketpool/api/pdao/update-recurring-spend.go | 4 +-- rocketpool/api/pdao/utils.go | 4 +-- rocketpool/api/pdao/vote-proposal.go | 4 +-- rocketpool/api/pdao/voting.go | 2 +- rocketpool/api/queue/process.go | 4 +-- rocketpool/api/queue/status.go | 4 +-- rocketpool/api/security/cancel-proposal.go | 6 ++-- rocketpool/api/security/execute-proposal.go | 6 ++-- rocketpool/api/security/join.go | 2 +- rocketpool/api/security/leave.go | 2 +- rocketpool/api/security/members.go | 2 +- rocketpool/api/security/proposals.go | 2 +- rocketpool/api/security/propose-leave.go | 2 +- rocketpool/api/security/propose-settings.go | 6 ++-- rocketpool/api/security/status.go | 4 +-- rocketpool/api/security/utils.go | 10 +++--- rocketpool/api/security/vote-proposal.go | 6 ++-- rocketpool/api/wallet/ens-name.go | 2 +- rocketpool/api/wallet/recover.go | 2 +- rocketpool/api/wallet/test.go | 2 +- rocketpool/node/auto-init-voting-power.go | 6 ++-- .../node/collectors/beacon-collector.go | 2 +- .../node/collectors/demand-collector.go | 4 +-- rocketpool/node/collectors/node-collector.go | 4 +-- rocketpool/node/collectors/odao-collector.go | 2 +- .../node/collectors/performance-collector.go | 4 +-- rocketpool/node/collectors/rpl-collector.go | 4 +-- .../collectors/smoothing-pool-collector.go | 4 +-- .../node/collectors/snapshot-collector.go | 6 ++-- .../node/collectors/supply-collector.go | 6 ++-- .../node/collectors/trusted-node-collector.go | 12 +++---- rocketpool/node/defend-pdao-props.go | 8 ++--- rocketpool/node/distribute-minipools.go | 10 +++--- rocketpool/node/download-reward-trees.go | 2 +- rocketpool/node/manage-fee-recipient.go | 2 +- rocketpool/node/promote-minipools.go | 10 +++--- rocketpool/node/reduce-bonds.go | 12 +++---- rocketpool/node/stake-prelaunch-minipools.go | 10 +++--- rocketpool/node/verify-pdao-props.go | 8 ++--- .../watchtower/cancel-bond-reductions.go | 8 ++--- .../watchtower/check-solo-migrations.go | 8 ++--- .../dissolve-timed-out-minipools.go | 8 ++--- .../watchtower/finalize-pdao-proposals.go | 8 ++--- .../watchtower/generate-rewards-tree.go | 4 +-- rocketpool/watchtower/process-penalties.go | 12 +++---- rocketpool/watchtower/respond-challenges.go | 6 ++-- .../watchtower/submit-network-balances.go | 10 +++--- .../submit-rewards-tree-stateless.go | 8 ++--- rocketpool/watchtower/submit-rpl-price.go | 8 ++--- .../watchtower/submit-scrub-minipools.go | 12 +++---- rocketpool/watchtower/utils/utils.go | 2 +- rocketpool/watchtower/watchtower.go | 4 +-- shared/services/bc-manager.go | 2 +- shared/services/beacon/client.go | 2 +- .../services/beacon/client/std-http-client.go | 2 +- shared/services/eth1.go | 2 +- shared/services/gas/gas.go | 4 +-- .../proposals/network-tree-manager.go | 2 +- .../services/proposals/node-tree-manager.go | 2 +- shared/services/proposals/proposal-manager.go | 6 ++-- .../services/proposals/vi-snapshot-manager.go | 6 ++-- shared/services/proposals/voting-tree.go | 2 +- shared/services/requirements.go | 8 ++--- shared/services/rewards/execution-client.go | 6 ++-- shared/services/rewards/generator-impl-v8.go | 8 ++--- .../services/rewards/generator-impl-v9-v10.go | 6 ++-- shared/services/rewards/mock_v10_test.go | 2 +- shared/services/rewards/rewards-file-v1.go | 4 +-- shared/services/rewards/rewards-file-v2.go | 2 +- shared/services/rewards/test/assets/assets.go | 2 +- shared/services/rewards/test/beacon.go | 2 +- shared/services/rewards/test/mock.go | 8 ++--- shared/services/rewards/test/rocketpool.go | 4 +-- shared/services/rewards/types.go | 4 +-- shared/services/rewards/utils.go | 6 ++-- shared/services/rocketpool/node.go | 2 +- shared/services/rocketpool/pdao.go | 2 +- shared/services/services.go | 4 +-- shared/services/state/cli/cli.go | 2 +- shared/services/state/manager.go | 2 +- shared/services/state/network-state.go | 10 +++--- shared/services/state/update-checks.go | 4 +-- shared/services/state/utils.go | 4 +-- shared/services/wallet/keystore/keystore.go | 2 +- .../wallet/keystore/lighthouse/keystore.go | 2 +- .../wallet/keystore/lodestar/keystore.go | 2 +- .../wallet/keystore/nimbus/keystore.go | 2 +- .../wallet/keystore/prysm/keystore.go | 2 +- .../services/wallet/keystore/teku/keystore.go | 2 +- shared/services/wallet/validator.go | 4 +-- shared/types/api/auction.go | 4 +-- shared/types/api/minipool.go | 8 ++--- shared/types/api/node.go | 6 ++-- shared/types/api/odao.go | 6 ++-- shared/types/api/pdao.go | 6 ++-- shared/types/api/queue.go | 2 +- shared/types/api/security.go | 6 ++-- shared/types/api/wallet.go | 4 +-- shared/utils/api/utils.go | 8 ++--- shared/utils/cli/validation.go | 2 +- shared/utils/eth1/eth1.go | 2 +- shared/utils/eth2/eth2.go | 10 +++--- shared/utils/rp/fee-recipient.go | 4 +-- shared/utils/rp/minipools.go | 6 ++-- shared/utils/rp/node.go | 10 +++--- .../utils/validator/set-withdrawal-creds.go | 2 +- shared/utils/validator/voluntary-exit.go | 2 +- shared/utils/wallet/recover-keys.go | 6 ++-- treegen/tree-gen.go | 6 ++-- 398 files changed, 1052 insertions(+), 1052 deletions(-) diff --git a/bindings/auction/auction.go b/bindings/auction/auction.go index 821aae6dc..1f750e420 100644 --- a/bindings/auction/auction.go +++ b/bindings/auction/auction.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Settings diff --git a/bindings/dao/claim.go b/bindings/dao/claim.go index 0fd704e97..80ee6e7a6 100644 --- a/bindings/dao/claim.go +++ b/bindings/dao/claim.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) func GetContractExists(rp *rocketpool.RocketPool, contractName string, opts *bind.CallOpts) (bool, error) { diff --git a/bindings/dao/proposal-payload.go b/bindings/dao/proposal-payload.go index aeb201e73..319d8ab5a 100644 --- a/bindings/dao/proposal-payload.go +++ b/bindings/dao/proposal-payload.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - strutils "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + strutils "github.com/rocket-pool/smartnode/bindings/utils/strings" ) // Get the string representation of a proposal payload diff --git a/bindings/dao/proposals.go b/bindings/dao/proposals.go index 3245beb09..6d71bc60e 100644 --- a/bindings/dao/proposals.go +++ b/bindings/dao/proposals.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/strings" ) // Settings diff --git a/bindings/dao/protocol/dao.go b/bindings/dao/protocol/dao.go index 541bccb66..b908a20ed 100644 --- a/bindings/dao/protocol/dao.go +++ b/bindings/dao/protocol/dao.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get contracts diff --git a/bindings/dao/protocol/proposal.go b/bindings/dao/protocol/proposal.go index bc2cffaa3..90e62b868 100644 --- a/bindings/dao/protocol/proposal.go +++ b/bindings/dao/protocol/proposal.go @@ -13,10 +13,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - strutils "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + strutils "github.com/rocket-pool/smartnode/bindings/utils/strings" "golang.org/x/sync/errgroup" ) diff --git a/bindings/dao/protocol/proposals.go b/bindings/dao/protocol/proposals.go index 38b564c3c..f205e8e49 100644 --- a/bindings/dao/protocol/proposals.go +++ b/bindings/dao/protocol/proposals.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) // Estimate the gas of ProposeSetMulti diff --git a/bindings/dao/protocol/verify.go b/bindings/dao/protocol/verify.go index a00962e75..55a27f79d 100755 --- a/bindings/dao/protocol/verify.go +++ b/bindings/dao/protocol/verify.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/dao/security/actions.go b/bindings/dao/security/actions.go index e49f86b74..4e23ffd46 100644 --- a/bindings/dao/security/actions.go +++ b/bindings/dao/security/actions.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas of Join diff --git a/bindings/dao/security/proposals.go b/bindings/dao/security/proposals.go index a9087eee9..964a44625 100644 --- a/bindings/dao/security/proposals.go +++ b/bindings/dao/security/proposals.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas of ProposeSetUint diff --git a/bindings/dao/security/security.go b/bindings/dao/security/security.go index 056fdf479..d8f139164 100644 --- a/bindings/dao/security/security.go +++ b/bindings/dao/security/security.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/strings" "golang.org/x/sync/errgroup" ) diff --git a/bindings/dao/trustednode/actions.go b/bindings/dao/trustednode/actions.go index 90924c266..bbb2ce109 100644 --- a/bindings/dao/trustednode/actions.go +++ b/bindings/dao/trustednode/actions.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Estimate the gas of Join diff --git a/bindings/dao/trustednode/dao.go b/bindings/dao/trustednode/dao.go index 194d9db63..8ee92ed4f 100644 --- a/bindings/dao/trustednode/dao.go +++ b/bindings/dao/trustednode/dao.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/strings" ) // Settings diff --git a/bindings/dao/trustednode/proposals.go b/bindings/dao/trustednode/proposals.go index 53d3e0904..899dd3421 100644 --- a/bindings/dao/trustednode/proposals.go +++ b/bindings/dao/trustednode/proposals.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/strings" ) // Estimate the gas of ProposeInviteMember diff --git a/bindings/deposit/deposit.go b/bindings/deposit/deposit.go index 83e88467c..0f729521a 100644 --- a/bindings/deposit/deposit.go +++ b/bindings/deposit/deposit.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the deposit pool balance diff --git a/bindings/legacy/v1.0.0/minipool/minipool.go b/bindings/legacy/v1.0.0/minipool/minipool.go index cb7acc3bb..32530c73d 100644 --- a/bindings/legacy/v1.0.0/minipool/minipool.go +++ b/bindings/legacy/v1.0.0/minipool/minipool.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // Settings diff --git a/bindings/legacy/v1.0.0/rewards/node.go b/bindings/legacy/v1.0.0/rewards/node.go index 6ec782c65..666a42e4a 100644 --- a/bindings/legacy/v1.0.0/rewards/node.go +++ b/bindings/legacy/v1.0.0/rewards/node.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Get whether node reward claims are enabled diff --git a/bindings/legacy/v1.0.0/rewards/rewards.go b/bindings/legacy/v1.0.0/rewards/rewards.go index f25d1d5b0..78df8fad5 100644 --- a/bindings/legacy/v1.0.0/rewards/rewards.go +++ b/bindings/legacy/v1.0.0/rewards/rewards.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Get whether a claims contract is enabled diff --git a/bindings/legacy/v1.0.0/rewards/trusted-node.go b/bindings/legacy/v1.0.0/rewards/trusted-node.go index 9bb1144d2..312da4cbd 100644 --- a/bindings/legacy/v1.0.0/rewards/trusted-node.go +++ b/bindings/legacy/v1.0.0/rewards/trusted-node.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Get whether trusted node reward claims are enabled diff --git a/bindings/legacy/v1.0.0/utils/address_generation.go b/bindings/legacy/v1.0.0/utils/address_generation.go index f738113c9..c41b38e39 100644 --- a/bindings/legacy/v1.0.0/utils/address_generation.go +++ b/bindings/legacy/v1.0.0/utils/address_generation.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/legacy/v1.0.0/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/legacy/v1.0.0/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // Combine a node's address and a salt to retreive a new salt compatible with depositing diff --git a/bindings/legacy/v1.1.0-rc1/rewards/rewards.go b/bindings/legacy/v1.1.0-rc1/rewards/rewards.go index 9f1f9b993..0766e63dd 100644 --- a/bindings/legacy/v1.1.0-rc1/rewards/rewards.go +++ b/bindings/legacy/v1.1.0-rc1/rewards/rewards.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Info for a rewards snapshot event diff --git a/bindings/legacy/v1.1.0/minipool/factory.go b/bindings/legacy/v1.1.0/minipool/factory.go index 32c31fb7f..7bd47e3a9 100644 --- a/bindings/legacy/v1.1.0/minipool/factory.go +++ b/bindings/legacy/v1.1.0/minipool/factory.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the CreationCode binary for the RocketMinipool contract that will be created by node deposits diff --git a/bindings/legacy/v1.1.0/minipool/queue.go b/bindings/legacy/v1.1.0/minipool/queue.go index 3ba0605df..fe1ed496a 100644 --- a/bindings/legacy/v1.1.0/minipool/queue.go +++ b/bindings/legacy/v1.1.0/minipool/queue.go @@ -10,10 +10,10 @@ import ( "github.com/ethereum/go-ethereum/crypto" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/storage" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // Minipool queue lengths diff --git a/bindings/legacy/v1.1.0/network/prices.go b/bindings/legacy/v1.1.0/network/prices.go index 3a947e2e2..6cb4b509d 100644 --- a/bindings/legacy/v1.1.0/network/prices.go +++ b/bindings/legacy/v1.1.0/network/prices.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the block number which network prices are current for diff --git a/bindings/legacy/v1.1.0/node/deposit.go b/bindings/legacy/v1.1.0/node/deposit.go index f5a171eb1..d0ecad67a 100644 --- a/bindings/legacy/v1.1.0/node/deposit.go +++ b/bindings/legacy/v1.1.0/node/deposit.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Estimate the gas of Deposit diff --git a/bindings/legacy/v1.1.0/node/staking.go b/bindings/legacy/v1.1.0/node/staking.go index 29dc307b6..338bb7030 100644 --- a/bindings/legacy/v1.1.0/node/staking.go +++ b/bindings/legacy/v1.1.0/node/staking.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the version of the Node Staking contract diff --git a/bindings/legacy/v1.1.0/utils/address_generation.go b/bindings/legacy/v1.1.0/utils/address_generation.go index 1faa9a472..31b79aa26 100644 --- a/bindings/legacy/v1.1.0/utils/address_generation.go +++ b/bindings/legacy/v1.1.0/utils/address_generation.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - v110_minipool "github.com/rocket-pool/rocketpool-go/legacy/v1.1.0/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + v110_minipool "github.com/rocket-pool/smartnode/bindings/legacy/v1.1.0/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // Combine a node's address and a salt to retreive a new salt compatible with depositing diff --git a/bindings/legacy/v1.2.0/network/balances.go b/bindings/legacy/v1.2.0/network/balances.go index 9c3b044e1..717a514a2 100644 --- a/bindings/legacy/v1.2.0/network/balances.go +++ b/bindings/legacy/v1.2.0/network/balances.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Get the block number which network balances are current for diff --git a/bindings/legacy/v1.2.0/network/prices.go b/bindings/legacy/v1.2.0/network/prices.go index 287658b22..11856b966 100644 --- a/bindings/legacy/v1.2.0/network/prices.go +++ b/bindings/legacy/v1.2.0/network/prices.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the block number which network prices are current for diff --git a/bindings/minipool/bond-reducer.go b/bindings/minipool/bond-reducer.go index db4e186c4..3fa760844 100644 --- a/bindings/minipool/bond-reducer.go +++ b/bindings/minipool/bond-reducer.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas required to vote to cancel a minipool's bond reduction diff --git a/bindings/minipool/factory.go b/bindings/minipool/factory.go index 3cd1800c3..fbf73d58c 100644 --- a/bindings/minipool/factory.go +++ b/bindings/minipool/factory.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the address of a minipool based on the node address and a salt diff --git a/bindings/minipool/minipool-constructor.go b/bindings/minipool/minipool-constructor.go index b5c7f4afd..61c02b9e6 100644 --- a/bindings/minipool/minipool-constructor.go +++ b/bindings/minipool/minipool-constructor.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Create a minipool binding diff --git a/bindings/minipool/minipool-contract-v2.go b/bindings/minipool/minipool-contract-v2.go index f050dac3b..c76b2a92e 100644 --- a/bindings/minipool/minipool-contract-v2.go +++ b/bindings/minipool/minipool-contract-v2.go @@ -13,10 +13,10 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/storage" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) const ( diff --git a/bindings/minipool/minipool-contract-v3.go b/bindings/minipool/minipool-contract-v3.go index e4f900e84..9e1e22540 100644 --- a/bindings/minipool/minipool-contract-v3.go +++ b/bindings/minipool/minipool-contract-v3.go @@ -13,10 +13,10 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/storage" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) const ( diff --git a/bindings/minipool/minipool-interface.go b/bindings/minipool/minipool-interface.go index d87722fbc..a2c270414 100644 --- a/bindings/minipool/minipool-interface.go +++ b/bindings/minipool/minipool-interface.go @@ -6,8 +6,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // The number of blocks to look for events in at once when scanning diff --git a/bindings/minipool/minipool.go b/bindings/minipool/minipool.go index 9cc191009..f6cf2b63d 100644 --- a/bindings/minipool/minipool.go +++ b/bindings/minipool/minipool.go @@ -10,9 +10,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + rptypes "github.com/rocket-pool/smartnode/bindings/types" ) // Settings diff --git a/bindings/minipool/queue.go b/bindings/minipool/queue.go index 4b83ddae7..e002bf7d9 100644 --- a/bindings/minipool/queue.go +++ b/bindings/minipool/queue.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Minipool queue capacity diff --git a/bindings/minipool/status.go b/bindings/minipool/status.go index 44eb2ab99..efd51e392 100644 --- a/bindings/minipool/status.go +++ b/bindings/minipool/status.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas of SubmitMinipoolWithdrawable diff --git a/bindings/network/balances.go b/bindings/network/balances.go index 681438fc8..d88bbd634 100644 --- a/bindings/network/balances.go +++ b/bindings/network/balances.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Info for a balances updated event diff --git a/bindings/network/fees.go b/bindings/network/fees.go index a2eded958..e8f78c3d6 100644 --- a/bindings/network/fees.go +++ b/bindings/network/fees.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Get the current network node demand in ETH diff --git a/bindings/network/penalties.go b/bindings/network/penalties.go index 3cfa539f1..5fafd95c0 100644 --- a/bindings/network/penalties.go +++ b/bindings/network/penalties.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas of SubmitPenalty diff --git a/bindings/network/prices.go b/bindings/network/prices.go index 4ba071bbd..6b1aabf9b 100644 --- a/bindings/network/prices.go +++ b/bindings/network/prices.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Info for a price updated event diff --git a/bindings/network/voting.go b/bindings/network/voting.go index bfd8c3a11..db39eae30 100644 --- a/bindings/network/voting.go +++ b/bindings/network/voting.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/node/deposit.go b/bindings/node/deposit.go index 57bd2f875..4a52dd88a 100644 --- a/bindings/node/deposit.go +++ b/bindings/node/deposit.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Estimate the gas of Deposit diff --git a/bindings/node/distributor.go b/bindings/node/distributor.go index e914aba5e..9563437ed 100644 --- a/bindings/node/distributor.go +++ b/bindings/node/distributor.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Distributor contract diff --git a/bindings/node/node.go b/bindings/node/node.go index 494f30a2a..e768f1236 100644 --- a/bindings/node/node.go +++ b/bindings/node/node.go @@ -11,11 +11,11 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/multicall" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/storage" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/utils/strings" ) // Settings diff --git a/bindings/node/staking.go b/bindings/node/staking.go index a1cfa1e13..d6ebbf808 100644 --- a/bindings/node/staking.go +++ b/bindings/node/staking.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get the version of the Node Staking contract diff --git a/bindings/rewards/distributor-mainnet.go b/bindings/rewards/distributor-mainnet.go index a4395c7ea..ff0e4c829 100644 --- a/bindings/rewards/distributor-mainnet.go +++ b/bindings/rewards/distributor-mainnet.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Check if the given node has already claimed rewards for the given interval diff --git a/bindings/rewards/rewards.go b/bindings/rewards/rewards.go index 352ad108f..e4d9e9b32 100644 --- a/bindings/rewards/rewards.go +++ b/bindings/rewards/rewards.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) const ( diff --git a/bindings/rocketpool/rocketpool.go b/bindings/rocketpool/rocketpool.go index 59e6c72d1..61061fc7e 100644 --- a/bindings/rocketpool/rocketpool.go +++ b/bindings/rocketpool/rocketpool.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/contracts" + "github.com/rocket-pool/smartnode/bindings/contracts" ) // Cache settings diff --git a/bindings/settings/protocol/auction.go b/bindings/settings/protocol/auction.go index 6ba9d3334..f5d42567c 100644 --- a/bindings/settings/protocol/auction.go +++ b/bindings/settings/protocol/auction.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/deposit.go b/bindings/settings/protocol/deposit.go index 9d816c8b1..af4922f1b 100644 --- a/bindings/settings/protocol/deposit.go +++ b/bindings/settings/protocol/deposit.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) // Config diff --git a/bindings/settings/protocol/inflation.go b/bindings/settings/protocol/inflation.go index eb4dfb5ac..6c279df6b 100644 --- a/bindings/settings/protocol/inflation.go +++ b/bindings/settings/protocol/inflation.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/minipool.go b/bindings/settings/protocol/minipool.go index 7aa4e523c..f889e0e6c 100644 --- a/bindings/settings/protocol/minipool.go +++ b/bindings/settings/protocol/minipool.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) // Config diff --git a/bindings/settings/protocol/network.go b/bindings/settings/protocol/network.go index 1baebf614..fd04cb233 100644 --- a/bindings/settings/protocol/network.go +++ b/bindings/settings/protocol/network.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/node.go b/bindings/settings/protocol/node.go index 992e36760..fc964aedc 100644 --- a/bindings/settings/protocol/node.go +++ b/bindings/settings/protocol/node.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/proposals.go b/bindings/settings/protocol/proposals.go index 3b3eaa135..5d925ba42 100644 --- a/bindings/settings/protocol/proposals.go +++ b/bindings/settings/protocol/proposals.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/rewards.go b/bindings/settings/protocol/rewards.go index 4d62c2279..b9adddbb5 100644 --- a/bindings/settings/protocol/rewards.go +++ b/bindings/settings/protocol/rewards.go @@ -9,10 +9,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/protocol/security.go b/bindings/settings/protocol/security.go index 16c277d12..8939bb63e 100644 --- a/bindings/settings/protocol/security.go +++ b/bindings/settings/protocol/security.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) // Config diff --git a/bindings/settings/security/auction.go b/bindings/settings/security/auction.go index 57771ee0f..d69ea6e87 100644 --- a/bindings/settings/security/auction.go +++ b/bindings/settings/security/auction.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" ) const ( diff --git a/bindings/settings/security/deposit.go b/bindings/settings/security/deposit.go index 8ce4b2540..e5aabfb3d 100644 --- a/bindings/settings/security/deposit.go +++ b/bindings/settings/security/deposit.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" ) const ( diff --git a/bindings/settings/security/minipool.go b/bindings/settings/security/minipool.go index a5e9fe076..b2e857da3 100644 --- a/bindings/settings/security/minipool.go +++ b/bindings/settings/security/minipool.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" ) const ( diff --git a/bindings/settings/security/network.go b/bindings/settings/security/network.go index 8bbcc161e..414bff815 100644 --- a/bindings/settings/security/network.go +++ b/bindings/settings/security/network.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" ) const ( diff --git a/bindings/settings/security/node.go b/bindings/settings/security/node.go index 07036c917..c9e57afaf 100644 --- a/bindings/settings/security/node.go +++ b/bindings/settings/security/node.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" ) const ( diff --git a/bindings/settings/trustednode/members.go b/bindings/settings/trustednode/members.go index 043ffbe6f..5d703b65d 100644 --- a/bindings/settings/trustednode/members.go +++ b/bindings/settings/trustednode/members.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Config diff --git a/bindings/settings/trustednode/minipool.go b/bindings/settings/trustednode/minipool.go index 6e98e806a..e39bfa2de 100644 --- a/bindings/settings/trustednode/minipool.go +++ b/bindings/settings/trustednode/minipool.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Config diff --git a/bindings/settings/trustednode/proposals.go b/bindings/settings/trustednode/proposals.go index e3fb61fd8..3a23f416d 100644 --- a/bindings/settings/trustednode/proposals.go +++ b/bindings/settings/trustednode/proposals.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Config diff --git a/bindings/settings/trustednode/rewards.go b/bindings/settings/trustednode/rewards.go index 1381aa910..f67867dcd 100644 --- a/bindings/settings/trustednode/rewards.go +++ b/bindings/settings/trustednode/rewards.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Config diff --git a/bindings/storage/address-queue-storage.go b/bindings/storage/address-queue-storage.go index 506e17226..46f77813d 100644 --- a/bindings/storage/address-queue-storage.go +++ b/bindings/storage/address-queue-storage.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // low-level address queue storage interface. Currently only used for the minipool queue. diff --git a/bindings/storage/rocket-storage.go b/bindings/storage/rocket-storage.go index 02566a540..e5e161bbb 100644 --- a/bindings/storage/rocket-storage.go +++ b/bindings/storage/rocket-storage.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Get a node's withdrawal address diff --git a/bindings/tests/auction/auction_test.go b/bindings/tests/auction/auction_test.go index 9f8940d85..c99d1fddd 100644 --- a/bindings/tests/auction/auction_test.go +++ b/bindings/tests/auction/auction_test.go @@ -4,17 +4,17 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/auction" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - auctionutils "github.com/rocket-pool/rocketpool-go/tests/testutils/auction" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + auctionutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/auction" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestAuctionDetails(t *testing.T) { diff --git a/bindings/tests/auction/main_test.go b/bindings/tests/auction/main_test.go index 4b0e624b5..f9ad4a27b 100644 --- a/bindings/tests/auction/main_test.go +++ b/bindings/tests/auction/main_test.go @@ -8,11 +8,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/utils" ) var ( diff --git a/bindings/tests/dao/main_test.go b/bindings/tests/dao/main_test.go index 4b8ec2495..6f0813258 100644 --- a/bindings/tests/dao/main_test.go +++ b/bindings/tests/dao/main_test.go @@ -8,11 +8,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/utils" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/utils" ) var ( diff --git a/bindings/tests/dao/proposals_test.go b/bindings/tests/dao/proposals_test.go index 31fdbe601..b197832aa 100644 --- a/bindings/tests/dao/proposals_test.go +++ b/bindings/tests/dao/proposals_test.go @@ -5,14 +5,14 @@ import ( "fmt" "testing" - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/dao" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/node" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestProposalDetails(t *testing.T) { diff --git a/bindings/tests/dao/trustednode/dao_test.go b/bindings/tests/dao/trustednode/dao_test.go index 752914252..effee400c 100644 --- a/bindings/tests/dao/trustednode/dao_test.go +++ b/bindings/tests/dao/trustednode/dao_test.go @@ -6,14 +6,14 @@ import ( "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/node" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestMemberDetails(t *testing.T) { diff --git a/bindings/tests/dao/trustednode/main_test.go b/bindings/tests/dao/trustednode/main_test.go index 724154754..75aa2bd2e 100644 --- a/bindings/tests/dao/trustednode/main_test.go +++ b/bindings/tests/dao/trustednode/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/dao/trustednode/proposals_test.go b/bindings/tests/dao/trustednode/proposals_test.go index 29da3e732..7221e5027 100644 --- a/bindings/tests/dao/trustednode/proposals_test.go +++ b/bindings/tests/dao/trustednode/proposals_test.go @@ -7,17 +7,17 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/dao" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + daoutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/dao" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestProposeInviteMember(t *testing.T) { diff --git a/bindings/tests/deposit/deposit_test.go b/bindings/tests/deposit/deposit_test.go index ad2362ebb..61459d22d 100644 --- a/bindings/tests/deposit/deposit_test.go +++ b/bindings/tests/deposit/deposit_test.go @@ -3,13 +3,13 @@ package deposit import ( "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" ) func TestDeposit(t *testing.T) { diff --git a/bindings/tests/deposit/main_test.go b/bindings/tests/deposit/main_test.go index 20dd37c8d..b91d2707c 100644 --- a/bindings/tests/deposit/main_test.go +++ b/bindings/tests/deposit/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/minipool/contract_test.go b/bindings/tests/minipool/contract_test.go index 679354d7e..99ab8b342 100644 --- a/bindings/tests/minipool/contract_test.go +++ b/bindings/tests/minipool/contract_test.go @@ -8,22 +8,22 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils" - - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils" + + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/tokens" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/validator" ) func TestDetails(t *testing.T) { diff --git a/bindings/tests/minipool/main_test.go b/bindings/tests/minipool/main_test.go index 038ea510e..8f85c0155 100644 --- a/bindings/tests/minipool/main_test.go +++ b/bindings/tests/minipool/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/minipool/minipool_test.go b/bindings/tests/minipool/minipool_test.go index 82b48b9a9..6a9131353 100644 --- a/bindings/tests/minipool/minipool_test.go +++ b/bindings/tests/minipool/minipool_test.go @@ -5,17 +5,17 @@ import ( "fmt" "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/types" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/validator" ) func TestMinipoolDetails(t *testing.T) { diff --git a/bindings/tests/minipool/queue_test.go b/bindings/tests/minipool/queue_test.go index b94f58875..5cf3cd9be 100644 --- a/bindings/tests/minipool/queue_test.go +++ b/bindings/tests/minipool/queue_test.go @@ -3,15 +3,15 @@ package minipool import ( "testing" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestQueueLengths(t *testing.T) { diff --git a/bindings/tests/minipool/status_test.go b/bindings/tests/minipool/status_test.go index c22a4c880..41bc685d6 100644 --- a/bindings/tests/minipool/status_test.go +++ b/bindings/tests/minipool/status_test.go @@ -4,16 +4,16 @@ import ( "fmt" "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/types" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestSubmitMinipoolWithdrawable(t *testing.T) { diff --git a/bindings/tests/network/balances_test.go b/bindings/tests/network/balances_test.go index 7fbe6d000..83fd7a1f4 100644 --- a/bindings/tests/network/balances_test.go +++ b/bindings/tests/network/balances_test.go @@ -3,11 +3,11 @@ package network import ( "testing" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestSubmitBalances(t *testing.T) { diff --git a/bindings/tests/network/fees_test.go b/bindings/tests/network/fees_test.go index d879188d6..d8af92d4a 100644 --- a/bindings/tests/network/fees_test.go +++ b/bindings/tests/network/fees_test.go @@ -4,11 +4,11 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestNodeFee(t *testing.T) { diff --git a/bindings/tests/network/main_test.go b/bindings/tests/network/main_test.go index 854951708..a32da6428 100644 --- a/bindings/tests/network/main_test.go +++ b/bindings/tests/network/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/network/prices_test.go b/bindings/tests/network/prices_test.go index 7b676709c..05162e040 100644 --- a/bindings/tests/network/prices_test.go +++ b/bindings/tests/network/prices_test.go @@ -3,11 +3,11 @@ package network import ( "testing" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestSubmitPrices(t *testing.T) { diff --git a/bindings/tests/node/deposit_test.go b/bindings/tests/node/deposit_test.go index ad6077a6a..d39d14be4 100644 --- a/bindings/tests/node/deposit_test.go +++ b/bindings/tests/node/deposit_test.go @@ -3,13 +3,13 @@ package node import ( "testing" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestDeposit(t *testing.T) { diff --git a/bindings/tests/node/distributor_test.go b/bindings/tests/node/distributor_test.go index 426f1c0d6..0816441bc 100644 --- a/bindings/tests/node/distributor_test.go +++ b/bindings/tests/node/distributor_test.go @@ -3,9 +3,9 @@ package node import ( "testing" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestNodeDistributor(t *testing.T) { diff --git a/bindings/tests/node/main_test.go b/bindings/tests/node/main_test.go index d12f5f1a7..e44d41caa 100644 --- a/bindings/tests/node/main_test.go +++ b/bindings/tests/node/main_test.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/node/node_test.go b/bindings/tests/node/node_test.go index b822b8122..20e4e6318 100644 --- a/bindings/tests/node/node_test.go +++ b/bindings/tests/node/node_test.go @@ -6,10 +6,10 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/storage" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestRegisterNode(t *testing.T) { diff --git a/bindings/tests/node/staking_test.go b/bindings/tests/node/staking_test.go index 00aa3b85c..3db07ccd6 100644 --- a/bindings/tests/node/staking_test.go +++ b/bindings/tests/node/staking_test.go @@ -5,18 +5,18 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) func TestStakeRPL(t *testing.T) { diff --git a/bindings/tests/rewards/main_test.go b/bindings/tests/rewards/main_test.go index 920876ef1..999112a03 100644 --- a/bindings/tests/rewards/main_test.go +++ b/bindings/tests/rewards/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/rewards/node_test.go b/bindings/tests/rewards/node_test.go index 0c1d5c45c..ec164fd4b 100644 --- a/bindings/tests/rewards/node_test.go +++ b/bindings/tests/rewards/node_test.go @@ -6,15 +6,15 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) func TestNodeRewards(t *testing.T) { diff --git a/bindings/tests/rewards/trusted_node_test.go b/bindings/tests/rewards/trusted_node_test.go index 4d6d341f9..85dc84d7f 100644 --- a/bindings/tests/rewards/trusted_node_test.go +++ b/bindings/tests/rewards/trusted_node_test.go @@ -5,12 +5,12 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestTrustedNodeRewards(t *testing.T) { diff --git a/bindings/tests/rocketpool/main_test.go b/bindings/tests/rocketpool/main_test.go index 0c4da11e8..07d0e61c4 100644 --- a/bindings/tests/rocketpool/main_test.go +++ b/bindings/tests/rocketpool/main_test.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/smartnode/bindings/tests" ) var ( diff --git a/bindings/tests/settings/protocol/auction_test.go b/bindings/tests/settings/protocol/auction_test.go index 8295925d4..0a48d236c 100644 --- a/bindings/tests/settings/protocol/auction_test.go +++ b/bindings/tests/settings/protocol/auction_test.go @@ -3,10 +3,10 @@ package protocol import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestAuctionSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/deposit_test.go b/bindings/tests/settings/protocol/deposit_test.go index 0077b106e..35dc9f3e4 100644 --- a/bindings/tests/settings/protocol/deposit_test.go +++ b/bindings/tests/settings/protocol/deposit_test.go @@ -3,10 +3,10 @@ package protocol import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestDepositSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/inflation_test.go b/bindings/tests/settings/protocol/inflation_test.go index 2b3d3e995..97e7381c7 100644 --- a/bindings/tests/settings/protocol/inflation_test.go +++ b/bindings/tests/settings/protocol/inflation_test.go @@ -4,9 +4,9 @@ import ( "testing" "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestInflationSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/main_test.go b/bindings/tests/settings/protocol/main_test.go index 8d2ba8039..4b5d546f4 100644 --- a/bindings/tests/settings/protocol/main_test.go +++ b/bindings/tests/settings/protocol/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/settings/protocol/minipool_test.go b/bindings/tests/settings/protocol/minipool_test.go index 8e0d11976..1af631eed 100644 --- a/bindings/tests/settings/protocol/minipool_test.go +++ b/bindings/tests/settings/protocol/minipool_test.go @@ -4,10 +4,10 @@ import ( "testing" "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestMinipoolSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/network_test.go b/bindings/tests/settings/protocol/network_test.go index abffda729..75ed259b1 100644 --- a/bindings/tests/settings/protocol/network_test.go +++ b/bindings/tests/settings/protocol/network_test.go @@ -3,10 +3,10 @@ package protocol import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestNetworkSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/node_test.go b/bindings/tests/settings/protocol/node_test.go index ac4dd7961..6624cdc44 100644 --- a/bindings/tests/settings/protocol/node_test.go +++ b/bindings/tests/settings/protocol/node_test.go @@ -3,9 +3,9 @@ package protocol import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestNodeSettings(t *testing.T) { diff --git a/bindings/tests/settings/protocol/rewards_test.go b/bindings/tests/settings/protocol/rewards_test.go index ce567ca3b..a8b8f12f0 100644 --- a/bindings/tests/settings/protocol/rewards_test.go +++ b/bindings/tests/settings/protocol/rewards_test.go @@ -3,10 +3,10 @@ package protocol import ( "testing" - protocoldao "github.com/rocket-pool/rocketpool-go/dao/protocol" - protocolsettings "github.com/rocket-pool/rocketpool-go/settings/protocol" + protocoldao "github.com/rocket-pool/smartnode/bindings/dao/protocol" + protocolsettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) func TestRewardsSettings(t *testing.T) { diff --git a/bindings/tests/settings/trustednode/main_test.go b/bindings/tests/settings/trustednode/main_test.go index 1727002a9..374b1c344 100644 --- a/bindings/tests/settings/trustednode/main_test.go +++ b/bindings/tests/settings/trustednode/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/settings/trustednode/members_test.go b/bindings/tests/settings/trustednode/members_test.go index a881706a3..e1c0fdf99 100644 --- a/bindings/tests/settings/trustednode/members_test.go +++ b/bindings/tests/settings/trustednode/members_test.go @@ -3,13 +3,13 @@ package trustednode import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + daoutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/dao" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestBootstrapMembersSettings(t *testing.T) { diff --git a/bindings/tests/settings/trustednode/proposals_test.go b/bindings/tests/settings/trustednode/proposals_test.go index d391ab32b..668b649e5 100644 --- a/bindings/tests/settings/trustednode/proposals_test.go +++ b/bindings/tests/settings/trustednode/proposals_test.go @@ -3,12 +3,12 @@ package trustednode import ( "testing" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - daoutils "github.com/rocket-pool/rocketpool-go/tests/testutils/dao" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + daoutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/dao" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) func TestBootstrapProposalsSettings(t *testing.T) { diff --git a/bindings/tests/testutils/accounts/accounts.go b/bindings/tests/testutils/accounts/accounts.go index b1c8f9c17..8b38afb83 100644 --- a/bindings/tests/testutils/accounts/accounts.go +++ b/bindings/tests/testutils/accounts/accounts.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/smartnode/bindings/tests" ) // An account containing a keypair and address diff --git a/bindings/tests/testutils/auction/auction.go b/bindings/tests/testutils/auction/auction.go index 4f9427a54..2a840ae55 100644 --- a/bindings/tests/testutils/auction/auction.go +++ b/bindings/tests/testutils/auction/auction.go @@ -4,16 +4,16 @@ import ( "fmt" "testing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - minipoolutils "github.com/rocket-pool/rocketpool-go/tests/testutils/minipool" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + minipoolutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/minipool" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" ) // Create an amount of slashed RPL in the auction contract diff --git a/bindings/tests/testutils/dao/proposals.go b/bindings/tests/testutils/dao/proposals.go index b687a2166..c19515fce 100644 --- a/bindings/tests/testutils/dao/proposals.go +++ b/bindings/tests/testutils/dao/proposals.go @@ -1,14 +1,14 @@ package dao import ( - "github.com/rocket-pool/rocketpool-go/dao" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/dao" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" ) // Pass and execute a proposal diff --git a/bindings/tests/testutils/evm/mining.go b/bindings/tests/testutils/evm/mining.go index 3d80324f3..137c21bb5 100644 --- a/bindings/tests/testutils/evm/mining.go +++ b/bindings/tests/testutils/evm/mining.go @@ -3,7 +3,7 @@ package evm import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/smartnode/bindings/tests" ) // Mine a number of blocks diff --git a/bindings/tests/testutils/evm/snapshots.go b/bindings/tests/testutils/evm/snapshots.go index a5eba8090..1beb3e81f 100644 --- a/bindings/tests/testutils/evm/snapshots.go +++ b/bindings/tests/testutils/evm/snapshots.go @@ -3,7 +3,7 @@ package evm import ( "github.com/ethereum/go-ethereum/rpc" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/smartnode/bindings/tests" ) // The ID of the current snapshot of the EVM state diff --git a/bindings/tests/testutils/minipool/minipool.go b/bindings/tests/testutils/minipool/minipool.go index 30680106e..31253f203 100644 --- a/bindings/tests/testutils/minipool/minipool.go +++ b/bindings/tests/testutils/minipool/minipool.go @@ -8,15 +8,15 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/validator" ) // Minipool created event diff --git a/bindings/tests/testutils/node/deposit.go b/bindings/tests/testutils/node/deposit.go index a6bd05aa7..dbd608b87 100644 --- a/bindings/tests/testutils/node/deposit.go +++ b/bindings/tests/testutils/node/deposit.go @@ -8,13 +8,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/validator" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/validator" ) var salt int64 = 0 diff --git a/bindings/tests/testutils/node/node.go b/bindings/tests/testutils/node/node.go index dcaf52ab2..4d62a87a6 100644 --- a/bindings/tests/testutils/node/node.go +++ b/bindings/tests/testutils/node/node.go @@ -3,14 +3,14 @@ package node import ( "fmt" - trustednodedao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - trustednodesettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" - - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + trustednodedao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + trustednodesettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tokens" + + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) // Trusted node counter diff --git a/bindings/tests/testutils/node/staking.go b/bindings/tests/testutils/node/staking.go index 70ef91dae..3a5fb5c27 100644 --- a/bindings/tests/testutils/node/staking.go +++ b/bindings/tests/testutils/node/staking.go @@ -3,12 +3,12 @@ package node import ( "math/big" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) // Mint & stake an amount of RPL against a node diff --git a/bindings/tests/testutils/tokens/reth/reth.go b/bindings/tests/testutils/tokens/reth/reth.go index 2d73b5170..f955d9061 100644 --- a/bindings/tests/testutils/tokens/reth/reth.go +++ b/bindings/tests/testutils/tokens/reth/reth.go @@ -3,11 +3,11 @@ package tokens import ( "math/big" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) // Mint an amount of rETH to an account diff --git a/bindings/tests/testutils/tokens/rpl/rpl.go b/bindings/tests/testutils/tokens/rpl/rpl.go index 443d20a76..0c8d28859 100644 --- a/bindings/tests/testutils/tokens/rpl/rpl.go +++ b/bindings/tests/testutils/tokens/rpl/rpl.go @@ -4,10 +4,10 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) // Mint an amount of RPL to an account diff --git a/bindings/tests/testutils/validator/deposit-data.go b/bindings/tests/testutils/validator/deposit-data.go index ddd1faa0d..aaf2e03e6 100644 --- a/bindings/tests/testutils/validator/deposit-data.go +++ b/bindings/tests/testutils/validator/deposit-data.go @@ -6,9 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/go-ssz" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" - "github.com/rocket-pool/rocketpool-go/tests" + "github.com/rocket-pool/smartnode/bindings/tests" ) // Deposit settings diff --git a/bindings/tests/tokens/main_test.go b/bindings/tests/tokens/main_test.go index 54e00526d..afabedf65 100644 --- a/bindings/tests/tokens/main_test.go +++ b/bindings/tests/tokens/main_test.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" ) var ( diff --git a/bindings/tests/tokens/reth_test.go b/bindings/tests/tokens/reth_test.go index 915b86878..2495b21d1 100644 --- a/bindings/tests/tokens/reth_test.go +++ b/bindings/tests/tokens/reth_test.go @@ -5,13 +5,13 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - nodeutils "github.com/rocket-pool/rocketpool-go/tests/testutils/node" - rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + nodeutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/node" + rethutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/reth" ) // GetRETHContractETHBalance test under minipool.TestWithdrawValidatorBalance diff --git a/bindings/tests/tokens/rpl_fixed_test.go b/bindings/tests/tokens/rpl_fixed_test.go index 3a7f1bbdc..67e669a87 100644 --- a/bindings/tests/tokens/rpl_fixed_test.go +++ b/bindings/tests/tokens/rpl_fixed_test.go @@ -5,11 +5,11 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) func TestFixedSupplyRPLBalances(t *testing.T) { diff --git a/bindings/tests/tokens/rpl_test.go b/bindings/tests/tokens/rpl_test.go index 4c785a85a..5515a239e 100644 --- a/bindings/tests/tokens/rpl_test.go +++ b/bindings/tests/tokens/rpl_test.go @@ -6,12 +6,12 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) func TestRPLBalances(t *testing.T) { diff --git a/bindings/tests/tokens/tokens_test.go b/bindings/tests/tokens/tokens_test.go index 2d6d3c1f6..26d29b105 100644 --- a/bindings/tests/tokens/tokens_test.go +++ b/bindings/tests/tokens/tokens_test.go @@ -4,12 +4,12 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - rethutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/reth" - rplutils "github.com/rocket-pool/rocketpool-go/tests/testutils/tokens/rpl" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + rethutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/reth" + rplutils "github.com/rocket-pool/smartnode/bindings/tests/testutils/tokens/rpl" ) func TestTokenBalances(t *testing.T) { diff --git a/bindings/tests/utils/eth/transactions_test.go b/bindings/tests/utils/eth/transactions_test.go index 1c99e6248..5ae7cb454 100644 --- a/bindings/tests/utils/eth/transactions_test.go +++ b/bindings/tests/utils/eth/transactions_test.go @@ -8,12 +8,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" - "github.com/rocket-pool/rocketpool-go/tests" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/tests/testutils/evm" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/tests" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/evm" + "github.com/rocket-pool/smartnode/bindings/utils" ) func TestSendTransaction(t *testing.T) { diff --git a/bindings/tests/utils/eth/units_test.go b/bindings/tests/utils/eth/units_test.go index afea60810..47a76a5c7 100644 --- a/bindings/tests/utils/eth/units_test.go +++ b/bindings/tests/utils/eth/units_test.go @@ -4,7 +4,7 @@ import ( "math/big" "testing" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) func TestConversion(t *testing.T) { diff --git a/bindings/tests/utils/stage4_bootstrap.go b/bindings/tests/utils/stage4_bootstrap.go index 3fc7d7ecf..2f64c415f 100644 --- a/bindings/tests/utils/stage4_bootstrap.go +++ b/bindings/tests/utils/stage4_bootstrap.go @@ -3,10 +3,10 @@ package utils import ( "time" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tests/testutils/accounts" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/tests/testutils/accounts" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Bootstrap all of the parameters to mimic Stage 4 so the unit tests work correctly diff --git a/bindings/tokens/reth.go b/bindings/tokens/reth.go index a65a57b4b..eeafad031 100644 --- a/bindings/tokens/reth.go +++ b/bindings/tokens/reth.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // diff --git a/bindings/tokens/rpl-fixed.go b/bindings/tokens/rpl-fixed.go index bebbad1e3..6c7776e39 100644 --- a/bindings/tokens/rpl-fixed.go +++ b/bindings/tokens/rpl-fixed.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // diff --git a/bindings/tokens/rpl.go b/bindings/tokens/rpl.go index 80314e2a4..7d24e46fd 100644 --- a/bindings/tokens/rpl.go +++ b/bindings/tokens/rpl.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // diff --git a/bindings/tokens/tokens.go b/bindings/tokens/tokens.go index 340b76c95..36bd5f4e9 100644 --- a/bindings/tokens/tokens.go +++ b/bindings/tokens/tokens.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Token balances diff --git a/bindings/types/beacon.go b/bindings/types/beacon.go index 8a476a88a..168537735 100644 --- a/bindings/types/beacon.go +++ b/bindings/types/beacon.go @@ -5,7 +5,7 @@ import ( "encoding/hex" - "github.com/rocket-pool/rocketpool-go/utils/json" + "github.com/rocket-pool/smartnode/bindings/utils/json" ) // Validator pubkey diff --git a/bindings/types/dao.go b/bindings/types/dao.go index 0d387ff6b..013ba2b08 100644 --- a/bindings/types/dao.go +++ b/bindings/types/dao.go @@ -5,7 +5,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/utils/json" + "github.com/rocket-pool/smartnode/bindings/utils/json" ) // DAO proposal states diff --git a/bindings/types/minipool.go b/bindings/types/minipool.go index 03a7bd17b..23d64103a 100644 --- a/bindings/types/minipool.go +++ b/bindings/types/minipool.go @@ -3,7 +3,7 @@ package types import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/json" + "github.com/rocket-pool/smartnode/bindings/utils/json" ) // Minipool statuses diff --git a/bindings/utils/deposit_retrieval.go b/bindings/utils/deposit_retrieval.go index d23f7d472..d8fcbd5b1 100644 --- a/bindings/utils/deposit_retrieval.go +++ b/bindings/utils/deposit_retrieval.go @@ -10,9 +10,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // BeaconDepositEvent represents a DepositEvent event raised by the BeaconDeposit contract. diff --git a/bindings/utils/eth/erc20.go b/bindings/utils/eth/erc20.go index fb85ac69c..e5b09a7ae 100644 --- a/bindings/utils/eth/erc20.go +++ b/bindings/utils/eth/erc20.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) const ( diff --git a/bindings/utils/eth/logs.go b/bindings/utils/eth/logs.go index 54c7c95f4..9f0e1b179 100644 --- a/bindings/utils/eth/logs.go +++ b/bindings/utils/eth/logs.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/storage" ) type FilterQuery struct { diff --git a/bindings/utils/eth/transactions.go b/bindings/utils/eth/transactions.go index ad6fc53fb..be8a1e365 100644 --- a/bindings/utils/eth/transactions.go +++ b/bindings/utils/eth/transactions.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Estimate the gas of SendTransaction diff --git a/bindings/utils/multicall/balances.go b/bindings/utils/multicall/balances.go index 81fb7e26d..ad221ba5d 100644 --- a/bindings/utils/multicall/balances.go +++ b/bindings/utils/multicall/balances.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/multicall/multicaller.go b/bindings/utils/multicall/multicaller.go index ec03c5e27..42e7b5ff2 100644 --- a/bindings/utils/multicall/multicaller.go +++ b/bindings/utils/multicall/multicaller.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) type Call struct { diff --git a/bindings/utils/state/contracts.go b/bindings/utils/state/contracts.go index 616774c1f..017a76aed 100644 --- a/bindings/utils/state/contracts.go +++ b/bindings/utils/state/contracts.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/hashicorp/go-version" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" ) // Container for network contracts diff --git a/bindings/utils/state/minipool.go b/bindings/utils/state/minipool.go index 813c8f596..1491d986d 100644 --- a/bindings/utils/state/minipool.go +++ b/bindings/utils/state/minipool.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/state/network.go b/bindings/utils/state/network.go index 18ac814e5..d49c3abff 100644 --- a/bindings/utils/state/network.go +++ b/bindings/utils/state/network.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/state/node.go b/bindings/utils/state/node.go index b252039c7..6d5bc530b 100644 --- a/bindings/utils/state/node.go +++ b/bindings/utils/state/node.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/state/odao.go b/bindings/utils/state/odao.go index 133f4e5f8..9074a6905 100644 --- a/bindings/utils/state/odao.go +++ b/bindings/utils/state/odao.go @@ -7,9 +7,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/state/pdao.go b/bindings/utils/state/pdao.go index 0f2dd8208..174143a9a 100644 --- a/bindings/utils/state/pdao.go +++ b/bindings/utils/state/pdao.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/multicall" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/multicall" "golang.org/x/sync/errgroup" ) diff --git a/bindings/utils/version-checker.go b/bindings/utils/version-checker.go index efb319ea3..02838c5ec 100644 --- a/bindings/utils/version-checker.go +++ b/bindings/utils/version-checker.go @@ -5,9 +5,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/hashicorp/go-version" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) func GetCurrentVersion(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*version.Version, error) { diff --git a/bindings/utils/wait.go b/bindings/utils/wait.go index 2b32541eb..7a9649c42 100644 --- a/bindings/utils/wait.go +++ b/bindings/utils/wait.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Wait for a transaction to get mined diff --git a/rocketpool-cli/auction/bid-lot.go b/rocketpool-cli/auction/bid-lot.go index 3f41d362b..404574c22 100644 --- a/rocketpool-cli/auction/bid-lot.go +++ b/rocketpool-cli/auction/bid-lot.go @@ -5,7 +5,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/auction/claim-lot.go b/rocketpool-cli/auction/claim-lot.go index 1454f5a58..e564fcecd 100644 --- a/rocketpool-cli/auction/claim-lot.go +++ b/rocketpool-cli/auction/claim-lot.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/auction/lots.go b/rocketpool-cli/auction/lots.go index b48a67358..684d652c4 100644 --- a/rocketpool-cli/auction/lots.go +++ b/rocketpool-cli/auction/lots.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/auction/recover-lot.go b/rocketpool-cli/auction/recover-lot.go index 58d4263c6..330c15c4b 100644 --- a/rocketpool-cli/auction/recover-lot.go +++ b/rocketpool-cli/auction/recover-lot.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/auction/status.go b/rocketpool-cli/auction/status.go index 01bd1ffd3..b6b4d22a3 100644 --- a/rocketpool-cli/auction/status.go +++ b/rocketpool-cli/auction/status.go @@ -3,7 +3,7 @@ package auction import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/minipool/close.go b/rocketpool-cli/minipool/close.go index c07b59903..eddfb4164 100644 --- a/rocketpool-cli/minipool/close.go +++ b/rocketpool-cli/minipool/close.go @@ -6,9 +6,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool-cli/minipool/delegate.go b/rocketpool-cli/minipool/delegate.go index b93ee4dea..c2b36b678 100644 --- a/rocketpool-cli/minipool/delegate.go +++ b/rocketpool-cli/minipool/delegate.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/urfave/cli" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool-cli/minipool/dissolve.go b/rocketpool-cli/minipool/dissolve.go index c1ee41fd5..ec2930156 100644 --- a/rocketpool-cli/minipool/dissolve.go +++ b/rocketpool-cli/minipool/dissolve.go @@ -5,9 +5,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/minipool/distribute.go b/rocketpool-cli/minipool/distribute.go index 883a7d36c..54af3f955 100644 --- a/rocketpool-cli/minipool/distribute.go +++ b/rocketpool-cli/minipool/distribute.go @@ -7,9 +7,9 @@ import ( "sort" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/minipool/exit.go b/rocketpool-cli/minipool/exit.go index 83ed1f978..c4456ca88 100644 --- a/rocketpool-cli/minipool/exit.go +++ b/rocketpool-cli/minipool/exit.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/minipool/promote.go b/rocketpool-cli/minipool/promote.go index 627acf187..a2c07c7be 100644 --- a/rocketpool-cli/minipool/promote.go +++ b/rocketpool-cli/minipool/promote.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/minipool/reduce-bond.go b/rocketpool-cli/minipool/reduce-bond.go index 49328f0f2..4f10af4a1 100644 --- a/rocketpool-cli/minipool/reduce-bond.go +++ b/rocketpool-cli/minipool/reduce-bond.go @@ -7,9 +7,9 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool-cli/minipool/refund.go b/rocketpool-cli/minipool/refund.go index 7b4bda2bd..eee049fb3 100644 --- a/rocketpool-cli/minipool/refund.go +++ b/rocketpool-cli/minipool/refund.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/minipool/rescue-dissolved.go b/rocketpool-cli/minipool/rescue-dissolved.go index 184fe20e9..487a00772 100644 --- a/rocketpool-cli/minipool/rescue-dissolved.go +++ b/rocketpool-cli/minipool/rescue-dissolved.go @@ -7,8 +7,8 @@ import ( "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool-cli/minipool/stake.go b/rocketpool-cli/minipool/stake.go index 0e2cf1db7..fe486c497 100644 --- a/rocketpool-cli/minipool/stake.go +++ b/rocketpool-cli/minipool/stake.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/minipool/status.go b/rocketpool-cli/minipool/status.go index a49689c18..9218548f8 100644 --- a/rocketpool-cli/minipool/status.go +++ b/rocketpool-cli/minipool/status.go @@ -5,8 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/minipool/vanity.go b/rocketpool-cli/minipool/vanity.go index 4396bb94c..5c79e6170 100644 --- a/rocketpool-cli/minipool/vanity.go +++ b/rocketpool-cli/minipool/vanity.go @@ -11,7 +11,7 @@ import ( "github.com/dustin/go-humanize" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/network/dao-proposals.go b/rocketpool-cli/network/dao-proposals.go index 42be5dc86..2fa0efae0 100644 --- a/rocketpool-cli/network/dao-proposals.go +++ b/rocketpool-cli/network/dao-proposals.go @@ -7,7 +7,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/rocketpool" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" "github.com/urfave/cli" diff --git a/rocketpool-cli/network/rpl-price.go b/rocketpool-cli/network/rpl-price.go index 86953f962..c0ee8a94a 100644 --- a/rocketpool-cli/network/rpl-price.go +++ b/rocketpool-cli/network/rpl-price.go @@ -3,7 +3,7 @@ package network import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/node/burn.go b/rocketpool-cli/node/burn.go index 1ce87892d..dee803245 100644 --- a/rocketpool-cli/node/burn.go +++ b/rocketpool-cli/node/burn.go @@ -3,7 +3,7 @@ package node import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/claim-rewards.go b/rocketpool-cli/node/claim-rewards.go index ae99fa2b9..8fc8de9af 100644 --- a/rocketpool-cli/node/claim-rewards.go +++ b/rocketpool-cli/node/claim-rewards.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/create-vacant-minipool.go b/rocketpool-cli/node/create-vacant-minipool.go index 2414bea25..204c8bd6d 100644 --- a/rocketpool-cli/node/create-vacant-minipool.go +++ b/rocketpool-cli/node/create-vacant-minipool.go @@ -7,8 +7,8 @@ import ( "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/rocketpool-cli/wallet" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/node/deposit.go b/rocketpool-cli/node/deposit.go index fc52108c8..01d5df380 100644 --- a/rocketpool-cli/node/deposit.go +++ b/rocketpool-cli/node/deposit.go @@ -6,7 +6,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/distributor.go b/rocketpool-cli/node/distributor.go index 3d7138610..57ba1d830 100644 --- a/rocketpool-cli/node/distributor.go +++ b/rocketpool-cli/node/distributor.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool-cli/node/rpl-withdrawal-address.go b/rocketpool-cli/node/rpl-withdrawal-address.go index 8d9b798fe..4af1db5e9 100644 --- a/rocketpool-cli/node/rpl-withdrawal-address.go +++ b/rocketpool-cli/node/rpl-withdrawal-address.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool-cli/node/stake-rpl.go b/rocketpool-cli/node/stake-rpl.go index f39bd556a..1e849b9cc 100644 --- a/rocketpool-cli/node/stake-rpl.go +++ b/rocketpool-cli/node/stake-rpl.go @@ -6,7 +6,7 @@ import ( "strconv" "strings" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/status.go b/rocketpool-cli/node/status.go index 83305d641..7f89bc388 100644 --- a/rocketpool-cli/node/status.go +++ b/rocketpool-cli/node/status.go @@ -8,7 +8,7 @@ import ( "sort" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/addons/rescue_node" diff --git a/rocketpool-cli/node/swap-rpl.go b/rocketpool-cli/node/swap-rpl.go index c1df52bbb..0f395313c 100644 --- a/rocketpool-cli/node/swap-rpl.go +++ b/rocketpool-cli/node/swap-rpl.go @@ -5,7 +5,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/utils.go b/rocketpool-cli/node/utils.go index f598bd7ef..db16d6707 100644 --- a/rocketpool-cli/node/utils.go +++ b/rocketpool-cli/node/utils.go @@ -18,7 +18,7 @@ import ( "github.com/urfave/cli" "gopkg.in/yaml.v2" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/rocketpool" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool-cli/node/withdraw-eth.go b/rocketpool-cli/node/withdraw-eth.go index a1677ae05..0a927d226 100644 --- a/rocketpool-cli/node/withdraw-eth.go +++ b/rocketpool-cli/node/withdraw-eth.go @@ -5,7 +5,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/node/withdraw-rpl.go b/rocketpool-cli/node/withdraw-rpl.go index 10dc45daa..aaa3ea5a7 100644 --- a/rocketpool-cli/node/withdraw-rpl.go +++ b/rocketpool-cli/node/withdraw-rpl.go @@ -5,7 +5,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/cancel-proposal.go b/rocketpool-cli/odao/cancel-proposal.go index a9c4e62f5..94e165ad9 100644 --- a/rocketpool-cli/odao/cancel-proposal.go +++ b/rocketpool-cli/odao/cancel-proposal.go @@ -5,8 +5,8 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/execute-proposal.go b/rocketpool-cli/odao/execute-proposal.go index e2a3bdbaf..3cfaff2c6 100644 --- a/rocketpool-cli/odao/execute-proposal.go +++ b/rocketpool-cli/odao/execute-proposal.go @@ -4,9 +4,9 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/get-settings.go b/rocketpool-cli/odao/get-settings.go index cb37b42fa..0a90c1378 100644 --- a/rocketpool-cli/odao/get-settings.go +++ b/rocketpool-cli/odao/get-settings.go @@ -6,7 +6,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/rocketpool" ) diff --git a/rocketpool-cli/odao/join.go b/rocketpool-cli/odao/join.go index 468e0d9d0..cd13547b5 100644 --- a/rocketpool-cli/odao/join.go +++ b/rocketpool-cli/odao/join.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/members.go b/rocketpool-cli/odao/members.go index 376954bb2..f0af1ef0a 100644 --- a/rocketpool-cli/odao/members.go +++ b/rocketpool-cli/odao/members.go @@ -3,7 +3,7 @@ package odao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/odao/proposals.go b/rocketpool-cli/odao/proposals.go index 92304ea00..e4c65e008 100644 --- a/rocketpool-cli/odao/proposals.go +++ b/rocketpool-cli/odao/proposals.go @@ -7,8 +7,8 @@ import ( "slices" "strings" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/odao/propose-kick.go b/rocketpool-cli/odao/propose-kick.go index a75d2b532..66f172d87 100644 --- a/rocketpool-cli/odao/propose-kick.go +++ b/rocketpool-cli/odao/propose-kick.go @@ -7,8 +7,8 @@ import ( "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/propose-settings.go b/rocketpool-cli/odao/propose-settings.go index 9be3e386b..9a96d9210 100644 --- a/rocketpool-cli/odao/propose-settings.go +++ b/rocketpool-cli/odao/propose-settings.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/odao/vote-proposal.go b/rocketpool-cli/odao/vote-proposal.go index 635779f9f..636b1df43 100644 --- a/rocketpool-cli/odao/vote-proposal.go +++ b/rocketpool-cli/odao/vote-proposal.go @@ -5,8 +5,8 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/pdao/claim-bonds.go b/rocketpool-cli/pdao/claim-bonds.go index cb7165e8b..050922421 100644 --- a/rocketpool-cli/pdao/claim-bonds.go +++ b/rocketpool-cli/pdao/claim-bonds.go @@ -5,8 +5,8 @@ import ( "sort" "strconv" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/pdao/commands.go b/rocketpool-cli/pdao/commands.go index 1a91e5d11..4f433e565 100644 --- a/rocketpool-cli/pdao/commands.go +++ b/rocketpool-cli/pdao/commands.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" ) diff --git a/rocketpool-cli/pdao/execute-proposal.go b/rocketpool-cli/pdao/execute-proposal.go index bdb8bb59a..6fdc08fa8 100644 --- a/rocketpool-cli/pdao/execute-proposal.go +++ b/rocketpool-cli/pdao/execute-proposal.go @@ -4,9 +4,9 @@ import ( "fmt" "strconv" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/strings" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/strings" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/pdao/get-settings.go b/rocketpool-cli/pdao/get-settings.go index d23a8bae3..0a48d75ad 100644 --- a/rocketpool-cli/pdao/get-settings.go +++ b/rocketpool-cli/pdao/get-settings.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/rocketpool" ) diff --git a/rocketpool-cli/pdao/percentages.go b/rocketpool-cli/pdao/percentages.go index b1476342e..2bf277f6c 100644 --- a/rocketpool-cli/pdao/percentages.go +++ b/rocketpool-cli/pdao/percentages.go @@ -3,7 +3,7 @@ package pdao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/gas" "github.com/rocket-pool/smartnode/shared/services/rocketpool" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool-cli/pdao/proposals.go b/rocketpool-cli/pdao/proposals.go index cbadc212e..a41bd6c68 100644 --- a/rocketpool-cli/pdao/proposals.go +++ b/rocketpool-cli/pdao/proposals.go @@ -8,9 +8,9 @@ import ( "strings" "time" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - utilsStrings "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + utilsStrings "github.com/rocket-pool/smartnode/bindings/utils/strings" "github.com/urfave/cli" diff --git a/rocketpool-cli/pdao/propose-settings.go b/rocketpool-cli/pdao/propose-settings.go index 879e04019..abcf12d65 100644 --- a/rocketpool-cli/pdao/propose-settings.go +++ b/rocketpool-cli/pdao/propose-settings.go @@ -5,8 +5,8 @@ import ( "math/big" "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/pdao/status.go b/rocketpool-cli/pdao/status.go index 1b516b023..ba616bc3d 100644 --- a/rocketpool-cli/pdao/status.go +++ b/rocketpool-cli/pdao/status.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - "github.com/rocket-pool/rocketpool-go/utils/strings" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/strings" "github.com/rocket-pool/smartnode/shared/services/rocketpool" "github.com/rocket-pool/smartnode/shared/types/api" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool-cli/pdao/utils.go b/rocketpool-cli/pdao/utils.go index b1fe1322c..db096231a 100644 --- a/rocketpool-cli/pdao/utils.go +++ b/rocketpool-cli/pdao/utils.go @@ -5,7 +5,7 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" "github.com/rocket-pool/smartnode/shared/utils/cli/prompt" "github.com/urfave/cli" diff --git a/rocketpool-cli/pdao/vote-proposal.go b/rocketpool-cli/pdao/vote-proposal.go index 1c7c5603f..2d6b17141 100644 --- a/rocketpool-cli/pdao/vote-proposal.go +++ b/rocketpool-cli/pdao/vote-proposal.go @@ -5,8 +5,8 @@ import ( "strconv" "time" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/queue/status.go b/rocketpool-cli/queue/status.go index fee499145..5046bb45e 100644 --- a/rocketpool-cli/queue/status.go +++ b/rocketpool-cli/queue/status.go @@ -3,7 +3,7 @@ package queue import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/security/cancel-proposal.go b/rocketpool-cli/security/cancel-proposal.go index eb6587afe..e386cb232 100644 --- a/rocketpool-cli/security/cancel-proposal.go +++ b/rocketpool-cli/security/cancel-proposal.go @@ -5,8 +5,8 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/security/commands.go b/rocketpool-cli/security/commands.go index 5ae1cac87..de668e1f3 100644 --- a/rocketpool-cli/security/commands.go +++ b/rocketpool-cli/security/commands.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" ) diff --git a/rocketpool-cli/security/execute-proposal.go b/rocketpool-cli/security/execute-proposal.go index 1f0ac5b5b..7f93b13bf 100644 --- a/rocketpool-cli/security/execute-proposal.go +++ b/rocketpool-cli/security/execute-proposal.go @@ -4,9 +4,9 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/security/proposals.go b/rocketpool-cli/security/proposals.go index e2bad47dd..a084356ae 100644 --- a/rocketpool-cli/security/proposals.go +++ b/rocketpool-cli/security/proposals.go @@ -7,8 +7,8 @@ import ( "slices" "strings" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/rocketpool-cli/security/propose-settings.go b/rocketpool-cli/security/propose-settings.go index 4fd64d1a8..62489feff 100644 --- a/rocketpool-cli/security/propose-settings.go +++ b/rocketpool-cli/security/propose-settings.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/security/vote-proposal.go b/rocketpool-cli/security/vote-proposal.go index 162390ffc..4ddd3afc4 100644 --- a/rocketpool-cli/security/vote-proposal.go +++ b/rocketpool-cli/security/vote-proposal.go @@ -5,8 +5,8 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool-cli/wallet/utils.go b/rocketpool-cli/wallet/utils.go index 83d5f5775..2d52cf9e1 100644 --- a/rocketpool-cli/wallet/utils.go +++ b/rocketpool-cli/wallet/utils.go @@ -11,7 +11,7 @@ import ( "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v2" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/rocketpool-cli/wallet/bip39" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/passwords" diff --git a/rocketpool/api/api.go b/rocketpool/api/api.go index f84455bac..3c762870a 100644 --- a/rocketpool/api/api.go +++ b/rocketpool/api/api.go @@ -9,7 +9,7 @@ import ( "github.com/rocket-pool/smartnode/rocketpool/api/security" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/utils" "github.com/rocket-pool/smartnode/rocketpool/api/auction" "github.com/rocket-pool/smartnode/rocketpool/api/minipool" "github.com/rocket-pool/smartnode/rocketpool/api/network" diff --git a/rocketpool/api/auction/bid-lot.go b/rocketpool/api/auction/bid-lot.go index eeda7d7d0..d6a152cc6 100644 --- a/rocketpool/api/auction/bid-lot.go +++ b/rocketpool/api/auction/bid-lot.go @@ -4,8 +4,8 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/auction" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/auction/claim-lot.go b/rocketpool/api/auction/claim-lot.go index 9af9bdec0..ee68072d2 100644 --- a/rocketpool/api/auction/claim-lot.go +++ b/rocketpool/api/auction/claim-lot.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/smartnode/bindings/auction" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/auction/create-lot.go b/rocketpool/api/auction/create-lot.go index f2c706e75..42d52e48d 100644 --- a/rocketpool/api/auction/create-lot.go +++ b/rocketpool/api/auction/create-lot.go @@ -3,8 +3,8 @@ package auction import ( "fmt" - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/auction" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/auction/recover-lot.go b/rocketpool/api/auction/recover-lot.go index 2d0f89e6a..c6abefd33 100644 --- a/rocketpool/api/auction/recover-lot.go +++ b/rocketpool/api/auction/recover-lot.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/smartnode/bindings/auction" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/auction/status.go b/rocketpool/api/auction/status.go index 64142e85f..b316a561c 100644 --- a/rocketpool/api/auction/status.go +++ b/rocketpool/api/auction/status.go @@ -1,7 +1,7 @@ package auction import ( - "github.com/rocket-pool/rocketpool-go/auction" + "github.com/rocket-pool/smartnode/bindings/auction" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/auction/utils.go b/rocketpool/api/auction/utils.go index 2f0288ce7..2e984f311 100644 --- a/rocketpool/api/auction/utils.go +++ b/rocketpool/api/auction/utils.go @@ -5,11 +5,11 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/auction" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "golang.org/x/sync/errgroup" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/debug/validators.go b/rocketpool/api/debug/validators.go index 945b195c2..09ae296b4 100644 --- a/rocketpool/api/debug/validators.go +++ b/rocketpool/api/debug/validators.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/utils/eth2" diff --git a/rocketpool/api/minipool/change-withdrawal-creds.go b/rocketpool/api/minipool/change-withdrawal-creds.go index 9d1f3cfd9..20de5618d 100644 --- a/rocketpool/api/minipool/change-withdrawal-creds.go +++ b/rocketpool/api/minipool/change-withdrawal-creds.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" eth2types "github.com/wealdtech/go-eth2-types/v2" util "github.com/wealdtech/go-eth2-util" diff --git a/rocketpool/api/minipool/close.go b/rocketpool/api/minipool/close.go index f33b7fb42..1e910c3c8 100644 --- a/rocketpool/api/minipool/close.go +++ b/rocketpool/api/minipool/close.go @@ -7,11 +7,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/minipool/delegate.go b/rocketpool/api/minipool/delegate.go index 8b1646d95..815427ff6 100644 --- a/rocketpool/api/minipool/delegate.go +++ b/rocketpool/api/minipool/delegate.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/minipool/dissolve.go b/rocketpool/api/minipool/dissolve.go index 56f126c59..3703cb8a6 100644 --- a/rocketpool/api/minipool/dissolve.go +++ b/rocketpool/api/minipool/dissolve.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/minipool/distribute.go b/rocketpool/api/minipool/distribute.go index 6615928da..ba4a91ae2 100644 --- a/rocketpool/api/minipool/distribute.go +++ b/rocketpool/api/minipool/distribute.go @@ -6,9 +6,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/minipool/exit.go b/rocketpool/api/minipool/exit.go index eccafa399..024e963a7 100644 --- a/rocketpool/api/minipool/exit.go +++ b/rocketpool/api/minipool/exit.go @@ -2,8 +2,8 @@ package minipool import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" eth2types "github.com/wealdtech/go-eth2-types/v2" diff --git a/rocketpool/api/minipool/import-key.go b/rocketpool/api/minipool/import-key.go index 8bd31b3d7..f59532413 100644 --- a/rocketpool/api/minipool/import-key.go +++ b/rocketpool/api/minipool/import-key.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" eth2types "github.com/wealdtech/go-eth2-types/v2" diff --git a/rocketpool/api/minipool/promote.go b/rocketpool/api/minipool/promote.go index 933c1942f..9cd1704a6 100644 --- a/rocketpool/api/minipool/promote.go +++ b/rocketpool/api/minipool/promote.go @@ -6,8 +6,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/minipool/reduce-bond.go b/rocketpool/api/minipool/reduce-bond.go index 3926c2122..caab073b0 100644 --- a/rocketpool/api/minipool/reduce-bond.go +++ b/rocketpool/api/minipool/reduce-bond.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/minipool/refund.go b/rocketpool/api/minipool/refund.go index 8e2a82a65..ed7b2293a 100644 --- a/rocketpool/api/minipool/refund.go +++ b/rocketpool/api/minipool/refund.go @@ -5,7 +5,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/smartnode/bindings/minipool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/minipool/rescue-dissolved.go b/rocketpool/api/minipool/rescue-dissolved.go index 5fb1c1812..8419f3d20 100644 --- a/rocketpool/api/minipool/rescue-dissolved.go +++ b/rocketpool/api/minipool/rescue-dissolved.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/minipool/stake.go b/rocketpool/api/minipool/stake.go index 712f70db7..09f1fb5f9 100644 --- a/rocketpool/api/minipool/stake.go +++ b/rocketpool/api/minipool/stake.go @@ -6,11 +6,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" "github.com/urfave/cli" - rptypes "github.com/rocket-pool/rocketpool-go/types" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/minipool/utils.go b/rocketpool/api/minipool/utils.go index d526b99d6..532f1f9fa 100644 --- a/rocketpool/api/minipool/utils.go +++ b/rocketpool/api/minipool/utils.go @@ -8,13 +8,13 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "golang.org/x/sync/errgroup" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool/api/network/dao-proposals.go b/rocketpool/api/network/dao-proposals.go index 9025e4de8..97ae79577 100644 --- a/rocketpool/api/network/dao-proposals.go +++ b/rocketpool/api/network/dao-proposals.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/rocketpool/api/pdao" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/proposals" diff --git a/rocketpool/api/network/node-fee.go b/rocketpool/api/network/node-fee.go index ba18260a9..8d88b139f 100644 --- a/rocketpool/api/network/node-fee.go +++ b/rocketpool/api/network/node-fee.go @@ -1,8 +1,8 @@ package network import ( - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/network/rpl-price.go b/rocketpool/api/network/rpl-price.go index bffd2a751..5e8aede99 100644 --- a/rocketpool/api/network/rpl-price.go +++ b/rocketpool/api/network/rpl-price.go @@ -3,7 +3,7 @@ package network import ( "math/big" - "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/smartnode/bindings/network" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/network/stats.go b/rocketpool/api/network/stats.go index dd5a9ec60..672b3b9fb 100644 --- a/rocketpool/api/network/stats.go +++ b/rocketpool/api/network/stats.go @@ -5,13 +5,13 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/network/timezones.go b/rocketpool/api/network/timezones.go index c55d0939a..a3b791338 100644 --- a/rocketpool/api/network/timezones.go +++ b/rocketpool/api/network/timezones.go @@ -4,7 +4,7 @@ import ( "math/big" "time" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/burn.go b/rocketpool/api/node/burn.go index fc37de9a4..c4ae051bd 100644 --- a/rocketpool/api/node/burn.go +++ b/rocketpool/api/node/burn.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/tokens" + "github.com/rocket-pool/smartnode/bindings/tokens" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/claim-rewards.go b/rocketpool/api/node/claim-rewards.go index 2ef2e1480..1baf28beb 100644 --- a/rocketpool/api/node/claim-rewards.go +++ b/rocketpool/api/node/claim-rewards.go @@ -10,12 +10,12 @@ import ( "github.com/urfave/cli" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/config" rprewards "github.com/rocket-pool/smartnode/shared/services/rewards" diff --git a/rocketpool/api/node/claim-rpl.go b/rocketpool/api/node/claim-rpl.go index 27e83cb26..a09d7b2af 100644 --- a/rocketpool/api/node/claim-rpl.go +++ b/rocketpool/api/node/claim-rpl.go @@ -6,7 +6,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/legacy/v1.0.0/rewards" + "github.com/rocket-pool/smartnode/bindings/legacy/v1.0.0/rewards" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/node/create-vacant-minipool.go b/rocketpool/api/node/create-vacant-minipool.go index f0c13cf24..e5e4f238f 100644 --- a/rocketpool/api/node/create-vacant-minipool.go +++ b/rocketpool/api/node/create-vacant-minipool.go @@ -6,12 +6,12 @@ import ( "math/big" "time" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/node/deposit.go b/rocketpool/api/node/deposit.go index 891c69817..d8b48f7d4 100644 --- a/rocketpool/api/node/deposit.go +++ b/rocketpool/api/node/deposit.go @@ -10,13 +10,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/distributor.go b/rocketpool/api/node/distributor.go index 250a28bf3..c9de72c33 100644 --- a/rocketpool/api/node/distributor.go +++ b/rocketpool/api/node/distributor.go @@ -4,8 +4,8 @@ import ( "context" "fmt" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/primary-withdrawal-address.go b/rocketpool/api/node/primary-withdrawal-address.go index 2acdb12fd..dadf46428 100644 --- a/rocketpool/api/node/primary-withdrawal-address.go +++ b/rocketpool/api/node/primary-withdrawal-address.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/smartnode/bindings/storage" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/register.go b/rocketpool/api/node/register.go index f6673ea87..ee972afe3 100644 --- a/rocketpool/api/node/register.go +++ b/rocketpool/api/node/register.go @@ -3,8 +3,8 @@ package node import ( "fmt" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/rewards.go b/rocketpool/api/node/rewards.go index 8db79f182..cd7c3c152 100644 --- a/rocketpool/api/node/rewards.go +++ b/rocketpool/api/node/rewards.go @@ -7,13 +7,13 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/rpl-withdrawal-address.go b/rocketpool/api/node/rpl-withdrawal-address.go index a22ce2197..3530ea828 100644 --- a/rocketpool/api/node/rpl-withdrawal-address.go +++ b/rocketpool/api/node/rpl-withdrawal-address.go @@ -5,8 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/storage" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/storage" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/send-message.go b/rocketpool/api/node/send-message.go index 29059feb6..4560bbe38 100644 --- a/rocketpool/api/node/send-message.go +++ b/rocketpool/api/node/send-message.go @@ -3,7 +3,7 @@ package node import ( "fmt" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/ethereum/go-ethereum/common" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/send.go b/rocketpool/api/node/send.go index b4f34cd85..ebc1e098e 100644 --- a/rocketpool/api/node/send.go +++ b/rocketpool/api/node/send.go @@ -8,8 +8,8 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/set-rpl-lock-allowed.go b/rocketpool/api/node/set-rpl-lock-allowed.go index 6b6a974ef..3cb74f9bd 100644 --- a/rocketpool/api/node/set-rpl-lock-allowed.go +++ b/rocketpool/api/node/set-rpl-lock-allowed.go @@ -3,7 +3,7 @@ package node import ( "fmt" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/set-stake-rpl-for-allowed.go b/rocketpool/api/node/set-stake-rpl-for-allowed.go index 6c620102a..c3267c9f9 100644 --- a/rocketpool/api/node/set-stake-rpl-for-allowed.go +++ b/rocketpool/api/node/set-stake-rpl-for-allowed.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/set-timezone.go b/rocketpool/api/node/set-timezone.go index 1661b37b0..fa6297785 100644 --- a/rocketpool/api/node/set-timezone.go +++ b/rocketpool/api/node/set-timezone.go @@ -4,7 +4,7 @@ import ( "fmt" _ "time/tzdata" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/smoothing-pool.go b/rocketpool/api/node/smoothing-pool.go index 0f2f7b6a4..665fc510a 100644 --- a/rocketpool/api/node/smoothing-pool.go +++ b/rocketpool/api/node/smoothing-pool.go @@ -5,9 +5,9 @@ import ( "fmt" "time" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rewards" - rocketpoolapi "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rewards" + rocketpoolapi "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/rocketpool" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/node/stake-rpl.go b/rocketpool/api/node/stake-rpl.go index 995f1e175..4f14f4641 100644 --- a/rocketpool/api/node/stake-rpl.go +++ b/rocketpool/api/node/stake-rpl.go @@ -5,10 +5,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/status.go b/rocketpool/api/node/status.go index 86f308044..8eaa2070d 100644 --- a/rocketpool/api/node/status.go +++ b/rocketpool/api/node/status.go @@ -9,16 +9,16 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - tnsettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + tnsettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/swap-rpl.go b/rocketpool/api/node/swap-rpl.go index eea12ff82..a66bd26aa 100644 --- a/rocketpool/api/node/swap-rpl.go +++ b/rocketpool/api/node/swap-rpl.go @@ -5,8 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/node/utils.go b/rocketpool/api/node/utils.go index 173e48fdc..be63a04c3 100644 --- a/rocketpool/api/node/utils.go +++ b/rocketpool/api/node/utils.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "golang.org/x/sync/errgroup" ) diff --git a/rocketpool/api/node/withdraw-eth.go b/rocketpool/api/node/withdraw-eth.go index 32f796f68..60f852c48 100644 --- a/rocketpool/api/node/withdraw-eth.go +++ b/rocketpool/api/node/withdraw-eth.go @@ -4,7 +4,7 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/node/withdraw-rpl.go b/rocketpool/api/node/withdraw-rpl.go index 6fc690a66..e3714521c 100644 --- a/rocketpool/api/node/withdraw-rpl.go +++ b/rocketpool/api/node/withdraw-rpl.go @@ -7,8 +7,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/cancel-proposal.go b/rocketpool/api/odao/cancel-proposal.go index 42fbb32de..705f1ee86 100644 --- a/rocketpool/api/odao/cancel-proposal.go +++ b/rocketpool/api/odao/cancel-proposal.go @@ -4,9 +4,9 @@ import ( "bytes" "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/execute-proposal.go b/rocketpool/api/odao/execute-proposal.go index 45da936ec..2889859df 100644 --- a/rocketpool/api/odao/execute-proposal.go +++ b/rocketpool/api/odao/execute-proposal.go @@ -3,9 +3,9 @@ package odao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/get-settings.go b/rocketpool/api/odao/get-settings.go index 56feb2532..4c1da5940 100644 --- a/rocketpool/api/odao/get-settings.go +++ b/rocketpool/api/odao/get-settings.go @@ -3,7 +3,7 @@ package odao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/odao/join.go b/rocketpool/api/odao/join.go index d929c18cf..e41fa6ead 100644 --- a/rocketpool/api/odao/join.go +++ b/rocketpool/api/odao/join.go @@ -5,10 +5,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - tndao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - tnsettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils" + tndao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + tnsettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/leave.go b/rocketpool/api/odao/leave.go index 5d4644b70..a8f647db7 100644 --- a/rocketpool/api/odao/leave.go +++ b/rocketpool/api/odao/leave.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/members.go b/rocketpool/api/odao/members.go index e48dac372..0766dcf88 100644 --- a/rocketpool/api/odao/members.go +++ b/rocketpool/api/odao/members.go @@ -1,7 +1,7 @@ package odao import ( - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/odao/proposals.go b/rocketpool/api/odao/proposals.go index 15b6e273f..01e4a9fbf 100644 --- a/rocketpool/api/odao/proposals.go +++ b/rocketpool/api/odao/proposals.go @@ -1,7 +1,7 @@ package odao import ( - "github.com/rocket-pool/rocketpool-go/dao" + "github.com/rocket-pool/smartnode/bindings/dao" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/odao/propose-invite.go b/rocketpool/api/odao/propose-invite.go index 1b193141a..9f950b990 100644 --- a/rocketpool/api/odao/propose-invite.go +++ b/rocketpool/api/odao/propose-invite.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/propose-kick.go b/rocketpool/api/odao/propose-kick.go index 49fbece96..91d6ce3bc 100644 --- a/rocketpool/api/odao/propose-kick.go +++ b/rocketpool/api/odao/propose-kick.go @@ -5,8 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/propose-leave.go b/rocketpool/api/odao/propose-leave.go index 0b24e8325..097374673 100644 --- a/rocketpool/api/odao/propose-leave.go +++ b/rocketpool/api/odao/propose-leave.go @@ -3,7 +3,7 @@ package odao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/propose-settings.go b/rocketpool/api/odao/propose-settings.go index 76eaa3daa..5b46faaef 100644 --- a/rocketpool/api/odao/propose-settings.go +++ b/rocketpool/api/odao/propose-settings.go @@ -4,8 +4,8 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/odao/status.go b/rocketpool/api/odao/status.go index c25bc7606..bd93bd6e7 100644 --- a/rocketpool/api/odao/status.go +++ b/rocketpool/api/odao/status.go @@ -1,8 +1,8 @@ package odao import ( - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/odao/utils.go b/rocketpool/api/odao/utils.go index bd8e27026..27ae6817f 100644 --- a/rocketpool/api/odao/utils.go +++ b/rocketpool/api/odao/utils.go @@ -4,11 +4,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - tndao "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - tnsettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + tndao "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + tnsettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "golang.org/x/sync/errgroup" ) diff --git a/rocketpool/api/odao/vote-proposal.go b/rocketpool/api/odao/vote-proposal.go index 4a278291e..e782cbad9 100644 --- a/rocketpool/api/odao/vote-proposal.go +++ b/rocketpool/api/odao/vote-proposal.go @@ -3,9 +3,9 @@ package odao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/claim-bonds.go b/rocketpool/api/pdao/claim-bonds.go index 2bcda9755..6ac83607b 100644 --- a/rocketpool/api/pdao/claim-bonds.go +++ b/rocketpool/api/pdao/claim-bonds.go @@ -3,9 +3,9 @@ package pdao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/claimable-bonds.go b/rocketpool/api/pdao/claimable-bonds.go index a431ee01e..22b36f33b 100644 --- a/rocketpool/api/pdao/claimable-bonds.go +++ b/rocketpool/api/pdao/claimable-bonds.go @@ -7,9 +7,9 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/pdao/defeat-proposal.go b/rocketpool/api/pdao/defeat-proposal.go index 118a416cd..7f3c29604 100644 --- a/rocketpool/api/pdao/defeat-proposal.go +++ b/rocketpool/api/pdao/defeat-proposal.go @@ -4,8 +4,8 @@ import ( "fmt" "time" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/execute-proposal.go b/rocketpool/api/pdao/execute-proposal.go index f8a8b61fe..3cc5913c3 100644 --- a/rocketpool/api/pdao/execute-proposal.go +++ b/rocketpool/api/pdao/execute-proposal.go @@ -3,8 +3,8 @@ package pdao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/finalize-proposal.go b/rocketpool/api/pdao/finalize-proposal.go index 5d73bb275..8c8357869 100644 --- a/rocketpool/api/pdao/finalize-proposal.go +++ b/rocketpool/api/pdao/finalize-proposal.go @@ -3,8 +3,8 @@ package pdao import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/get-settings.go b/rocketpool/api/pdao/get-settings.go index a6fd04c1a..2d08c73b5 100644 --- a/rocketpool/api/pdao/get-settings.go +++ b/rocketpool/api/pdao/get-settings.go @@ -3,7 +3,7 @@ package pdao import ( "time" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/initialize-voting-with-delegate.go b/rocketpool/api/pdao/initialize-voting-with-delegate.go index 1460fa5ce..e43350ec9 100644 --- a/rocketpool/api/pdao/initialize-voting-with-delegate.go +++ b/rocketpool/api/pdao/initialize-voting-with-delegate.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/smartnode/bindings/network" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/initialize-voting.go b/rocketpool/api/pdao/initialize-voting.go index 18c6f110c..a2789c66f 100644 --- a/rocketpool/api/pdao/initialize-voting.go +++ b/rocketpool/api/pdao/initialize-voting.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/smartnode/bindings/network" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/invite-security.go b/rocketpool/api/pdao/invite-security.go index 6069e7177..ccaec32f5 100644 --- a/rocketpool/api/pdao/invite-security.go +++ b/rocketpool/api/pdao/invite-security.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/kick-multi-security.go b/rocketpool/api/pdao/kick-multi-security.go index 609f67754..04d263eee 100644 --- a/rocketpool/api/pdao/kick-multi-security.go +++ b/rocketpool/api/pdao/kick-multi-security.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/kick-security.go b/rocketpool/api/pdao/kick-security.go index 976165182..fda3abea3 100644 --- a/rocketpool/api/pdao/kick-security.go +++ b/rocketpool/api/pdao/kick-security.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/one-time-spend.go b/rocketpool/api/pdao/one-time-spend.go index d1264253a..ebb5158d8 100644 --- a/rocketpool/api/pdao/one-time-spend.go +++ b/rocketpool/api/pdao/one-time-spend.go @@ -5,8 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/override-vote.go b/rocketpool/api/pdao/override-vote.go index b71c58f2f..67546dadc 100644 --- a/rocketpool/api/pdao/override-vote.go +++ b/rocketpool/api/pdao/override-vote.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/percentages.go b/rocketpool/api/pdao/percentages.go index 41cf2e990..6431e9971 100644 --- a/rocketpool/api/pdao/percentages.go +++ b/rocketpool/api/pdao/percentages.go @@ -4,10 +4,10 @@ import ( "fmt" "math/big" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - rpnode "github.com/rocket-pool/rocketpool-go/node" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + rpnode "github.com/rocket-pool/smartnode/bindings/node" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/proposals.go b/rocketpool/api/pdao/proposals.go index bc8fa91e5..e33f85681 100644 --- a/rocketpool/api/pdao/proposals.go +++ b/rocketpool/api/pdao/proposals.go @@ -2,9 +2,9 @@ package pdao import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/urfave/cli" diff --git a/rocketpool/api/pdao/propose-settings.go b/rocketpool/api/pdao/propose-settings.go index 282b61b4e..11c507171 100644 --- a/rocketpool/api/pdao/propose-settings.go +++ b/rocketpool/api/pdao/propose-settings.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool/api/pdao/recurring-spend.go b/rocketpool/api/pdao/recurring-spend.go index 91a927a76..c8aab810e 100644 --- a/rocketpool/api/pdao/recurring-spend.go +++ b/rocketpool/api/pdao/recurring-spend.go @@ -6,8 +6,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/replace-security.go b/rocketpool/api/pdao/replace-security.go index 189dd9a3a..0493d307f 100644 --- a/rocketpool/api/pdao/replace-security.go +++ b/rocketpool/api/pdao/replace-security.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/set-snapshot-address.go b/rocketpool/api/pdao/set-snapshot-address.go index 3e73ae2af..4d3a1c8a4 100644 --- a/rocketpool/api/pdao/set-snapshot-address.go +++ b/rocketpool/api/pdao/set-snapshot-address.go @@ -7,8 +7,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/contracts" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/pdao/status.go b/rocketpool/api/pdao/status.go index f17d1b4f4..c91c9c6e7 100644 --- a/rocketpool/api/pdao/status.go +++ b/rocketpool/api/pdao/status.go @@ -16,8 +16,8 @@ import ( "github.com/wealdtech/go-ens/v3" "golang.org/x/sync/errgroup" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/proposals" "github.com/rocket-pool/smartnode/shared/types/api" diff --git a/rocketpool/api/pdao/update-recurring-spend.go b/rocketpool/api/pdao/update-recurring-spend.go index 321336d1a..88614f1ee 100644 --- a/rocketpool/api/pdao/update-recurring-spend.go +++ b/rocketpool/api/pdao/update-recurring-spend.go @@ -6,8 +6,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/node" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/node" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/pdao/utils.go b/rocketpool/api/pdao/utils.go index a4891d94e..93e8661ec 100644 --- a/rocketpool/api/pdao/utils.go +++ b/rocketpool/api/pdao/utils.go @@ -1,8 +1,8 @@ package pdao import ( - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/proposals" diff --git a/rocketpool/api/pdao/vote-proposal.go b/rocketpool/api/pdao/vote-proposal.go index 876479d75..a2c5a92a9 100644 --- a/rocketpool/api/pdao/vote-proposal.go +++ b/rocketpool/api/pdao/vote-proposal.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/pdao/voting.go b/rocketpool/api/pdao/voting.go index d02bd36df..7366f5d24 100644 --- a/rocketpool/api/pdao/voting.go +++ b/rocketpool/api/pdao/voting.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/network" + "github.com/rocket-pool/smartnode/bindings/network" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/rocket-pool/smartnode/shared/utils/eth1" diff --git a/rocketpool/api/queue/process.go b/rocketpool/api/queue/process.go index 47d758b7a..455043821 100644 --- a/rocketpool/api/queue/process.go +++ b/rocketpool/api/queue/process.go @@ -3,8 +3,8 @@ package queue import ( "fmt" - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/queue/status.go b/rocketpool/api/queue/status.go index b60bef223..eb768a9a7 100644 --- a/rocketpool/api/queue/status.go +++ b/rocketpool/api/queue/status.go @@ -1,8 +1,8 @@ package queue import ( - "github.com/rocket-pool/rocketpool-go/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" + "github.com/rocket-pool/smartnode/bindings/deposit" + "github.com/rocket-pool/smartnode/bindings/minipool" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/cancel-proposal.go b/rocketpool/api/security/cancel-proposal.go index 307b36dc1..36809b902 100644 --- a/rocketpool/api/security/cancel-proposal.go +++ b/rocketpool/api/security/cancel-proposal.go @@ -4,9 +4,9 @@ import ( "bytes" "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/security" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/security" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/execute-proposal.go b/rocketpool/api/security/execute-proposal.go index bd78cd365..092741743 100644 --- a/rocketpool/api/security/execute-proposal.go +++ b/rocketpool/api/security/execute-proposal.go @@ -3,9 +3,9 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/security" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/security" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/join.go b/rocketpool/api/security/join.go index 268fc175d..d94fc24c0 100644 --- a/rocketpool/api/security/join.go +++ b/rocketpool/api/security/join.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/smartnode/bindings/dao/security" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/leave.go b/rocketpool/api/security/leave.go index 7d491fc28..39321cf85 100644 --- a/rocketpool/api/security/leave.go +++ b/rocketpool/api/security/leave.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/smartnode/bindings/dao/security" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/members.go b/rocketpool/api/security/members.go index a50ddc578..13dc47273 100644 --- a/rocketpool/api/security/members.go +++ b/rocketpool/api/security/members.go @@ -3,7 +3,7 @@ package security import ( "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/smartnode/bindings/dao/security" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" ) diff --git a/rocketpool/api/security/proposals.go b/rocketpool/api/security/proposals.go index 8c5b5af5f..2a7bfc393 100644 --- a/rocketpool/api/security/proposals.go +++ b/rocketpool/api/security/proposals.go @@ -1,7 +1,7 @@ package security import ( - "github.com/rocket-pool/rocketpool-go/dao" + "github.com/rocket-pool/smartnode/bindings/dao" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/security/propose-leave.go b/rocketpool/api/security/propose-leave.go index 4a814fe56..0aa19217c 100644 --- a/rocketpool/api/security/propose-leave.go +++ b/rocketpool/api/security/propose-leave.go @@ -3,7 +3,7 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/security" + "github.com/rocket-pool/smartnode/bindings/dao/security" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/security/propose-settings.go b/rocketpool/api/security/propose-settings.go index 2fe35e564..3fe60d51e 100644 --- a/rocketpool/api/security/propose-settings.go +++ b/rocketpool/api/security/propose-settings.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/settings/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/settings/security" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" cliutils "github.com/rocket-pool/smartnode/shared/utils/cli" diff --git a/rocketpool/api/security/status.go b/rocketpool/api/security/status.go index 4337f6c96..97b9c5023 100644 --- a/rocketpool/api/security/status.go +++ b/rocketpool/api/security/status.go @@ -1,8 +1,8 @@ package security import ( - "github.com/rocket-pool/rocketpool-go/dao/security" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/security" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/security/utils.go b/rocketpool/api/security/utils.go index 1460b9bbf..f65b6902a 100644 --- a/rocketpool/api/security/utils.go +++ b/rocketpool/api/security/utils.go @@ -4,11 +4,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" - psettings "github.com/rocket-pool/rocketpool-go/settings/protocol" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + psettings "github.com/rocket-pool/smartnode/bindings/settings/protocol" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "golang.org/x/sync/errgroup" ) diff --git a/rocketpool/api/security/vote-proposal.go b/rocketpool/api/security/vote-proposal.go index 2fa7eda39..bddd3ea7f 100644 --- a/rocketpool/api/security/vote-proposal.go +++ b/rocketpool/api/security/vote-proposal.go @@ -3,9 +3,9 @@ package security import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/security" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/security" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/api/wallet/ens-name.go b/rocketpool/api/wallet/ens-name.go index 6d7d2dc43..34a3f8108 100644 --- a/rocketpool/api/wallet/ens-name.go +++ b/rocketpool/api/wallet/ens-name.go @@ -3,7 +3,7 @@ package wallet import ( "fmt" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/types/api" "github.com/urfave/cli" diff --git a/rocketpool/api/wallet/recover.go b/rocketpool/api/wallet/recover.go index 285bc8a4a..fe2d48c64 100644 --- a/rocketpool/api/wallet/recover.go +++ b/rocketpool/api/wallet/recover.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/api/wallet/test.go b/rocketpool/api/wallet/test.go index 0ff16bc16..b139c9731 100644 --- a/rocketpool/api/wallet/test.go +++ b/rocketpool/api/wallet/test.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/auto-init-voting-power.go b/rocketpool/node/auto-init-voting-power.go index 5022fe3f3..c51f1c2bb 100644 --- a/rocketpool/node/auto-init-voting-power.go +++ b/rocketpool/node/auto-init-voting-power.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/node/collectors/beacon-collector.go b/rocketpool/node/collectors/beacon-collector.go index 5063bfaf1..dece07ff8 100644 --- a/rocketpool/node/collectors/beacon-collector.go +++ b/rocketpool/node/collectors/beacon-collector.go @@ -8,7 +8,7 @@ import ( "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "golang.org/x/sync/errgroup" ) diff --git a/rocketpool/node/collectors/demand-collector.go b/rocketpool/node/collectors/demand-collector.go index 8c67c2f5e..6abe3d33e 100644 --- a/rocketpool/node/collectors/demand-collector.go +++ b/rocketpool/node/collectors/demand-collector.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) const namespace = "rocketpool" diff --git a/rocketpool/node/collectors/node-collector.go b/rocketpool/node/collectors/node-collector.go index 4b69ff0f1..a07c57cd5 100644 --- a/rocketpool/node/collectors/node-collector.go +++ b/rocketpool/node/collectors/node-collector.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/node/collectors/odao-collector.go b/rocketpool/node/collectors/odao-collector.go index 4c7959cc2..28c8d45b3 100644 --- a/rocketpool/node/collectors/odao-collector.go +++ b/rocketpool/node/collectors/odao-collector.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // Represents the collector for the ODAO metrics diff --git a/rocketpool/node/collectors/performance-collector.go b/rocketpool/node/collectors/performance-collector.go index 2e7f34f7c..c64681e32 100644 --- a/rocketpool/node/collectors/performance-collector.go +++ b/rocketpool/node/collectors/performance-collector.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" ) // Represents the collector for the Performance metrics diff --git a/rocketpool/node/collectors/rpl-collector.go b/rocketpool/node/collectors/rpl-collector.go index 4df55e3ca..7cbe1955e 100644 --- a/rocketpool/node/collectors/rpl-collector.go +++ b/rocketpool/node/collectors/rpl-collector.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/config" ) diff --git a/rocketpool/node/collectors/smoothing-pool-collector.go b/rocketpool/node/collectors/smoothing-pool-collector.go index de6ade39e..4493c89dd 100644 --- a/rocketpool/node/collectors/smoothing-pool-collector.go +++ b/rocketpool/node/collectors/smoothing-pool-collector.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" ) diff --git a/rocketpool/node/collectors/snapshot-collector.go b/rocketpool/node/collectors/snapshot-collector.go index cb6fda5f4..a74036e62 100644 --- a/rocketpool/node/collectors/snapshot-collector.go +++ b/rocketpool/node/collectors/snapshot-collector.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/rocketpool/api/pdao" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/node/collectors/supply-collector.go b/rocketpool/node/collectors/supply-collector.go index dfc683d35..0570fc162 100644 --- a/rocketpool/node/collectors/supply-collector.go +++ b/rocketpool/node/collectors/supply-collector.go @@ -4,9 +4,9 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "golang.org/x/sync/errgroup" ) diff --git a/rocketpool/node/collectors/trusted-node-collector.go b/rocketpool/node/collectors/trusted-node-collector.go index 1e4ef5573..b9db2a0cd 100644 --- a/rocketpool/node/collectors/trusted-node-collector.go +++ b/rocketpool/node/collectors/trusted-node-collector.go @@ -10,12 +10,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prometheus/client_golang/prometheus" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "golang.org/x/sync/errgroup" diff --git a/rocketpool/node/defend-pdao-props.go b/rocketpool/node/defend-pdao-props.go index 05439eb35..a20b32220 100644 --- a/rocketpool/node/defend-pdao-props.go +++ b/rocketpool/node/defend-pdao-props.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/node/distribute-minipools.go b/rocketpool/node/distribute-minipools.go index f8e98fd51..755e3f586 100644 --- a/rocketpool/node/distribute-minipools.go +++ b/rocketpool/node/distribute-minipools.go @@ -7,11 +7,11 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/download-reward-trees.go b/rocketpool/node/download-reward-trees.go index 79ae6d6a3..cbe7bcd2c 100644 --- a/rocketpool/node/download-reward-trees.go +++ b/rocketpool/node/download-reward-trees.go @@ -5,7 +5,7 @@ import ( "os" "github.com/docker/docker/client" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/manage-fee-recipient.go b/rocketpool/node/manage-fee-recipient.go index 5056ebf58..4309e3e76 100644 --- a/rocketpool/node/manage-fee-recipient.go +++ b/rocketpool/node/manage-fee-recipient.go @@ -5,7 +5,7 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/promote-minipools.go b/rocketpool/node/promote-minipools.go index 0d1c0773f..659c17400 100644 --- a/rocketpool/node/promote-minipools.go +++ b/rocketpool/node/promote-minipools.go @@ -9,11 +9,11 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/reduce-bonds.go b/rocketpool/node/reduce-bonds.go index 20367c79b..7dbb000cd 100644 --- a/rocketpool/node/reduce-bonds.go +++ b/rocketpool/node/reduce-bonds.go @@ -9,15 +9,15 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "golang.org/x/sync/errgroup" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/alerting" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/node/stake-prelaunch-minipools.go b/rocketpool/node/stake-prelaunch-minipools.go index 247d1267a..eacc84857 100644 --- a/rocketpool/node/stake-prelaunch-minipools.go +++ b/rocketpool/node/stake-prelaunch-minipools.go @@ -9,11 +9,11 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services" diff --git a/rocketpool/node/verify-pdao-props.go b/rocketpool/node/verify-pdao-props.go index 91638766b..579fa68e3 100644 --- a/rocketpool/node/verify-pdao-props.go +++ b/rocketpool/node/verify-pdao-props.go @@ -7,10 +7,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/watchtower/cancel-bond-reductions.go b/rocketpool/watchtower/cancel-bond-reductions.go index 84434f827..05f53a25e 100644 --- a/rocketpool/watchtower/cancel-bond-reductions.go +++ b/rocketpool/watchtower/cancel-bond-reductions.go @@ -9,10 +9,10 @@ import ( "github.com/rocket-pool/smartnode/rocketpool/watchtower/collectors" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool/watchtower/check-solo-migrations.go b/rocketpool/watchtower/check-solo-migrations.go index ebfe14bed..4c1a85783 100644 --- a/rocketpool/watchtower/check-solo-migrations.go +++ b/rocketpool/watchtower/check-solo-migrations.go @@ -9,10 +9,10 @@ import ( "github.com/rocket-pool/smartnode/rocketpool/watchtower/collectors" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool/watchtower/dissolve-timed-out-minipools.go b/rocketpool/watchtower/dissolve-timed-out-minipools.go index 09937e2f1..f913fef4a 100644 --- a/rocketpool/watchtower/dissolve-timed-out-minipools.go +++ b/rocketpool/watchtower/dissolve-timed-out-minipools.go @@ -6,10 +6,10 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" diff --git a/rocketpool/watchtower/finalize-pdao-proposals.go b/rocketpool/watchtower/finalize-pdao-proposals.go index a918eab46..8af0ff94b 100644 --- a/rocketpool/watchtower/finalize-pdao-proposals.go +++ b/rocketpool/watchtower/finalize-pdao-proposals.go @@ -3,10 +3,10 @@ package watchtower import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" diff --git a/rocketpool/watchtower/generate-rewards-tree.go b/rocketpool/watchtower/generate-rewards-tree.go index a93b6d782..d712d0770 100644 --- a/rocketpool/watchtower/generate-rewards-tree.go +++ b/rocketpool/watchtower/generate-rewards-tree.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/rocketpool/watchtower/process-penalties.go b/rocketpool/watchtower/process-penalties.go index 77f1c2a5a..9fca79137 100644 --- a/rocketpool/watchtower/process-penalties.go +++ b/rocketpool/watchtower/process-penalties.go @@ -13,12 +13,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" rpgas "github.com/rocket-pool/smartnode/shared/services/gas" diff --git a/rocketpool/watchtower/respond-challenges.go b/rocketpool/watchtower/respond-challenges.go index d958f36e7..009636f74 100644 --- a/rocketpool/watchtower/respond-challenges.go +++ b/rocketpool/watchtower/respond-challenges.go @@ -3,9 +3,9 @@ package watchtower import ( "fmt" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" diff --git a/rocketpool/watchtower/submit-network-balances.go b/rocketpool/watchtower/submit-network-balances.go index 9f281ccc2..405e1921f 100644 --- a/rocketpool/watchtower/submit-network-balances.go +++ b/rocketpool/watchtower/submit-network-balances.go @@ -10,11 +10,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" "golang.org/x/sync/errgroup" diff --git a/rocketpool/watchtower/submit-rewards-tree-stateless.go b/rocketpool/watchtower/submit-rewards-tree-stateless.go index 1028b6453..d87bf9973 100644 --- a/rocketpool/watchtower/submit-rewards-tree-stateless.go +++ b/rocketpool/watchtower/submit-rewards-tree-stateless.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/rocketpool/watchtower/submit-rpl-price.go b/rocketpool/watchtower/submit-rpl-price.go index c87982f12..9f752ff0b 100644 --- a/rocketpool/watchtower/submit-rpl-price.go +++ b/rocketpool/watchtower/submit-rpl-price.go @@ -16,10 +16,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/rocketpool/watchtower/utils" diff --git a/rocketpool/watchtower/submit-scrub-minipools.go b/rocketpool/watchtower/submit-scrub-minipools.go index e2eb0ab48..69b8fca98 100644 --- a/rocketpool/watchtower/submit-scrub-minipools.go +++ b/rocketpool/watchtower/submit-scrub-minipools.go @@ -11,12 +11,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" prdeposit "github.com/prysmaticlabs/prysm/v5/contracts/deposit" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - rputils "github.com/rocket-pool/rocketpool-go/utils" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + rputils "github.com/rocket-pool/smartnode/bindings/utils" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/urfave/cli" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" diff --git a/rocketpool/watchtower/utils/utils.go b/rocketpool/watchtower/utils/utils.go index f08deb2bb..04b8dab1d 100644 --- a/rocketpool/watchtower/utils/utils.go +++ b/rocketpool/watchtower/utils/utils.go @@ -8,7 +8,7 @@ import ( "time" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" ) diff --git a/rocketpool/watchtower/watchtower.go b/rocketpool/watchtower/watchtower.go index 2a124b39b..632772ab6 100644 --- a/rocketpool/watchtower/watchtower.go +++ b/rocketpool/watchtower/watchtower.go @@ -13,8 +13,8 @@ import ( "github.com/fatih/color" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/rocketpool/watchtower/collectors" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/shared/services/bc-manager.go b/shared/services/bc-manager.go index fda19834b..0f482be0c 100644 --- a/shared/services/bc-manager.go +++ b/shared/services/bc-manager.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/fatih/color" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/beacon/client" "github.com/rocket-pool/smartnode/shared/services/config" diff --git a/shared/services/beacon/client.go b/shared/services/beacon/client.go index 4fd1a8471..e80b09fd7 100644 --- a/shared/services/beacon/client.go +++ b/shared/services/beacon/client.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/go-bitfield" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" ) // API request options diff --git a/shared/services/beacon/client/std-http-client.go b/shared/services/beacon/client/std-http-client.go index d2d17c109..878eb183d 100644 --- a/shared/services/beacon/client/std-http-client.go +++ b/shared/services/beacon/client/std-http-client.go @@ -18,7 +18,7 @@ import ( "github.com/goccy/go-json" "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/v5/crypto/bls" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" eth2types "github.com/wealdtech/go-eth2-types/v2" "golang.org/x/sync/errgroup" diff --git a/shared/services/eth1.go b/shared/services/eth1.go index e748aa3ec..f444a4dd3 100644 --- a/shared/services/eth1.go +++ b/shared/services/eth1.go @@ -3,7 +3,7 @@ package services import ( "context" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) func GetEthClientLatestBlockTimestamp(ec rocketpool.ExecutionClient) (uint64, error) { diff --git a/shared/services/gas/gas.go b/shared/services/gas/gas.go index f2316b876..0db14e94b 100644 --- a/shared/services/gas/gas.go +++ b/shared/services/gas/gas.go @@ -5,8 +5,8 @@ import ( "math/big" "strconv" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/gas/etherchain" "github.com/rocket-pool/smartnode/shared/services/gas/etherscan" rpsvc "github.com/rocket-pool/smartnode/shared/services/rocketpool" diff --git a/shared/services/proposals/network-tree-manager.go b/shared/services/proposals/network-tree-manager.go index 5b759f8ce..ceef5aa7b 100644 --- a/shared/services/proposals/network-tree-manager.go +++ b/shared/services/proposals/network-tree-manager.go @@ -9,7 +9,7 @@ import ( "github.com/blang/semver/v4" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/config" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" "github.com/rocket-pool/smartnode/shared/utils/log" diff --git a/shared/services/proposals/node-tree-manager.go b/shared/services/proposals/node-tree-manager.go index 7b9622e61..4ee7ed9c8 100644 --- a/shared/services/proposals/node-tree-manager.go +++ b/shared/services/proposals/node-tree-manager.go @@ -9,7 +9,7 @@ import ( "github.com/blang/semver/v4" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/config" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" "github.com/rocket-pool/smartnode/shared/utils/log" diff --git a/shared/services/proposals/proposal-manager.go b/shared/services/proposals/proposal-manager.go index 8fe4f4d57..71829e5af 100644 --- a/shared/services/proposals/proposal-manager.go +++ b/shared/services/proposals/proposal-manager.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/state" diff --git a/shared/services/proposals/vi-snapshot-manager.go b/shared/services/proposals/vi-snapshot-manager.go index 5b3ff56e6..1bb6c6d03 100644 --- a/shared/services/proposals/vi-snapshot-manager.go +++ b/shared/services/proposals/vi-snapshot-manager.go @@ -11,9 +11,9 @@ import ( "github.com/blang/semver/v4" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/network" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/network" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared" "github.com/rocket-pool/smartnode/shared/services/config" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" diff --git a/shared/services/proposals/voting-tree.go b/shared/services/proposals/voting-tree.go index 8712572ce..0e1b06b80 100755 --- a/shared/services/proposals/voting-tree.go +++ b/shared/services/proposals/voting-tree.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" ) diff --git a/shared/services/requirements.go b/shared/services/requirements.go index bbdf2cddc..7b72fa663 100644 --- a/shared/services/requirements.go +++ b/shared/services/requirements.go @@ -9,10 +9,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/alerting" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/urfave/cli" diff --git a/shared/services/rewards/execution-client.go b/shared/services/rewards/execution-client.go index 418f825e0..ee3907634 100644 --- a/shared/services/rewards/execution-client.go +++ b/shared/services/rewards/execution-client.go @@ -8,9 +8,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/trustednode" ) // Interface assertion diff --git a/shared/services/rewards/generator-impl-v8.go b/shared/services/rewards/generator-impl-v8.go index 548dde663..d5b2fd77a 100644 --- a/shared/services/rewards/generator-impl-v8.go +++ b/shared/services/rewards/generator-impl-v8.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ipfs/go-cid" - "github.com/rocket-pool/rocketpool-go/rewards" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/rewards" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/state" diff --git a/shared/services/rewards/generator-impl-v9-v10.go b/shared/services/rewards/generator-impl-v9-v10.go index f48f3db1c..6a6dc456b 100644 --- a/shared/services/rewards/generator-impl-v9-v10.go +++ b/shared/services/rewards/generator-impl-v9-v10.go @@ -12,9 +12,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ipfs/go-cid" - "github.com/rocket-pool/rocketpool-go/rewards" - rptypes "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rewards" + rptypes "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/rewards/fees" diff --git a/shared/services/rewards/mock_v10_test.go b/shared/services/rewards/mock_v10_test.go index ce933590b..07fa852be 100644 --- a/shared/services/rewards/mock_v10_test.go +++ b/shared/services/rewards/mock_v10_test.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/fatih/color" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/rewards/test" "github.com/rocket-pool/smartnode/shared/services/rewards/test/assets" diff --git a/shared/services/rewards/rewards-file-v1.go b/shared/services/rewards/rewards-file-v1.go index bab73c94c..a0487c82c 100644 --- a/shared/services/rewards/rewards-file-v1.go +++ b/shared/services/rewards/rewards-file-v1.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/goccy/go-json" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/wealdtech/go-merkletree" "github.com/wealdtech/go-merkletree/keccak256" ) diff --git a/shared/services/rewards/rewards-file-v2.go b/shared/services/rewards/rewards-file-v2.go index 522b251ca..b20c06e24 100644 --- a/shared/services/rewards/rewards-file-v2.go +++ b/shared/services/rewards/rewards-file-v2.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/goccy/go-json" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/wealdtech/go-merkletree" "github.com/wealdtech/go-merkletree/keccak256" ) diff --git a/shared/services/rewards/test/assets/assets.go b/shared/services/rewards/test/assets/assets.go index 7faf79d73..43a661c83 100644 --- a/shared/services/rewards/test/assets/assets.go +++ b/shared/services/rewards/test/assets/assets.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rewards" + "github.com/rocket-pool/smartnode/bindings/rewards" "github.com/rocket-pool/smartnode/shared/services/state" ) diff --git a/shared/services/rewards/test/beacon.go b/shared/services/rewards/test/beacon.go index 74104814f..b80cdcf56 100644 --- a/shared/services/rewards/test/beacon.go +++ b/shared/services/rewards/test/beacon.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/prysmaticlabs/go-bitfield" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/state" ) diff --git a/shared/services/rewards/test/mock.go b/shared/services/rewards/test/mock.go index b9fb3381e..3dd672b11 100644 --- a/shared/services/rewards/test/mock.go +++ b/shared/services/rewards/test/mock.go @@ -6,10 +6,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - rprewards "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + rprewards "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/rewards/fees" "github.com/rocket-pool/smartnode/shared/services/state" diff --git a/shared/services/rewards/test/rocketpool.go b/shared/services/rewards/test/rocketpool.go index 5d123424d..d95ad93f8 100644 --- a/shared/services/rewards/test/rocketpool.go +++ b/shared/services/rewards/test/rocketpool.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // MockRocketPool is a EC mock specifically for testing treegen. diff --git a/shared/services/rewards/types.go b/shared/services/rewards/types.go index 006cb2995..06791d0f9 100644 --- a/shared/services/rewards/types.go +++ b/shared/services/rewards/types.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/wealdtech/go-merkletree" ) diff --git a/shared/services/rewards/utils.go b/shared/services/rewards/utils.go index c8c27a752..6c14e0764 100644 --- a/shared/services/rewards/utils.go +++ b/shared/services/rewards/utils.go @@ -16,9 +16,9 @@ import ( "github.com/goccy/go-json" "github.com/klauspost/compress/zstd" "github.com/mitchellh/go-homedir" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" diff --git a/shared/services/rocketpool/node.go b/shared/services/rocketpool/node.go index de6ddf247..fbe77c99e 100644 --- a/shared/services/rocketpool/node.go +++ b/shared/services/rocketpool/node.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/goccy/go-json" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/types/api" utils "github.com/rocket-pool/smartnode/shared/utils/api" ) diff --git a/shared/services/rocketpool/pdao.go b/shared/services/rocketpool/pdao.go index e6e299148..9a45df31a 100644 --- a/shared/services/rocketpool/pdao.go +++ b/shared/services/rocketpool/pdao.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/goccy/go-json" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/types/api" ) diff --git a/shared/services/services.go b/shared/services/services.go index 0edb98b5f..e50dccf08 100644 --- a/shared/services/services.go +++ b/shared/services/services.go @@ -9,8 +9,8 @@ import ( "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/urfave/cli" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/shared/services/state/cli/cli.go b/shared/services/state/cli/cli.go index 56d6b87dd..b9c8c8ba2 100644 --- a/shared/services/state/cli/cli.go +++ b/shared/services/state/cli/cli.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/beacon/client" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/state" diff --git a/shared/services/state/manager.go b/shared/services/state/manager.go index 25c856fb9..8af9747ac 100644 --- a/shared/services/state/manager.go +++ b/shared/services/state/manager.go @@ -7,7 +7,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/utils/log" diff --git a/shared/services/state/network-state.go b/shared/services/state/network-state.go index 983bb66e4..0e3bd0f8a 100644 --- a/shared/services/state/network-state.go +++ b/shared/services/state/network-state.go @@ -8,11 +8,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/utils/log" diff --git a/shared/services/state/update-checks.go b/shared/services/state/update-checks.go index 5baea60ba..8b7775d7f 100644 --- a/shared/services/state/update-checks.go +++ b/shared/services/state/update-checks.go @@ -3,8 +3,8 @@ package state import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/hashicorp/go-version" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils" ) // Check if Redstone has been deployed diff --git a/shared/services/state/utils.go b/shared/services/state/utils.go index d7bb23dd0..7b92c8e51 100644 --- a/shared/services/state/utils.go +++ b/shared/services/state/utils.go @@ -5,8 +5,8 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) // TODO: temp until rocketpool-go supports RocketStorage contract address lookups per block diff --git a/shared/services/wallet/keystore/keystore.go b/shared/services/wallet/keystore/keystore.go index b655ec7e6..123cf8353 100644 --- a/shared/services/wallet/keystore/keystore.go +++ b/shared/services/wallet/keystore/keystore.go @@ -1,7 +1,7 @@ package keystore import ( - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/sethvargo/go-password/password" eth2types "github.com/wealdtech/go-eth2-types/v2" ) diff --git a/shared/services/wallet/keystore/lighthouse/keystore.go b/shared/services/wallet/keystore/lighthouse/keystore.go index 3877f60e8..f992514ec 100644 --- a/shared/services/wallet/keystore/lighthouse/keystore.go +++ b/shared/services/wallet/keystore/lighthouse/keystore.go @@ -7,7 +7,7 @@ import ( "github.com/goccy/go-json" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2ks "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" diff --git a/shared/services/wallet/keystore/lodestar/keystore.go b/shared/services/wallet/keystore/lodestar/keystore.go index 932d10294..9290364b5 100644 --- a/shared/services/wallet/keystore/lodestar/keystore.go +++ b/shared/services/wallet/keystore/lodestar/keystore.go @@ -8,7 +8,7 @@ import ( "github.com/goccy/go-json" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2ks "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" diff --git a/shared/services/wallet/keystore/nimbus/keystore.go b/shared/services/wallet/keystore/nimbus/keystore.go index 7090dc11e..864a4576e 100644 --- a/shared/services/wallet/keystore/nimbus/keystore.go +++ b/shared/services/wallet/keystore/nimbus/keystore.go @@ -7,7 +7,7 @@ import ( "github.com/goccy/go-json" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2ks "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" diff --git a/shared/services/wallet/keystore/prysm/keystore.go b/shared/services/wallet/keystore/prysm/keystore.go index 527c07b7b..1410ea0e4 100644 --- a/shared/services/wallet/keystore/prysm/keystore.go +++ b/shared/services/wallet/keystore/prysm/keystore.go @@ -9,7 +9,7 @@ import ( "github.com/goccy/go-json" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" rpkeystore "github.com/rocket-pool/smartnode/shared/services/wallet/keystore" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2ks "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" diff --git a/shared/services/wallet/keystore/teku/keystore.go b/shared/services/wallet/keystore/teku/keystore.go index 1a138d0e8..ca1361184 100644 --- a/shared/services/wallet/keystore/teku/keystore.go +++ b/shared/services/wallet/keystore/teku/keystore.go @@ -7,7 +7,7 @@ import ( "github.com/goccy/go-json" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2ks "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" diff --git a/shared/services/wallet/validator.go b/shared/services/wallet/validator.go index b31be9dbc..b29e8ddb4 100644 --- a/shared/services/wallet/validator.go +++ b/shared/services/wallet/validator.go @@ -7,8 +7,8 @@ import ( "os" "strings" - "github.com/rocket-pool/rocketpool-go/types" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/utils/validator" eth2types "github.com/wealdtech/go-eth2-types/v2" eth2util "github.com/wealdtech/go-eth2-util" diff --git a/shared/types/api/auction.go b/shared/types/api/auction.go index 440e45d5b..8e88e7a04 100644 --- a/shared/types/api/auction.go +++ b/shared/types/api/auction.go @@ -5,8 +5,8 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/auction" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/auction" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) type AuctionStatusResponse struct { diff --git a/shared/types/api/minipool.go b/shared/types/api/minipool.go index 91a54465b..b3756db81 100644 --- a/shared/types/api/minipool.go +++ b/shared/types/api/minipool.go @@ -6,10 +6,10 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" ) diff --git a/shared/types/api/node.go b/shared/types/api/node.go index 1df1aa69a..4263b8e40 100644 --- a/shared/types/api/node.go +++ b/shared/types/api/node.go @@ -7,9 +7,9 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/tokens" - rptypes "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/tokens" + rptypes "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/rewards" "github.com/rocket-pool/smartnode/shared/utils/rp" ) diff --git a/shared/types/api/odao.go b/shared/types/api/odao.go index 9df1b6de3..68042bd87 100644 --- a/shared/types/api/odao.go +++ b/shared/types/api/odao.go @@ -4,9 +4,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - tn "github.com/rocket-pool/rocketpool-go/dao/trustednode" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao" + tn "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) type TNDAOStatusResponse struct { diff --git a/shared/types/api/pdao.go b/shared/types/api/pdao.go index 365dd6823..ccdb18b00 100644 --- a/shared/types/api/pdao.go +++ b/shared/types/api/pdao.go @@ -5,9 +5,9 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao/protocol" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) type PDAOProposalWithNodeVoteDirection struct { diff --git a/shared/types/api/queue.go b/shared/types/api/queue.go index 7cb90d670..ef71534b6 100644 --- a/shared/types/api/queue.go +++ b/shared/types/api/queue.go @@ -4,7 +4,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) type QueueStatusResponse struct { diff --git a/shared/types/api/security.go b/shared/types/api/security.go index 10595c6a5..f06f868f5 100644 --- a/shared/types/api/security.go +++ b/shared/types/api/security.go @@ -2,9 +2,9 @@ package api import ( "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/dao" - "github.com/rocket-pool/rocketpool-go/dao/security" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/dao" + "github.com/rocket-pool/smartnode/bindings/dao/security" + "github.com/rocket-pool/smartnode/bindings/rocketpool" ) type SecurityStatusResponse struct { diff --git a/shared/types/api/wallet.go b/shared/types/api/wallet.go index e27cca158..4ecd032ea 100644 --- a/shared/types/api/wallet.go +++ b/shared/types/api/wallet.go @@ -3,8 +3,8 @@ package api import ( "github.com/ethereum/go-ethereum/common" "github.com/google/uuid" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" ) // Encrypted validator keystore following the EIP-2335 standard diff --git a/shared/utils/api/utils.go b/shared/utils/api/utils.go index 1d8d62aed..0309ff2e5 100644 --- a/shared/utils/api/utils.go +++ b/shared/utils/api/utils.go @@ -9,10 +9,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/settings/protocol" - "github.com/rocket-pool/rocketpool-go/utils" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/settings/protocol" + "github.com/rocket-pool/smartnode/bindings/utils" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/utils/log" "github.com/rocket-pool/smartnode/shared/utils/math" diff --git a/shared/utils/cli/validation.go b/shared/utils/cli/validation.go index 6dbce4864..24a82cd21 100644 --- a/shared/utils/cli/validation.go +++ b/shared/utils/cli/validation.go @@ -13,7 +13,7 @@ import ( "github.com/tyler-smith/go-bip39" "github.com/urfave/cli" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/passwords" hexutils "github.com/rocket-pool/smartnode/shared/utils/hex" ) diff --git a/shared/utils/eth1/eth1.go b/shared/utils/eth1/eth1.go index 4e7799e29..50044da42 100644 --- a/shared/utils/eth1/eth1.go +++ b/shared/utils/eth1/eth1.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/urfave/cli" diff --git a/shared/utils/eth2/eth2.go b/shared/utils/eth2/eth2.go index 0d619ce8a..b9840568d 100644 --- a/shared/utils/eth2/eth2.go +++ b/shared/utils/eth2/eth2.go @@ -5,11 +5,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" - "github.com/rocket-pool/rocketpool-go/utils/eth" - rpstate "github.com/rocket-pool/rocketpool-go/utils/state" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/bindings/utils/eth" + rpstate "github.com/rocket-pool/smartnode/bindings/utils/state" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/state" rputils "github.com/rocket-pool/smartnode/shared/utils/rp" diff --git a/shared/utils/rp/fee-recipient.go b/shared/utils/rp/fee-recipient.go index 0d5d2d098..e5093c761 100644 --- a/shared/utils/rp/fee-recipient.go +++ b/shared/utils/rp/fee-recipient.go @@ -6,8 +6,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/state" "golang.org/x/sync/errgroup" diff --git a/shared/utils/rp/minipools.go b/shared/utils/rp/minipools.go index e7eb8b4b4..a6c28c1a0 100644 --- a/shared/utils/rp/minipools.go +++ b/shared/utils/rp/minipools.go @@ -5,9 +5,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "golang.org/x/sync/errgroup" "github.com/rocket-pool/smartnode/shared/services/beacon" diff --git a/shared/utils/rp/node.go b/shared/utils/rp/node.go index 7a5e4deda..353bd4823 100644 --- a/shared/utils/rp/node.go +++ b/shared/utils/rp/node.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/node" - "github.com/rocket-pool/rocketpool-go/rocketpool" - tnsettings "github.com/rocket-pool/rocketpool-go/settings/trustednode" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/node" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + tnsettings "github.com/rocket-pool/smartnode/bindings/settings/trustednode" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services/beacon" "golang.org/x/sync/errgroup" ) diff --git a/shared/utils/validator/set-withdrawal-creds.go b/shared/utils/validator/set-withdrawal-creds.go index 2b482cb91..37789b3af 100644 --- a/shared/utils/validator/set-withdrawal-creds.go +++ b/shared/utils/validator/set-withdrawal-creds.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/types/eth2" eth2types "github.com/wealdtech/go-eth2-types/v2" ) diff --git a/shared/utils/validator/voluntary-exit.go b/shared/utils/validator/voluntary-exit.go index c7123db82..110db4508 100644 --- a/shared/utils/validator/voluntary-exit.go +++ b/shared/utils/validator/voluntary-exit.go @@ -4,7 +4,7 @@ import ( "fmt" "strconv" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/types/eth2" eth2types "github.com/wealdtech/go-eth2-types/v2" ) diff --git a/shared/utils/wallet/recover-keys.go b/shared/utils/wallet/recover-keys.go index b2f80e08a..591acbd1e 100644 --- a/shared/utils/wallet/recover-keys.go +++ b/shared/utils/wallet/recover-keys.go @@ -9,9 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/goccy/go-json" - "github.com/rocket-pool/rocketpool-go/minipool" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/types" + "github.com/rocket-pool/smartnode/bindings/minipool" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/shared/services" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/wallet" diff --git a/treegen/tree-gen.go b/treegen/tree-gen.go index c0692c649..76afd1e3d 100644 --- a/treegen/tree-gen.go +++ b/treegen/tree-gen.go @@ -17,9 +17,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/fatih/color" - "github.com/rocket-pool/rocketpool-go/rewards" - "github.com/rocket-pool/rocketpool-go/rocketpool" - "github.com/rocket-pool/rocketpool-go/utils/eth" + "github.com/rocket-pool/smartnode/bindings/rewards" + "github.com/rocket-pool/smartnode/bindings/rocketpool" + "github.com/rocket-pool/smartnode/bindings/utils/eth" "github.com/rocket-pool/smartnode/shared/services/beacon" "github.com/rocket-pool/smartnode/shared/services/beacon/client" "github.com/rocket-pool/smartnode/shared/services/config" From 35dd5cb9768282bb2ee98940c43493a9279d35fe Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 11:09:35 -0400 Subject: [PATCH 871/878] Remove dependencies to rocketpool-go from existing go.mod --- rocketpool-cli/go.mod | 1 - rocketpool/go.mod | 1 - shared/go.mod | 1 - treegen/go.mod | 1 - 4 files changed, 4 deletions(-) diff --git a/rocketpool-cli/go.mod b/rocketpool-cli/go.mod index c763cdc89..59860e2bd 100644 --- a/rocketpool-cli/go.mod +++ b/rocketpool-cli/go.mod @@ -33,7 +33,6 @@ require ( github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 github.com/prysmaticlabs/prysm/v5 v5.0.3 github.com/rivo/tview v0.0.0-20230208211350-7dfff1ce7854 - github.com/rocket-pool/rocketpool-go v1.8.4-0.20250512200217-48e87a4a441b github.com/sethvargo/go-password v0.2.0 github.com/shirou/gopsutil/v3 v3.23.1 github.com/tyler-smith/go-bip39 v1.1.0 diff --git a/rocketpool/go.mod b/rocketpool/go.mod index f0222c038..36bf08709 100644 --- a/rocketpool/go.mod +++ b/rocketpool/go.mod @@ -33,7 +33,6 @@ require ( github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 github.com/prysmaticlabs/prysm/v5 v5.0.3 github.com/rivo/tview v0.0.0-20230208211350-7dfff1ce7854 - github.com/rocket-pool/rocketpool-go v1.8.4-0.20241122223132-c5f2be18f72b github.com/sethvargo/go-password v0.2.0 github.com/shirou/gopsutil/v3 v3.23.1 github.com/tyler-smith/go-bip39 v1.1.0 diff --git a/shared/go.mod b/shared/go.mod index e62298ff5..c2e5de344 100644 --- a/shared/go.mod +++ b/shared/go.mod @@ -33,7 +33,6 @@ require ( github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 github.com/prysmaticlabs/prysm/v5 v5.0.3 github.com/rivo/tview v0.0.0-20230208211350-7dfff1ce7854 - github.com/rocket-pool/rocketpool-go v1.8.4-0.20241122223132-c5f2be18f72b github.com/sethvargo/go-password v0.2.0 github.com/shirou/gopsutil/v3 v3.23.1 github.com/tyler-smith/go-bip39 v1.1.0 diff --git a/treegen/go.mod b/treegen/go.mod index d4dbdb270..65baf0bd4 100644 --- a/treegen/go.mod +++ b/treegen/go.mod @@ -7,7 +7,6 @@ require ( github.com/fatih/color v1.14.1 github.com/felixge/fgprof v0.9.5 github.com/goccy/go-json v0.10.2 - github.com/rocket-pool/rocketpool-go v1.8.4-0.20241122223132-c5f2be18f72b github.com/urfave/cli/v2 v2.26.0 ) From 03f32c6fba754141c985e01b050b3d20d81de24a Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 14:20:40 -0400 Subject: [PATCH 872/878] Update dependencies --- bindings/go.mod | 94 ++++++++++++++++--------- bindings/go.sum | 136 +++++++++++++++++++++++++++++++++++ go.work | 3 +- go.work.sum | 183 ++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 343 insertions(+), 73 deletions(-) create mode 100644 bindings/go.sum diff --git a/bindings/go.mod b/bindings/go.mod index b5c67df2f..c59bd1321 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -1,72 +1,96 @@ -module github.com/rocket-pool/rocketpool-go +module github.com/rocket-pool/smartnode/bindings go 1.21 require ( - github.com/ethereum/go-ethereum v1.10.26 + github.com/ethereum/go-ethereum v1.13.5 github.com/hashicorp/go-version v1.6.0 github.com/princjef/gomarkdoc v0.4.1 github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 - golang.org/x/sync v0.1.0 + golang.org/x/sync v0.8.0 ) require ( - github.com/Microsoft/go-winio v0.5.0 // indirect - github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/VividCortex/ewma v1.2.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/bits-and-blooms/bitset v1.11.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cespare/cp v1.1.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cheggaaa/pb/v3 v3.0.8 // indirect - github.com/deckarep/golang-set v1.8.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/deckarep/golang-set/v2 v2.5.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/emirpasic/gods v1.12.0 // indirect - github.com/fatih/color v1.11.0 // indirect - github.com/ferranbt/fastssz v0.1.2 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/fatih/color v1.14.1 // indirect + github.com/ferranbt/fastssz v0.1.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/getsentry/sentry-go v0.25.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/go-git/go-git/v5 v5.3.0 // indirect - github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect - github.com/google/go-cmp v0.5.7 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect + github.com/golang/glog v1.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.1.0 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.12 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/nxadm/tail v1.4.8 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.30.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/princjef/mageutil v1.0.0 // indirect + github.com/prometheus/client_golang v1.20.0 // indirect github.com/protolambda/zssz v0.1.5 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rjeczalik/notify v0.9.1 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rs/cors v1.8.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/tklauser/go-sysconf v0.3.5 // indirect - github.com/tklauser/numcpus v0.2.2 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect + github.com/urfave/cli/v2 v2.26.0 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.3.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/term v0.23.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.24.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect mvdan.cc/xurls/v2 v2.2.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/bindings/go.sum b/bindings/go.sum new file mode 100644 index 000000000..705f1c10a --- /dev/null +++ b/bindings/go.sum @@ -0,0 +1,136 @@ +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/bits-and-blooms/bitset v1.11.0 h1:RMyy2mBBShArUAhfVRZJ2xyBO58KCBCtZFShw3umo6k= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= +github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3PquxglBM= +github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= +github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10 h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg= +github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI= +github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= diff --git a/go.work b/go.work index a928ef83e..8f8246b7c 100644 --- a/go.work +++ b/go.work @@ -2,6 +2,7 @@ go 1.21.8 use ( ./addons + ./bindings ./rocketpool ./rocketpool-cli ./shared @@ -12,4 +13,4 @@ replace github.com/wealdtech/go-merkletree v1.0.1-0.20190605192610-2bb163c2ea2a replace github.com/rocket-pool/smartnode => ./ -// replace github.com/rocket-pool/rocketpool-go => ../rocketpool-go \ No newline at end of file +replace github.com/rocket-pool/rocketpool-go => ./ diff --git a/go.work.sum b/go.work.sum index d77b52b9d..01b7ad945 100644 --- a/go.work.sum +++ b/go.work.sum @@ -85,6 +85,7 @@ cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/ cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/contactcenterinsights v1.6.0 h1:jXIpfcH/VYSE1SYcPzO0n1VVb+sAamiLOgCw45JbOQk= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -315,15 +316,17 @@ github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240209103030-ec53fa766bf8 h1:BwEuC3xavrv4HTUDH2fUrKgKooiH3Q/nSVnFGtnzpN0= github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240209103030-ec53fa766bf8/go.mod h1:L1QpLBqXlboJMOC2hndG95d1eiElzKsBhjzcuy8pxeM= @@ -332,18 +335,16 @@ github.com/MariusVanDerWijden/tx-fuzz v1.3.3-0.20240227085032-f70dd7c85c97/go.mo github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= @@ -361,8 +362,10 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAu github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= @@ -401,6 +404,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwF github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= @@ -456,7 +460,6 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -467,16 +470,20 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/cheggaaa/pb v2.0.7+incompatible h1:gLKifR1UkZ/kLkda5gC0K6c8g+jU2sINPtBeOiNlMhU= github.com/cheggaaa/pb v2.0.7+incompatible/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= -github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= @@ -485,6 +492,7 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -503,24 +511,21 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= @@ -557,7 +562,6 @@ github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= @@ -567,7 +571,6 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA= github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= @@ -583,6 +586,8 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= +github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -610,6 +615,7 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= @@ -631,7 +637,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk= @@ -644,6 +649,7 @@ github.com/fatih/color v1.11.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY= github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= @@ -653,10 +659,11 @@ github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16M github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -676,7 +683,6 @@ github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgx github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= @@ -687,14 +693,15 @@ github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5 github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/glendc/go-external-ip v0.1.0 h1:iX3xQ2Q26atAmLTbd++nUce2P5ht5P4uD4V7caSY/xg= github.com/glendc/go-external-ip v0.1.0/go.mod h1:CNx312s2FLAJoWNdJWZ2Fpf5O4oLsMFwuYviHjS4uJE= @@ -702,6 +709,7 @@ github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= @@ -735,11 +743,11 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= @@ -786,28 +794,31 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4 github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c h1:HoqgYR60VYu5+0BuG6pjeGp7LKEPZnHt+dUClx9PeIs= github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c/go.mod h1:sam69Hju0uq+5uvLJUMDlsKlQ21Vrs1Kd/1YFPNYdOU= @@ -852,7 +863,6 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= @@ -932,6 +942,7 @@ github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5i github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -963,7 +974,6 @@ github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJ github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -982,13 +992,12 @@ github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuW github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/goevmlab v0.0.0-20231201084119-c73b3c97929c h1:J973NLskKmFIj3EGfpQ1ztUQKdwyJ+fG34638ief0eA= github.com/holiman/goevmlab v0.0.0-20231201084119-c73b3c97929c/go.mod h1:K6KFgcQq1U9ksldcRyLYcwtj4nUTPn4rEaZtX4Gjofc= @@ -997,9 +1006,9 @@ github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/cgosymbolizer v0.0.0-20200424224625-be1b05b0b279 h1:IpTHAzWv1pKDDWeJDY5VOHvqc2T9d3C8cPKEf2VPqHE= @@ -1009,6 +1018,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weK github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -1106,8 +1116,8 @@ github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3 github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= @@ -1124,6 +1134,7 @@ github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1n github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -1161,17 +1172,23 @@ github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1 github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= github.com/kataras/neffos v0.0.21/go.mod h1:FeGka8lu8cjD2H+0OpBvW8c6xXawy3fj5VX6xcIJ1Fg= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= @@ -1205,6 +1222,7 @@ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuV github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -1213,24 +1231,23 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= +github.com/labstack/echo/v4 v4.10.0 h1:5CiyngihEO4HXsz3vVsJn7f8xAlWwRr3aY6Ih280ZKA= github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= @@ -1284,7 +1301,9 @@ github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+L github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1338,6 +1357,7 @@ github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= @@ -1368,7 +1388,6 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= @@ -1444,11 +1463,9 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1456,7 +1473,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= @@ -1468,7 +1484,6 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1479,6 +1494,7 @@ github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= @@ -1489,7 +1505,9 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhM github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.1 h1:a6qW1EVNZWH9WGI6CsYdD8WAylkoXBS5yv0XHlh17Tc= github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= @@ -1497,14 +1515,15 @@ github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssy github.com/peterh/liner v1.2.0 h1:w/UPXyl5GfahFxcTOz2j9wCIHNI+pUPr2laqpojKNCg= github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1515,7 +1534,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/princjef/gomarkdoc v0.4.1 h1:Ubt5OiHYi2PdxrDkWMeWM4ROrbvAGkIXBz3PquxglBM= github.com/princjef/gomarkdoc v0.4.1/go.mod h1:+o04FW4GNL2vPr/35yxMV/8eXjhsdNBBPMVVDOOTLec= -github.com/princjef/mageutil v1.0.0 h1:1OfZcJUMsooPqieOz2ooLjI+uHUo618pdaJsbCXcFjQ= github.com/princjef/mageutil v1.0.0/go.mod h1:mkShhaUomCYfAoVvTKRcbAs8YSVPdtezI5j6K+VXhrs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -1607,6 +1625,7 @@ github.com/rocket-pool/go-merkletree v1.0.1-0.20220406020931-c262d9b976dd/go.mod github.com/rocket-pool/rocketpool-go v1.8.4-0.20241122223132-c5f2be18f72b/go.mod h1:f2TVsMOYmCwaJOhshG2zRoX89PZmvCkCD7UYJ9waRkI= github.com/rocket-pool/rocketpool-go v1.8.4-0.20250512200217-48e87a4a441b h1:T6h7a9JyhL+kfQDUKsWphwR7PJizthWxpZzpjN8SGCo= github.com/rocket-pool/rocketpool-go v1.8.4-0.20250512200217-48e87a4a441b/go.mod h1:f2TVsMOYmCwaJOhshG2zRoX89PZmvCkCD7UYJ9waRkI= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -1623,21 +1642,27 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samber/lo v1.36.0 h1:4LaOxH1mHnbDGhTVE0i1z8v/lWaQW8AIfOD3HU4mSaw= github.com/samber/lo v1.36.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI= github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz7z/4= github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -1648,29 +1673,38 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1685,12 +1719,15 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= @@ -1705,14 +1742,18 @@ github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ= github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1721,21 +1762,30 @@ github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI= github.com/urfave/cli/v2 v2.26.0/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4= github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= github.com/warpfork/go-testmark v0.11.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= @@ -1748,32 +1798,45 @@ github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7Qqi github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.3.0 h1:3Kx2QvKU/4PP0d7+e3+q9G+QiXQprNQPeAXsWOcfKRI= github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.3.0/go.mod h1:qqIU42c9sXcNYsiEjUQoOOWYZfZDL1zmyLtz3t+wN2s= +github.com/wealdtech/go-eth2-wallet-types/v2 v2.9.0 h1:XqWgsONVqsPvciuEXxM/QU4hYouBVk0+5/pGqDMGUHQ= github.com/wealdtech/go-eth2-wallet-types/v2 v2.9.0/go.mod h1:7Ad2xp27vOQRQWQsIeHBdU/YiyEt6klBeh5gwnNnlwE= github.com/wealdtech/go-multicodec v1.4.0 h1:iq5PgxwssxnXGGPTIK1srvt6U5bJwIp7k6kBrudIWxg= github.com/wealdtech/go-multicodec v1.4.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4= +github.com/wealdtech/go-string2eth v1.1.0 h1:USJQmysUrBYYmZs7d45pMb90hRSyEwizP7lZaOZLDAw= github.com/wealdtech/go-string2eth v1.1.0/go.mod h1:RUzsLjJtbZaJ/3UKn9kY19a/vCCUHtEWoUW3uiK6yGU= +github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -1784,10 +1847,13 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= @@ -1798,6 +1864,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= @@ -1807,6 +1874,7 @@ go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+p go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= @@ -1818,16 +1886,22 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= @@ -1879,8 +1953,10 @@ golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5C golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ= golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1892,9 +1968,11 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= @@ -1997,6 +2075,7 @@ golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4 golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2133,6 +2212,7 @@ golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2265,6 +2345,7 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.45.0 h1:pqMffJFLBVUDIoYsHcqtxgQVTsmxMDpYLOc5MT4Jrww= google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= @@ -2275,6 +2356,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2364,6 +2446,7 @@ google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3 google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0 h1:lQ+dE99pFsb8osbJB3oRfE5eW4Hx6a/lZQr8Jh+eoT4= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2389,6 +2472,7 @@ google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/VividCortex/ewma.v1 v1.1.1 h1:tWHEKkKq802K/JT9RiqGCBU5fW3raAPnJGTE9ostZvg= gopkg.in/VividCortex/ewma.v1 v1.1.1/go.mod h1:TekXuFipeiHWiAlO1+wSS23vTcyFau5u3rxXUSXj710= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2397,22 +2481,34 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v2 v2.0.7 h1:beaAg8eacCdMQS9Y7obFEtkY7gQl0uZ6Zayb3ry41VY= gopkg.in/cheggaaa/pb.v2 v2.0.7/go.mod h1:0CiZ1p8pvtxBlQpLXkHuUTpdJ1shm3OqCF1QugkjHL4= +gopkg.in/d4l3k/messagediff.v1 v1.2.1 h1:70AthpjunwzUiarMHyED52mj9UwtAnE89l1Gmrt3EU0= gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fatih/color.v1 v1.7.0 h1:bYGjb+HezBM6j/QmgBfgm1adxHpzzrss6bj4r9ROppk= gopkg.in/fatih/color.v1 v1.7.0/go.mod h1:P7yosIhqIl/sX8J8UypY5M+dDpD2KmyfP5IRs5v/fo0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mattn/go-colorable.v0 v0.1.0 h1:WYuADWvfvYC07fm8ygYB3LMcsc5CunpxfMGKawHkAos= gopkg.in/mattn/go-colorable.v0 v0.1.0/go.mod h1:BVJlBXzARQxdi3nZo6f6bnl5yR20/tOL6p+V0KejgSY= +gopkg.in/mattn/go-isatty.v0 v0.0.4 h1:NtS1rQGQr4IaFWBGz4Cz4BhB///gyys4gDVtKA7hIsc= gopkg.in/mattn/go-isatty.v0 v0.0.4/go.mod h1:wt691ab7g0X4ilKZNmMII3egK0bTxl37fEn/Fwbd8gc= +gopkg.in/mattn/go-runewidth.v0 v0.0.4 h1:r0P71TnzQDlNIcizCqvPSSANoFa3WVGtcNJf3TWurcY= gopkg.in/mattn/go-runewidth.v0 v0.0.4/go.mod h1:BmXejnxvhwdaATwiJbB1vZ2dtXkQKZGu9yLFCZb4msQ= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2427,6 +2523,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2435,22 +2532,34 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.5.0-0.dev.0.20231205170804-aef76f4feee2 h1:VUeHARd+9362HPYyFWjsRa6jBIAf2xWbDv6QXMRztbQ= honnef.co/go/tools v0.5.0-0.dev.0.20231205170804-aef76f4feee2/go.mod h1:J8YyqAvNy0yWpeKUOCONA1m2G4hH2CqUSo/5ZO2/5UA= +k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= +k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 2dce5298d12a9bbc4545504c83f864797a2d5176 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 14:20:50 -0400 Subject: [PATCH 873/878] Update build --- docker/rocketpool-dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/rocketpool-dockerfile b/docker/rocketpool-dockerfile index 263e83151..b547756a1 100644 --- a/docker/rocketpool-dockerfile +++ b/docker/rocketpool-dockerfile @@ -13,6 +13,7 @@ RUN apt update && apt install -y \ COPY ./go.work /src/go.work COPY ./go.work.sum /src/go.work.sum COPY ./addons/go.mod /src/addons/go.mod +COPY ./bindings/go.mod /src/bindings/go.mod COPY ./rocketpool/go.mod /src/rocketpool/go.mod COPY ./rocketpool-cli/go.mod /src/rocketpool-cli/go.mod COPY ./shared/go.mod /src/shared/go.mod @@ -28,6 +29,7 @@ ARG VERSION COPY ./go.work /src/go.work COPY ./go.work.sum /src/go.work.sum COPY ./addons/ /src/addons/ +COPY ./bindings/ /src/bindings/ COPY ./rocketpool/ /src/rocketpool/ COPY ./rocketpool-cli/ /src/rocketpool-cli/ COPY ./shared/ /src/shared/ From 046e17e2c6013497855541a0e2765920f0a83ed1 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 14:47:12 -0400 Subject: [PATCH 874/878] Move everything into bindings directory to prepare for monorepo transition --- .gitignore | 3 --- LICENSE => bindings/LICENSE | 0 README.md => bindings/README.md | 0 {auction => bindings/auction}/auction.go | 0 azure-pipelines.yml => bindings/azure-pipelines.yml | 0 {contracts => bindings/contracts}/rocket-storage.go | 0 {dao => bindings/dao}/claim.go | 0 {dao => bindings/dao}/proposal-payload.go | 0 {dao => bindings/dao}/proposals.go | 0 {dao => bindings/dao}/protocol/dao.go | 0 {dao => bindings/dao}/protocol/proposal.go | 0 {dao => bindings/dao}/protocol/proposals.go | 0 {dao => bindings/dao}/protocol/verify.go | 0 {dao => bindings/dao}/security/actions.go | 0 {dao => bindings/dao}/security/proposals.go | 0 {dao => bindings/dao}/security/security.go | 0 {dao => bindings/dao}/trustednode/actions.go | 0 {dao => bindings/dao}/trustednode/dao.go | 0 {dao => bindings/dao}/trustednode/proposals.go | 0 {deposit => bindings/deposit}/deposit-pool.go | 0 {deposit => bindings/deposit}/deposit.go | 0 {docs => bindings/docs}/docgen.go | 0 go.mod => bindings/go.mod | 0 go.sum => bindings/go.sum | 0 {legacy => bindings/legacy}/v1.0.0/minipool/minipool.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/node.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/rewards.go | 0 {legacy => bindings/legacy}/v1.0.0/rewards/trusted-node.go | 0 {legacy => bindings/legacy}/v1.0.0/utils/address_generation.go | 0 {legacy => bindings/legacy}/v1.1.0-rc1/rewards/rewards.go | 0 {legacy => bindings/legacy}/v1.1.0/minipool/factory.go | 0 {legacy => bindings/legacy}/v1.1.0/minipool/queue.go | 0 {legacy => bindings/legacy}/v1.1.0/network/prices.go | 0 {legacy => bindings/legacy}/v1.1.0/node/deposit.go | 0 {legacy => bindings/legacy}/v1.1.0/node/staking.go | 0 {legacy => bindings/legacy}/v1.1.0/utils/address_generation.go | 0 {legacy => bindings/legacy}/v1.2.0/network/balances.go | 0 {legacy => bindings/legacy}/v1.2.0/network/prices.go | 0 {legacy => bindings/legacy}/v1.3.1/node/deposit.go | 0 {megapool => bindings/megapool}/beacon-state-verifier.go | 0 {megapool => bindings/megapool}/factory.go | 0 {megapool => bindings/megapool}/megapool-contract.go | 0 {megapool => bindings/megapool}/megapool-interface.go | 0 {megapool => bindings/megapool}/megapool-manager.go | 0 {megapool => bindings/megapool}/megapool-penalties.go | 0 {megapool => bindings/megapool}/megapool-proxy.go | 0 {minipool => bindings/minipool}/bond-reducer.go | 0 {minipool => bindings/minipool}/factory.go | 0 {minipool => bindings/minipool}/minipool-constructor.go | 0 {minipool => bindings/minipool}/minipool-contract-v2.go | 0 {minipool => bindings/minipool}/minipool-contract-v3.go | 0 {minipool => bindings/minipool}/minipool-interface.go | 0 {minipool => bindings/minipool}/minipool.go | 0 {minipool => bindings/minipool}/queue.go | 0 {minipool => bindings/minipool}/status.go | 0 {network => bindings/network}/balances.go | 0 {network => bindings/network}/fees.go | 0 {network => bindings/network}/penalties.go | 0 {network => bindings/network}/prices.go | 0 {network => bindings/network}/revenues.go | 0 {network => bindings/network}/voting.go | 0 {node => bindings/node}/deposit.go | 0 {node => bindings/node}/distributor.go | 0 {node => bindings/node}/node.go | 0 {node => bindings/node}/staking.go | 0 {rewards => bindings/rewards}/distributor-mainnet.go | 0 {rewards => bindings/rewards}/rewards.go | 0 {rocketpool => bindings/rocketpool}/abi.go | 0 {rocketpool => bindings/rocketpool}/contract.go | 0 {rocketpool => bindings/rocketpool}/ec-interface.go | 0 {rocketpool => bindings/rocketpool}/rewards.go | 0 {rocketpool => bindings/rocketpool}/rocketpool.go | 0 {rocketpool => bindings/rocketpool}/v1.0.0-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.1.0-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.1.0-rc1-manager.go | 0 {rocketpool => bindings/rocketpool}/v1.2.0-manager.go | 0 {rocketpool => bindings/rocketpool}/version-interface.go | 0 {rocketpool => bindings/rocketpool}/version-manager.go | 0 {settings => bindings/settings}/protocol/auction.go | 0 {settings => bindings/settings}/protocol/deposit.go | 0 {settings => bindings/settings}/protocol/inflation.go | 0 {settings => bindings/settings}/protocol/megapool.go | 0 {settings => bindings/settings}/protocol/minipool.go | 0 {settings => bindings/settings}/protocol/network.go | 0 {settings => bindings/settings}/protocol/node.go | 0 {settings => bindings/settings}/protocol/proposals.go | 0 {settings => bindings/settings}/protocol/rewards.go | 0 {settings => bindings/settings}/protocol/security.go | 0 {settings => bindings/settings}/security/auction.go | 0 {settings => bindings/settings}/security/deposit.go | 0 {settings => bindings/settings}/security/minipool.go | 0 {settings => bindings/settings}/security/network.go | 0 {settings => bindings/settings}/security/node.go | 0 {settings => bindings/settings}/trustednode/members.go | 0 {settings => bindings/settings}/trustednode/minipool.go | 0 {settings => bindings/settings}/trustednode/proposals.go | 0 {settings => bindings/settings}/trustednode/rewards.go | 0 {storage => bindings/storage}/address-queue-storage.go | 0 {storage => bindings/storage}/linked-list-storage.go | 0 {storage => bindings/storage}/rocket-storage.go | 0 test.sh => bindings/test.sh | 0 {tests => bindings/tests}/auction/auction_test.go | 0 {tests => bindings/tests}/auction/main_test.go | 0 {tests => bindings/tests}/config.go | 0 {tests => bindings/tests}/dao/main_test.go | 0 {tests => bindings/tests}/dao/proposals_test.go | 0 {tests => bindings/tests}/dao/trustednode/dao_test.go | 0 {tests => bindings/tests}/dao/trustednode/main_test.go | 0 {tests => bindings/tests}/dao/trustednode/proposals_test.go | 0 {tests => bindings/tests}/deposit/deposit_test.go | 0 {tests => bindings/tests}/deposit/main_test.go | 0 {tests => bindings/tests}/minipool/contract_test.go | 0 {tests => bindings/tests}/minipool/main_test.go | 0 {tests => bindings/tests}/minipool/minipool_test.go | 0 {tests => bindings/tests}/minipool/queue_test.go | 0 {tests => bindings/tests}/minipool/status_test.go | 0 {tests => bindings/tests}/network/balances_test.go | 0 {tests => bindings/tests}/network/fees_test.go | 0 {tests => bindings/tests}/network/main_test.go | 0 {tests => bindings/tests}/network/prices_test.go | 0 {tests => bindings/tests}/node/deposit_test.go | 0 {tests => bindings/tests}/node/distributor_test.go | 0 {tests => bindings/tests}/node/main_test.go | 0 {tests => bindings/tests}/node/node_test.go | 0 {tests => bindings/tests}/node/staking_test.go | 0 {tests => bindings/tests}/rewards/main_test.go | 0 {tests => bindings/tests}/rewards/node_test.go | 0 {tests => bindings/tests}/rewards/trusted_node_test.go | 0 {tests => bindings/tests}/rocketpool/main_test.go | 0 {tests => bindings/tests}/rocketpool/rocketpool_test.go | 0 {tests => bindings/tests}/settings/protocol/auction_test.go | 0 {tests => bindings/tests}/settings/protocol/deposit_test.go | 0 {tests => bindings/tests}/settings/protocol/inflation_test.go | 0 {tests => bindings/tests}/settings/protocol/main_test.go | 0 {tests => bindings/tests}/settings/protocol/minipool_test.go | 0 {tests => bindings/tests}/settings/protocol/network_test.go | 0 {tests => bindings/tests}/settings/protocol/node_test.go | 0 {tests => bindings/tests}/settings/protocol/rewards_test.go | 0 {tests => bindings/tests}/settings/trustednode/main_test.go | 0 {tests => bindings/tests}/settings/trustednode/members_test.go | 0 .../tests}/settings/trustednode/proposals_test.go | 0 {tests => bindings/tests}/testutils/accounts/accounts.go | 0 {tests => bindings/tests}/testutils/auction/auction.go | 0 {tests => bindings/tests}/testutils/dao/proposals.go | 0 {tests => bindings/tests}/testutils/evm/mining.go | 0 {tests => bindings/tests}/testutils/evm/snapshots.go | 0 {tests => bindings/tests}/testutils/minipool/minipool.go | 0 {tests => bindings/tests}/testutils/node/deposit.go | 0 {tests => bindings/tests}/testutils/node/node.go | 0 {tests => bindings/tests}/testutils/node/staking.go | 0 {tests => bindings/tests}/testutils/tokens/reth/reth.go | 0 {tests => bindings/tests}/testutils/tokens/rpl/rpl.go | 0 {tests => bindings/tests}/testutils/validator/deposit-data.go | 0 {tests => bindings/tests}/tokens/main_test.go | 0 {tests => bindings/tests}/tokens/reth_test.go | 0 {tests => bindings/tests}/tokens/rpl_fixed_test.go | 0 {tests => bindings/tests}/tokens/rpl_test.go | 0 {tests => bindings/tests}/tokens/tokens_test.go | 0 {tests => bindings/tests}/utils/eth/transactions_test.go | 0 {tests => bindings/tests}/utils/eth/units_test.go | 0 {tests => bindings/tests}/utils/stage4_bootstrap.go | 0 {tokens => bindings/tokens}/reth.go | 0 {tokens => bindings/tokens}/rpl-fixed.go | 0 {tokens => bindings/tokens}/rpl.go | 0 {tokens => bindings/tokens}/tokens.go | 0 {types => bindings/types}/beacon.go | 0 {types => bindings/types}/dao.go | 0 {types => bindings/types}/minipool.go | 0 {utils => bindings/utils}/address_generation.go | 0 {utils => bindings/utils}/deposit_retrieval.go | 0 {utils => bindings/utils}/eth/erc20.go | 0 {utils => bindings/utils}/eth/logs.go | 0 {utils => bindings/utils}/eth/transactions.go | 0 {utils => bindings/utils}/eth/units.go | 0 {utils => bindings/utils}/json/json.go | 0 {utils => bindings/utils}/multicall/abi.go | 0 {utils => bindings/utils}/multicall/balances.go | 0 {utils => bindings/utils}/multicall/multicaller.go | 0 {utils => bindings/utils}/state/common.go | 0 {utils => bindings/utils}/state/contracts.go | 0 {utils => bindings/utils}/state/megapool.go | 0 {utils => bindings/utils}/state/minipool.go | 0 {utils => bindings/utils}/state/network.go | 0 {utils => bindings/utils}/state/node.go | 0 {utils => bindings/utils}/state/odao.go | 0 {utils => bindings/utils}/state/pdao.go | 0 {utils => bindings/utils}/strings/sanitize.go | 0 {utils => bindings/utils}/version-checker.go | 0 {utils => bindings/utils}/wait.go | 0 189 files changed, 3 deletions(-) delete mode 100644 .gitignore rename LICENSE => bindings/LICENSE (100%) rename README.md => bindings/README.md (100%) rename {auction => bindings/auction}/auction.go (100%) rename azure-pipelines.yml => bindings/azure-pipelines.yml (100%) rename {contracts => bindings/contracts}/rocket-storage.go (100%) rename {dao => bindings/dao}/claim.go (100%) rename {dao => bindings/dao}/proposal-payload.go (100%) rename {dao => bindings/dao}/proposals.go (100%) rename {dao => bindings/dao}/protocol/dao.go (100%) rename {dao => bindings/dao}/protocol/proposal.go (100%) rename {dao => bindings/dao}/protocol/proposals.go (100%) rename {dao => bindings/dao}/protocol/verify.go (100%) rename {dao => bindings/dao}/security/actions.go (100%) rename {dao => bindings/dao}/security/proposals.go (100%) rename {dao => bindings/dao}/security/security.go (100%) rename {dao => bindings/dao}/trustednode/actions.go (100%) rename {dao => bindings/dao}/trustednode/dao.go (100%) rename {dao => bindings/dao}/trustednode/proposals.go (100%) rename {deposit => bindings/deposit}/deposit-pool.go (100%) rename {deposit => bindings/deposit}/deposit.go (100%) rename {docs => bindings/docs}/docgen.go (100%) rename go.mod => bindings/go.mod (100%) rename go.sum => bindings/go.sum (100%) rename {legacy => bindings/legacy}/v1.0.0/minipool/minipool.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/node.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/rewards.go (100%) rename {legacy => bindings/legacy}/v1.0.0/rewards/trusted-node.go (100%) rename {legacy => bindings/legacy}/v1.0.0/utils/address_generation.go (100%) rename {legacy => bindings/legacy}/v1.1.0-rc1/rewards/rewards.go (100%) rename {legacy => bindings/legacy}/v1.1.0/minipool/factory.go (100%) rename {legacy => bindings/legacy}/v1.1.0/minipool/queue.go (100%) rename {legacy => bindings/legacy}/v1.1.0/network/prices.go (100%) rename {legacy => bindings/legacy}/v1.1.0/node/deposit.go (100%) rename {legacy => bindings/legacy}/v1.1.0/node/staking.go (100%) rename {legacy => bindings/legacy}/v1.1.0/utils/address_generation.go (100%) rename {legacy => bindings/legacy}/v1.2.0/network/balances.go (100%) rename {legacy => bindings/legacy}/v1.2.0/network/prices.go (100%) rename {legacy => bindings/legacy}/v1.3.1/node/deposit.go (100%) rename {megapool => bindings/megapool}/beacon-state-verifier.go (100%) rename {megapool => bindings/megapool}/factory.go (100%) rename {megapool => bindings/megapool}/megapool-contract.go (100%) rename {megapool => bindings/megapool}/megapool-interface.go (100%) rename {megapool => bindings/megapool}/megapool-manager.go (100%) rename {megapool => bindings/megapool}/megapool-penalties.go (100%) rename {megapool => bindings/megapool}/megapool-proxy.go (100%) rename {minipool => bindings/minipool}/bond-reducer.go (100%) rename {minipool => bindings/minipool}/factory.go (100%) rename {minipool => bindings/minipool}/minipool-constructor.go (100%) rename {minipool => bindings/minipool}/minipool-contract-v2.go (100%) rename {minipool => bindings/minipool}/minipool-contract-v3.go (100%) rename {minipool => bindings/minipool}/minipool-interface.go (100%) rename {minipool => bindings/minipool}/minipool.go (100%) rename {minipool => bindings/minipool}/queue.go (100%) rename {minipool => bindings/minipool}/status.go (100%) rename {network => bindings/network}/balances.go (100%) rename {network => bindings/network}/fees.go (100%) rename {network => bindings/network}/penalties.go (100%) rename {network => bindings/network}/prices.go (100%) rename {network => bindings/network}/revenues.go (100%) rename {network => bindings/network}/voting.go (100%) rename {node => bindings/node}/deposit.go (100%) rename {node => bindings/node}/distributor.go (100%) rename {node => bindings/node}/node.go (100%) rename {node => bindings/node}/staking.go (100%) rename {rewards => bindings/rewards}/distributor-mainnet.go (100%) rename {rewards => bindings/rewards}/rewards.go (100%) rename {rocketpool => bindings/rocketpool}/abi.go (100%) rename {rocketpool => bindings/rocketpool}/contract.go (100%) rename {rocketpool => bindings/rocketpool}/ec-interface.go (100%) rename {rocketpool => bindings/rocketpool}/rewards.go (100%) rename {rocketpool => bindings/rocketpool}/rocketpool.go (100%) rename {rocketpool => bindings/rocketpool}/v1.0.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.1.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.1.0-rc1-manager.go (100%) rename {rocketpool => bindings/rocketpool}/v1.2.0-manager.go (100%) rename {rocketpool => bindings/rocketpool}/version-interface.go (100%) rename {rocketpool => bindings/rocketpool}/version-manager.go (100%) rename {settings => bindings/settings}/protocol/auction.go (100%) rename {settings => bindings/settings}/protocol/deposit.go (100%) rename {settings => bindings/settings}/protocol/inflation.go (100%) rename {settings => bindings/settings}/protocol/megapool.go (100%) rename {settings => bindings/settings}/protocol/minipool.go (100%) rename {settings => bindings/settings}/protocol/network.go (100%) rename {settings => bindings/settings}/protocol/node.go (100%) rename {settings => bindings/settings}/protocol/proposals.go (100%) rename {settings => bindings/settings}/protocol/rewards.go (100%) rename {settings => bindings/settings}/protocol/security.go (100%) rename {settings => bindings/settings}/security/auction.go (100%) rename {settings => bindings/settings}/security/deposit.go (100%) rename {settings => bindings/settings}/security/minipool.go (100%) rename {settings => bindings/settings}/security/network.go (100%) rename {settings => bindings/settings}/security/node.go (100%) rename {settings => bindings/settings}/trustednode/members.go (100%) rename {settings => bindings/settings}/trustednode/minipool.go (100%) rename {settings => bindings/settings}/trustednode/proposals.go (100%) rename {settings => bindings/settings}/trustednode/rewards.go (100%) rename {storage => bindings/storage}/address-queue-storage.go (100%) rename {storage => bindings/storage}/linked-list-storage.go (100%) rename {storage => bindings/storage}/rocket-storage.go (100%) rename test.sh => bindings/test.sh (100%) rename {tests => bindings/tests}/auction/auction_test.go (100%) rename {tests => bindings/tests}/auction/main_test.go (100%) rename {tests => bindings/tests}/config.go (100%) rename {tests => bindings/tests}/dao/main_test.go (100%) rename {tests => bindings/tests}/dao/proposals_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/dao_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/main_test.go (100%) rename {tests => bindings/tests}/dao/trustednode/proposals_test.go (100%) rename {tests => bindings/tests}/deposit/deposit_test.go (100%) rename {tests => bindings/tests}/deposit/main_test.go (100%) rename {tests => bindings/tests}/minipool/contract_test.go (100%) rename {tests => bindings/tests}/minipool/main_test.go (100%) rename {tests => bindings/tests}/minipool/minipool_test.go (100%) rename {tests => bindings/tests}/minipool/queue_test.go (100%) rename {tests => bindings/tests}/minipool/status_test.go (100%) rename {tests => bindings/tests}/network/balances_test.go (100%) rename {tests => bindings/tests}/network/fees_test.go (100%) rename {tests => bindings/tests}/network/main_test.go (100%) rename {tests => bindings/tests}/network/prices_test.go (100%) rename {tests => bindings/tests}/node/deposit_test.go (100%) rename {tests => bindings/tests}/node/distributor_test.go (100%) rename {tests => bindings/tests}/node/main_test.go (100%) rename {tests => bindings/tests}/node/node_test.go (100%) rename {tests => bindings/tests}/node/staking_test.go (100%) rename {tests => bindings/tests}/rewards/main_test.go (100%) rename {tests => bindings/tests}/rewards/node_test.go (100%) rename {tests => bindings/tests}/rewards/trusted_node_test.go (100%) rename {tests => bindings/tests}/rocketpool/main_test.go (100%) rename {tests => bindings/tests}/rocketpool/rocketpool_test.go (100%) rename {tests => bindings/tests}/settings/protocol/auction_test.go (100%) rename {tests => bindings/tests}/settings/protocol/deposit_test.go (100%) rename {tests => bindings/tests}/settings/protocol/inflation_test.go (100%) rename {tests => bindings/tests}/settings/protocol/main_test.go (100%) rename {tests => bindings/tests}/settings/protocol/minipool_test.go (100%) rename {tests => bindings/tests}/settings/protocol/network_test.go (100%) rename {tests => bindings/tests}/settings/protocol/node_test.go (100%) rename {tests => bindings/tests}/settings/protocol/rewards_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/main_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/members_test.go (100%) rename {tests => bindings/tests}/settings/trustednode/proposals_test.go (100%) rename {tests => bindings/tests}/testutils/accounts/accounts.go (100%) rename {tests => bindings/tests}/testutils/auction/auction.go (100%) rename {tests => bindings/tests}/testutils/dao/proposals.go (100%) rename {tests => bindings/tests}/testutils/evm/mining.go (100%) rename {tests => bindings/tests}/testutils/evm/snapshots.go (100%) rename {tests => bindings/tests}/testutils/minipool/minipool.go (100%) rename {tests => bindings/tests}/testutils/node/deposit.go (100%) rename {tests => bindings/tests}/testutils/node/node.go (100%) rename {tests => bindings/tests}/testutils/node/staking.go (100%) rename {tests => bindings/tests}/testutils/tokens/reth/reth.go (100%) rename {tests => bindings/tests}/testutils/tokens/rpl/rpl.go (100%) rename {tests => bindings/tests}/testutils/validator/deposit-data.go (100%) rename {tests => bindings/tests}/tokens/main_test.go (100%) rename {tests => bindings/tests}/tokens/reth_test.go (100%) rename {tests => bindings/tests}/tokens/rpl_fixed_test.go (100%) rename {tests => bindings/tests}/tokens/rpl_test.go (100%) rename {tests => bindings/tests}/tokens/tokens_test.go (100%) rename {tests => bindings/tests}/utils/eth/transactions_test.go (100%) rename {tests => bindings/tests}/utils/eth/units_test.go (100%) rename {tests => bindings/tests}/utils/stage4_bootstrap.go (100%) rename {tokens => bindings/tokens}/reth.go (100%) rename {tokens => bindings/tokens}/rpl-fixed.go (100%) rename {tokens => bindings/tokens}/rpl.go (100%) rename {tokens => bindings/tokens}/tokens.go (100%) rename {types => bindings/types}/beacon.go (100%) rename {types => bindings/types}/dao.go (100%) rename {types => bindings/types}/minipool.go (100%) rename {utils => bindings/utils}/address_generation.go (100%) rename {utils => bindings/utils}/deposit_retrieval.go (100%) rename {utils => bindings/utils}/eth/erc20.go (100%) rename {utils => bindings/utils}/eth/logs.go (100%) rename {utils => bindings/utils}/eth/transactions.go (100%) rename {utils => bindings/utils}/eth/units.go (100%) rename {utils => bindings/utils}/json/json.go (100%) rename {utils => bindings/utils}/multicall/abi.go (100%) rename {utils => bindings/utils}/multicall/balances.go (100%) rename {utils => bindings/utils}/multicall/multicaller.go (100%) rename {utils => bindings/utils}/state/common.go (100%) rename {utils => bindings/utils}/state/contracts.go (100%) rename {utils => bindings/utils}/state/megapool.go (100%) rename {utils => bindings/utils}/state/minipool.go (100%) rename {utils => bindings/utils}/state/network.go (100%) rename {utils => bindings/utils}/state/node.go (100%) rename {utils => bindings/utils}/state/odao.go (100%) rename {utils => bindings/utils}/state/pdao.go (100%) rename {utils => bindings/utils}/strings/sanitize.go (100%) rename {utils => bindings/utils}/version-checker.go (100%) rename {utils => bindings/utils}/wait.go (100%) diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c52e32f31..000000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.idea -docs/*.md -docs/docs diff --git a/LICENSE b/bindings/LICENSE similarity index 100% rename from LICENSE rename to bindings/LICENSE diff --git a/README.md b/bindings/README.md similarity index 100% rename from README.md rename to bindings/README.md diff --git a/auction/auction.go b/bindings/auction/auction.go similarity index 100% rename from auction/auction.go rename to bindings/auction/auction.go diff --git a/azure-pipelines.yml b/bindings/azure-pipelines.yml similarity index 100% rename from azure-pipelines.yml rename to bindings/azure-pipelines.yml diff --git a/contracts/rocket-storage.go b/bindings/contracts/rocket-storage.go similarity index 100% rename from contracts/rocket-storage.go rename to bindings/contracts/rocket-storage.go diff --git a/dao/claim.go b/bindings/dao/claim.go similarity index 100% rename from dao/claim.go rename to bindings/dao/claim.go diff --git a/dao/proposal-payload.go b/bindings/dao/proposal-payload.go similarity index 100% rename from dao/proposal-payload.go rename to bindings/dao/proposal-payload.go diff --git a/dao/proposals.go b/bindings/dao/proposals.go similarity index 100% rename from dao/proposals.go rename to bindings/dao/proposals.go diff --git a/dao/protocol/dao.go b/bindings/dao/protocol/dao.go similarity index 100% rename from dao/protocol/dao.go rename to bindings/dao/protocol/dao.go diff --git a/dao/protocol/proposal.go b/bindings/dao/protocol/proposal.go similarity index 100% rename from dao/protocol/proposal.go rename to bindings/dao/protocol/proposal.go diff --git a/dao/protocol/proposals.go b/bindings/dao/protocol/proposals.go similarity index 100% rename from dao/protocol/proposals.go rename to bindings/dao/protocol/proposals.go diff --git a/dao/protocol/verify.go b/bindings/dao/protocol/verify.go similarity index 100% rename from dao/protocol/verify.go rename to bindings/dao/protocol/verify.go diff --git a/dao/security/actions.go b/bindings/dao/security/actions.go similarity index 100% rename from dao/security/actions.go rename to bindings/dao/security/actions.go diff --git a/dao/security/proposals.go b/bindings/dao/security/proposals.go similarity index 100% rename from dao/security/proposals.go rename to bindings/dao/security/proposals.go diff --git a/dao/security/security.go b/bindings/dao/security/security.go similarity index 100% rename from dao/security/security.go rename to bindings/dao/security/security.go diff --git a/dao/trustednode/actions.go b/bindings/dao/trustednode/actions.go similarity index 100% rename from dao/trustednode/actions.go rename to bindings/dao/trustednode/actions.go diff --git a/dao/trustednode/dao.go b/bindings/dao/trustednode/dao.go similarity index 100% rename from dao/trustednode/dao.go rename to bindings/dao/trustednode/dao.go diff --git a/dao/trustednode/proposals.go b/bindings/dao/trustednode/proposals.go similarity index 100% rename from dao/trustednode/proposals.go rename to bindings/dao/trustednode/proposals.go diff --git a/deposit/deposit-pool.go b/bindings/deposit/deposit-pool.go similarity index 100% rename from deposit/deposit-pool.go rename to bindings/deposit/deposit-pool.go diff --git a/deposit/deposit.go b/bindings/deposit/deposit.go similarity index 100% rename from deposit/deposit.go rename to bindings/deposit/deposit.go diff --git a/docs/docgen.go b/bindings/docs/docgen.go similarity index 100% rename from docs/docgen.go rename to bindings/docs/docgen.go diff --git a/go.mod b/bindings/go.mod similarity index 100% rename from go.mod rename to bindings/go.mod diff --git a/go.sum b/bindings/go.sum similarity index 100% rename from go.sum rename to bindings/go.sum diff --git a/legacy/v1.0.0/minipool/minipool.go b/bindings/legacy/v1.0.0/minipool/minipool.go similarity index 100% rename from legacy/v1.0.0/minipool/minipool.go rename to bindings/legacy/v1.0.0/minipool/minipool.go diff --git a/legacy/v1.0.0/rewards/node.go b/bindings/legacy/v1.0.0/rewards/node.go similarity index 100% rename from legacy/v1.0.0/rewards/node.go rename to bindings/legacy/v1.0.0/rewards/node.go diff --git a/legacy/v1.0.0/rewards/rewards.go b/bindings/legacy/v1.0.0/rewards/rewards.go similarity index 100% rename from legacy/v1.0.0/rewards/rewards.go rename to bindings/legacy/v1.0.0/rewards/rewards.go diff --git a/legacy/v1.0.0/rewards/trusted-node.go b/bindings/legacy/v1.0.0/rewards/trusted-node.go similarity index 100% rename from legacy/v1.0.0/rewards/trusted-node.go rename to bindings/legacy/v1.0.0/rewards/trusted-node.go diff --git a/legacy/v1.0.0/utils/address_generation.go b/bindings/legacy/v1.0.0/utils/address_generation.go similarity index 100% rename from legacy/v1.0.0/utils/address_generation.go rename to bindings/legacy/v1.0.0/utils/address_generation.go diff --git a/legacy/v1.1.0-rc1/rewards/rewards.go b/bindings/legacy/v1.1.0-rc1/rewards/rewards.go similarity index 100% rename from legacy/v1.1.0-rc1/rewards/rewards.go rename to bindings/legacy/v1.1.0-rc1/rewards/rewards.go diff --git a/legacy/v1.1.0/minipool/factory.go b/bindings/legacy/v1.1.0/minipool/factory.go similarity index 100% rename from legacy/v1.1.0/minipool/factory.go rename to bindings/legacy/v1.1.0/minipool/factory.go diff --git a/legacy/v1.1.0/minipool/queue.go b/bindings/legacy/v1.1.0/minipool/queue.go similarity index 100% rename from legacy/v1.1.0/minipool/queue.go rename to bindings/legacy/v1.1.0/minipool/queue.go diff --git a/legacy/v1.1.0/network/prices.go b/bindings/legacy/v1.1.0/network/prices.go similarity index 100% rename from legacy/v1.1.0/network/prices.go rename to bindings/legacy/v1.1.0/network/prices.go diff --git a/legacy/v1.1.0/node/deposit.go b/bindings/legacy/v1.1.0/node/deposit.go similarity index 100% rename from legacy/v1.1.0/node/deposit.go rename to bindings/legacy/v1.1.0/node/deposit.go diff --git a/legacy/v1.1.0/node/staking.go b/bindings/legacy/v1.1.0/node/staking.go similarity index 100% rename from legacy/v1.1.0/node/staking.go rename to bindings/legacy/v1.1.0/node/staking.go diff --git a/legacy/v1.1.0/utils/address_generation.go b/bindings/legacy/v1.1.0/utils/address_generation.go similarity index 100% rename from legacy/v1.1.0/utils/address_generation.go rename to bindings/legacy/v1.1.0/utils/address_generation.go diff --git a/legacy/v1.2.0/network/balances.go b/bindings/legacy/v1.2.0/network/balances.go similarity index 100% rename from legacy/v1.2.0/network/balances.go rename to bindings/legacy/v1.2.0/network/balances.go diff --git a/legacy/v1.2.0/network/prices.go b/bindings/legacy/v1.2.0/network/prices.go similarity index 100% rename from legacy/v1.2.0/network/prices.go rename to bindings/legacy/v1.2.0/network/prices.go diff --git a/legacy/v1.3.1/node/deposit.go b/bindings/legacy/v1.3.1/node/deposit.go similarity index 100% rename from legacy/v1.3.1/node/deposit.go rename to bindings/legacy/v1.3.1/node/deposit.go diff --git a/megapool/beacon-state-verifier.go b/bindings/megapool/beacon-state-verifier.go similarity index 100% rename from megapool/beacon-state-verifier.go rename to bindings/megapool/beacon-state-verifier.go diff --git a/megapool/factory.go b/bindings/megapool/factory.go similarity index 100% rename from megapool/factory.go rename to bindings/megapool/factory.go diff --git a/megapool/megapool-contract.go b/bindings/megapool/megapool-contract.go similarity index 100% rename from megapool/megapool-contract.go rename to bindings/megapool/megapool-contract.go diff --git a/megapool/megapool-interface.go b/bindings/megapool/megapool-interface.go similarity index 100% rename from megapool/megapool-interface.go rename to bindings/megapool/megapool-interface.go diff --git a/megapool/megapool-manager.go b/bindings/megapool/megapool-manager.go similarity index 100% rename from megapool/megapool-manager.go rename to bindings/megapool/megapool-manager.go diff --git a/megapool/megapool-penalties.go b/bindings/megapool/megapool-penalties.go similarity index 100% rename from megapool/megapool-penalties.go rename to bindings/megapool/megapool-penalties.go diff --git a/megapool/megapool-proxy.go b/bindings/megapool/megapool-proxy.go similarity index 100% rename from megapool/megapool-proxy.go rename to bindings/megapool/megapool-proxy.go diff --git a/minipool/bond-reducer.go b/bindings/minipool/bond-reducer.go similarity index 100% rename from minipool/bond-reducer.go rename to bindings/minipool/bond-reducer.go diff --git a/minipool/factory.go b/bindings/minipool/factory.go similarity index 100% rename from minipool/factory.go rename to bindings/minipool/factory.go diff --git a/minipool/minipool-constructor.go b/bindings/minipool/minipool-constructor.go similarity index 100% rename from minipool/minipool-constructor.go rename to bindings/minipool/minipool-constructor.go diff --git a/minipool/minipool-contract-v2.go b/bindings/minipool/minipool-contract-v2.go similarity index 100% rename from minipool/minipool-contract-v2.go rename to bindings/minipool/minipool-contract-v2.go diff --git a/minipool/minipool-contract-v3.go b/bindings/minipool/minipool-contract-v3.go similarity index 100% rename from minipool/minipool-contract-v3.go rename to bindings/minipool/minipool-contract-v3.go diff --git a/minipool/minipool-interface.go b/bindings/minipool/minipool-interface.go similarity index 100% rename from minipool/minipool-interface.go rename to bindings/minipool/minipool-interface.go diff --git a/minipool/minipool.go b/bindings/minipool/minipool.go similarity index 100% rename from minipool/minipool.go rename to bindings/minipool/minipool.go diff --git a/minipool/queue.go b/bindings/minipool/queue.go similarity index 100% rename from minipool/queue.go rename to bindings/minipool/queue.go diff --git a/minipool/status.go b/bindings/minipool/status.go similarity index 100% rename from minipool/status.go rename to bindings/minipool/status.go diff --git a/network/balances.go b/bindings/network/balances.go similarity index 100% rename from network/balances.go rename to bindings/network/balances.go diff --git a/network/fees.go b/bindings/network/fees.go similarity index 100% rename from network/fees.go rename to bindings/network/fees.go diff --git a/network/penalties.go b/bindings/network/penalties.go similarity index 100% rename from network/penalties.go rename to bindings/network/penalties.go diff --git a/network/prices.go b/bindings/network/prices.go similarity index 100% rename from network/prices.go rename to bindings/network/prices.go diff --git a/network/revenues.go b/bindings/network/revenues.go similarity index 100% rename from network/revenues.go rename to bindings/network/revenues.go diff --git a/network/voting.go b/bindings/network/voting.go similarity index 100% rename from network/voting.go rename to bindings/network/voting.go diff --git a/node/deposit.go b/bindings/node/deposit.go similarity index 100% rename from node/deposit.go rename to bindings/node/deposit.go diff --git a/node/distributor.go b/bindings/node/distributor.go similarity index 100% rename from node/distributor.go rename to bindings/node/distributor.go diff --git a/node/node.go b/bindings/node/node.go similarity index 100% rename from node/node.go rename to bindings/node/node.go diff --git a/node/staking.go b/bindings/node/staking.go similarity index 100% rename from node/staking.go rename to bindings/node/staking.go diff --git a/rewards/distributor-mainnet.go b/bindings/rewards/distributor-mainnet.go similarity index 100% rename from rewards/distributor-mainnet.go rename to bindings/rewards/distributor-mainnet.go diff --git a/rewards/rewards.go b/bindings/rewards/rewards.go similarity index 100% rename from rewards/rewards.go rename to bindings/rewards/rewards.go diff --git a/rocketpool/abi.go b/bindings/rocketpool/abi.go similarity index 100% rename from rocketpool/abi.go rename to bindings/rocketpool/abi.go diff --git a/rocketpool/contract.go b/bindings/rocketpool/contract.go similarity index 100% rename from rocketpool/contract.go rename to bindings/rocketpool/contract.go diff --git a/rocketpool/ec-interface.go b/bindings/rocketpool/ec-interface.go similarity index 100% rename from rocketpool/ec-interface.go rename to bindings/rocketpool/ec-interface.go diff --git a/rocketpool/rewards.go b/bindings/rocketpool/rewards.go similarity index 100% rename from rocketpool/rewards.go rename to bindings/rocketpool/rewards.go diff --git a/rocketpool/rocketpool.go b/bindings/rocketpool/rocketpool.go similarity index 100% rename from rocketpool/rocketpool.go rename to bindings/rocketpool/rocketpool.go diff --git a/rocketpool/v1.0.0-manager.go b/bindings/rocketpool/v1.0.0-manager.go similarity index 100% rename from rocketpool/v1.0.0-manager.go rename to bindings/rocketpool/v1.0.0-manager.go diff --git a/rocketpool/v1.1.0-manager.go b/bindings/rocketpool/v1.1.0-manager.go similarity index 100% rename from rocketpool/v1.1.0-manager.go rename to bindings/rocketpool/v1.1.0-manager.go diff --git a/rocketpool/v1.1.0-rc1-manager.go b/bindings/rocketpool/v1.1.0-rc1-manager.go similarity index 100% rename from rocketpool/v1.1.0-rc1-manager.go rename to bindings/rocketpool/v1.1.0-rc1-manager.go diff --git a/rocketpool/v1.2.0-manager.go b/bindings/rocketpool/v1.2.0-manager.go similarity index 100% rename from rocketpool/v1.2.0-manager.go rename to bindings/rocketpool/v1.2.0-manager.go diff --git a/rocketpool/version-interface.go b/bindings/rocketpool/version-interface.go similarity index 100% rename from rocketpool/version-interface.go rename to bindings/rocketpool/version-interface.go diff --git a/rocketpool/version-manager.go b/bindings/rocketpool/version-manager.go similarity index 100% rename from rocketpool/version-manager.go rename to bindings/rocketpool/version-manager.go diff --git a/settings/protocol/auction.go b/bindings/settings/protocol/auction.go similarity index 100% rename from settings/protocol/auction.go rename to bindings/settings/protocol/auction.go diff --git a/settings/protocol/deposit.go b/bindings/settings/protocol/deposit.go similarity index 100% rename from settings/protocol/deposit.go rename to bindings/settings/protocol/deposit.go diff --git a/settings/protocol/inflation.go b/bindings/settings/protocol/inflation.go similarity index 100% rename from settings/protocol/inflation.go rename to bindings/settings/protocol/inflation.go diff --git a/settings/protocol/megapool.go b/bindings/settings/protocol/megapool.go similarity index 100% rename from settings/protocol/megapool.go rename to bindings/settings/protocol/megapool.go diff --git a/settings/protocol/minipool.go b/bindings/settings/protocol/minipool.go similarity index 100% rename from settings/protocol/minipool.go rename to bindings/settings/protocol/minipool.go diff --git a/settings/protocol/network.go b/bindings/settings/protocol/network.go similarity index 100% rename from settings/protocol/network.go rename to bindings/settings/protocol/network.go diff --git a/settings/protocol/node.go b/bindings/settings/protocol/node.go similarity index 100% rename from settings/protocol/node.go rename to bindings/settings/protocol/node.go diff --git a/settings/protocol/proposals.go b/bindings/settings/protocol/proposals.go similarity index 100% rename from settings/protocol/proposals.go rename to bindings/settings/protocol/proposals.go diff --git a/settings/protocol/rewards.go b/bindings/settings/protocol/rewards.go similarity index 100% rename from settings/protocol/rewards.go rename to bindings/settings/protocol/rewards.go diff --git a/settings/protocol/security.go b/bindings/settings/protocol/security.go similarity index 100% rename from settings/protocol/security.go rename to bindings/settings/protocol/security.go diff --git a/settings/security/auction.go b/bindings/settings/security/auction.go similarity index 100% rename from settings/security/auction.go rename to bindings/settings/security/auction.go diff --git a/settings/security/deposit.go b/bindings/settings/security/deposit.go similarity index 100% rename from settings/security/deposit.go rename to bindings/settings/security/deposit.go diff --git a/settings/security/minipool.go b/bindings/settings/security/minipool.go similarity index 100% rename from settings/security/minipool.go rename to bindings/settings/security/minipool.go diff --git a/settings/security/network.go b/bindings/settings/security/network.go similarity index 100% rename from settings/security/network.go rename to bindings/settings/security/network.go diff --git a/settings/security/node.go b/bindings/settings/security/node.go similarity index 100% rename from settings/security/node.go rename to bindings/settings/security/node.go diff --git a/settings/trustednode/members.go b/bindings/settings/trustednode/members.go similarity index 100% rename from settings/trustednode/members.go rename to bindings/settings/trustednode/members.go diff --git a/settings/trustednode/minipool.go b/bindings/settings/trustednode/minipool.go similarity index 100% rename from settings/trustednode/minipool.go rename to bindings/settings/trustednode/minipool.go diff --git a/settings/trustednode/proposals.go b/bindings/settings/trustednode/proposals.go similarity index 100% rename from settings/trustednode/proposals.go rename to bindings/settings/trustednode/proposals.go diff --git a/settings/trustednode/rewards.go b/bindings/settings/trustednode/rewards.go similarity index 100% rename from settings/trustednode/rewards.go rename to bindings/settings/trustednode/rewards.go diff --git a/storage/address-queue-storage.go b/bindings/storage/address-queue-storage.go similarity index 100% rename from storage/address-queue-storage.go rename to bindings/storage/address-queue-storage.go diff --git a/storage/linked-list-storage.go b/bindings/storage/linked-list-storage.go similarity index 100% rename from storage/linked-list-storage.go rename to bindings/storage/linked-list-storage.go diff --git a/storage/rocket-storage.go b/bindings/storage/rocket-storage.go similarity index 100% rename from storage/rocket-storage.go rename to bindings/storage/rocket-storage.go diff --git a/test.sh b/bindings/test.sh similarity index 100% rename from test.sh rename to bindings/test.sh diff --git a/tests/auction/auction_test.go b/bindings/tests/auction/auction_test.go similarity index 100% rename from tests/auction/auction_test.go rename to bindings/tests/auction/auction_test.go diff --git a/tests/auction/main_test.go b/bindings/tests/auction/main_test.go similarity index 100% rename from tests/auction/main_test.go rename to bindings/tests/auction/main_test.go diff --git a/tests/config.go b/bindings/tests/config.go similarity index 100% rename from tests/config.go rename to bindings/tests/config.go diff --git a/tests/dao/main_test.go b/bindings/tests/dao/main_test.go similarity index 100% rename from tests/dao/main_test.go rename to bindings/tests/dao/main_test.go diff --git a/tests/dao/proposals_test.go b/bindings/tests/dao/proposals_test.go similarity index 100% rename from tests/dao/proposals_test.go rename to bindings/tests/dao/proposals_test.go diff --git a/tests/dao/trustednode/dao_test.go b/bindings/tests/dao/trustednode/dao_test.go similarity index 100% rename from tests/dao/trustednode/dao_test.go rename to bindings/tests/dao/trustednode/dao_test.go diff --git a/tests/dao/trustednode/main_test.go b/bindings/tests/dao/trustednode/main_test.go similarity index 100% rename from tests/dao/trustednode/main_test.go rename to bindings/tests/dao/trustednode/main_test.go diff --git a/tests/dao/trustednode/proposals_test.go b/bindings/tests/dao/trustednode/proposals_test.go similarity index 100% rename from tests/dao/trustednode/proposals_test.go rename to bindings/tests/dao/trustednode/proposals_test.go diff --git a/tests/deposit/deposit_test.go b/bindings/tests/deposit/deposit_test.go similarity index 100% rename from tests/deposit/deposit_test.go rename to bindings/tests/deposit/deposit_test.go diff --git a/tests/deposit/main_test.go b/bindings/tests/deposit/main_test.go similarity index 100% rename from tests/deposit/main_test.go rename to bindings/tests/deposit/main_test.go diff --git a/tests/minipool/contract_test.go b/bindings/tests/minipool/contract_test.go similarity index 100% rename from tests/minipool/contract_test.go rename to bindings/tests/minipool/contract_test.go diff --git a/tests/minipool/main_test.go b/bindings/tests/minipool/main_test.go similarity index 100% rename from tests/minipool/main_test.go rename to bindings/tests/minipool/main_test.go diff --git a/tests/minipool/minipool_test.go b/bindings/tests/minipool/minipool_test.go similarity index 100% rename from tests/minipool/minipool_test.go rename to bindings/tests/minipool/minipool_test.go diff --git a/tests/minipool/queue_test.go b/bindings/tests/minipool/queue_test.go similarity index 100% rename from tests/minipool/queue_test.go rename to bindings/tests/minipool/queue_test.go diff --git a/tests/minipool/status_test.go b/bindings/tests/minipool/status_test.go similarity index 100% rename from tests/minipool/status_test.go rename to bindings/tests/minipool/status_test.go diff --git a/tests/network/balances_test.go b/bindings/tests/network/balances_test.go similarity index 100% rename from tests/network/balances_test.go rename to bindings/tests/network/balances_test.go diff --git a/tests/network/fees_test.go b/bindings/tests/network/fees_test.go similarity index 100% rename from tests/network/fees_test.go rename to bindings/tests/network/fees_test.go diff --git a/tests/network/main_test.go b/bindings/tests/network/main_test.go similarity index 100% rename from tests/network/main_test.go rename to bindings/tests/network/main_test.go diff --git a/tests/network/prices_test.go b/bindings/tests/network/prices_test.go similarity index 100% rename from tests/network/prices_test.go rename to bindings/tests/network/prices_test.go diff --git a/tests/node/deposit_test.go b/bindings/tests/node/deposit_test.go similarity index 100% rename from tests/node/deposit_test.go rename to bindings/tests/node/deposit_test.go diff --git a/tests/node/distributor_test.go b/bindings/tests/node/distributor_test.go similarity index 100% rename from tests/node/distributor_test.go rename to bindings/tests/node/distributor_test.go diff --git a/tests/node/main_test.go b/bindings/tests/node/main_test.go similarity index 100% rename from tests/node/main_test.go rename to bindings/tests/node/main_test.go diff --git a/tests/node/node_test.go b/bindings/tests/node/node_test.go similarity index 100% rename from tests/node/node_test.go rename to bindings/tests/node/node_test.go diff --git a/tests/node/staking_test.go b/bindings/tests/node/staking_test.go similarity index 100% rename from tests/node/staking_test.go rename to bindings/tests/node/staking_test.go diff --git a/tests/rewards/main_test.go b/bindings/tests/rewards/main_test.go similarity index 100% rename from tests/rewards/main_test.go rename to bindings/tests/rewards/main_test.go diff --git a/tests/rewards/node_test.go b/bindings/tests/rewards/node_test.go similarity index 100% rename from tests/rewards/node_test.go rename to bindings/tests/rewards/node_test.go diff --git a/tests/rewards/trusted_node_test.go b/bindings/tests/rewards/trusted_node_test.go similarity index 100% rename from tests/rewards/trusted_node_test.go rename to bindings/tests/rewards/trusted_node_test.go diff --git a/tests/rocketpool/main_test.go b/bindings/tests/rocketpool/main_test.go similarity index 100% rename from tests/rocketpool/main_test.go rename to bindings/tests/rocketpool/main_test.go diff --git a/tests/rocketpool/rocketpool_test.go b/bindings/tests/rocketpool/rocketpool_test.go similarity index 100% rename from tests/rocketpool/rocketpool_test.go rename to bindings/tests/rocketpool/rocketpool_test.go diff --git a/tests/settings/protocol/auction_test.go b/bindings/tests/settings/protocol/auction_test.go similarity index 100% rename from tests/settings/protocol/auction_test.go rename to bindings/tests/settings/protocol/auction_test.go diff --git a/tests/settings/protocol/deposit_test.go b/bindings/tests/settings/protocol/deposit_test.go similarity index 100% rename from tests/settings/protocol/deposit_test.go rename to bindings/tests/settings/protocol/deposit_test.go diff --git a/tests/settings/protocol/inflation_test.go b/bindings/tests/settings/protocol/inflation_test.go similarity index 100% rename from tests/settings/protocol/inflation_test.go rename to bindings/tests/settings/protocol/inflation_test.go diff --git a/tests/settings/protocol/main_test.go b/bindings/tests/settings/protocol/main_test.go similarity index 100% rename from tests/settings/protocol/main_test.go rename to bindings/tests/settings/protocol/main_test.go diff --git a/tests/settings/protocol/minipool_test.go b/bindings/tests/settings/protocol/minipool_test.go similarity index 100% rename from tests/settings/protocol/minipool_test.go rename to bindings/tests/settings/protocol/minipool_test.go diff --git a/tests/settings/protocol/network_test.go b/bindings/tests/settings/protocol/network_test.go similarity index 100% rename from tests/settings/protocol/network_test.go rename to bindings/tests/settings/protocol/network_test.go diff --git a/tests/settings/protocol/node_test.go b/bindings/tests/settings/protocol/node_test.go similarity index 100% rename from tests/settings/protocol/node_test.go rename to bindings/tests/settings/protocol/node_test.go diff --git a/tests/settings/protocol/rewards_test.go b/bindings/tests/settings/protocol/rewards_test.go similarity index 100% rename from tests/settings/protocol/rewards_test.go rename to bindings/tests/settings/protocol/rewards_test.go diff --git a/tests/settings/trustednode/main_test.go b/bindings/tests/settings/trustednode/main_test.go similarity index 100% rename from tests/settings/trustednode/main_test.go rename to bindings/tests/settings/trustednode/main_test.go diff --git a/tests/settings/trustednode/members_test.go b/bindings/tests/settings/trustednode/members_test.go similarity index 100% rename from tests/settings/trustednode/members_test.go rename to bindings/tests/settings/trustednode/members_test.go diff --git a/tests/settings/trustednode/proposals_test.go b/bindings/tests/settings/trustednode/proposals_test.go similarity index 100% rename from tests/settings/trustednode/proposals_test.go rename to bindings/tests/settings/trustednode/proposals_test.go diff --git a/tests/testutils/accounts/accounts.go b/bindings/tests/testutils/accounts/accounts.go similarity index 100% rename from tests/testutils/accounts/accounts.go rename to bindings/tests/testutils/accounts/accounts.go diff --git a/tests/testutils/auction/auction.go b/bindings/tests/testutils/auction/auction.go similarity index 100% rename from tests/testutils/auction/auction.go rename to bindings/tests/testutils/auction/auction.go diff --git a/tests/testutils/dao/proposals.go b/bindings/tests/testutils/dao/proposals.go similarity index 100% rename from tests/testutils/dao/proposals.go rename to bindings/tests/testutils/dao/proposals.go diff --git a/tests/testutils/evm/mining.go b/bindings/tests/testutils/evm/mining.go similarity index 100% rename from tests/testutils/evm/mining.go rename to bindings/tests/testutils/evm/mining.go diff --git a/tests/testutils/evm/snapshots.go b/bindings/tests/testutils/evm/snapshots.go similarity index 100% rename from tests/testutils/evm/snapshots.go rename to bindings/tests/testutils/evm/snapshots.go diff --git a/tests/testutils/minipool/minipool.go b/bindings/tests/testutils/minipool/minipool.go similarity index 100% rename from tests/testutils/minipool/minipool.go rename to bindings/tests/testutils/minipool/minipool.go diff --git a/tests/testutils/node/deposit.go b/bindings/tests/testutils/node/deposit.go similarity index 100% rename from tests/testutils/node/deposit.go rename to bindings/tests/testutils/node/deposit.go diff --git a/tests/testutils/node/node.go b/bindings/tests/testutils/node/node.go similarity index 100% rename from tests/testutils/node/node.go rename to bindings/tests/testutils/node/node.go diff --git a/tests/testutils/node/staking.go b/bindings/tests/testutils/node/staking.go similarity index 100% rename from tests/testutils/node/staking.go rename to bindings/tests/testutils/node/staking.go diff --git a/tests/testutils/tokens/reth/reth.go b/bindings/tests/testutils/tokens/reth/reth.go similarity index 100% rename from tests/testutils/tokens/reth/reth.go rename to bindings/tests/testutils/tokens/reth/reth.go diff --git a/tests/testutils/tokens/rpl/rpl.go b/bindings/tests/testutils/tokens/rpl/rpl.go similarity index 100% rename from tests/testutils/tokens/rpl/rpl.go rename to bindings/tests/testutils/tokens/rpl/rpl.go diff --git a/tests/testutils/validator/deposit-data.go b/bindings/tests/testutils/validator/deposit-data.go similarity index 100% rename from tests/testutils/validator/deposit-data.go rename to bindings/tests/testutils/validator/deposit-data.go diff --git a/tests/tokens/main_test.go b/bindings/tests/tokens/main_test.go similarity index 100% rename from tests/tokens/main_test.go rename to bindings/tests/tokens/main_test.go diff --git a/tests/tokens/reth_test.go b/bindings/tests/tokens/reth_test.go similarity index 100% rename from tests/tokens/reth_test.go rename to bindings/tests/tokens/reth_test.go diff --git a/tests/tokens/rpl_fixed_test.go b/bindings/tests/tokens/rpl_fixed_test.go similarity index 100% rename from tests/tokens/rpl_fixed_test.go rename to bindings/tests/tokens/rpl_fixed_test.go diff --git a/tests/tokens/rpl_test.go b/bindings/tests/tokens/rpl_test.go similarity index 100% rename from tests/tokens/rpl_test.go rename to bindings/tests/tokens/rpl_test.go diff --git a/tests/tokens/tokens_test.go b/bindings/tests/tokens/tokens_test.go similarity index 100% rename from tests/tokens/tokens_test.go rename to bindings/tests/tokens/tokens_test.go diff --git a/tests/utils/eth/transactions_test.go b/bindings/tests/utils/eth/transactions_test.go similarity index 100% rename from tests/utils/eth/transactions_test.go rename to bindings/tests/utils/eth/transactions_test.go diff --git a/tests/utils/eth/units_test.go b/bindings/tests/utils/eth/units_test.go similarity index 100% rename from tests/utils/eth/units_test.go rename to bindings/tests/utils/eth/units_test.go diff --git a/tests/utils/stage4_bootstrap.go b/bindings/tests/utils/stage4_bootstrap.go similarity index 100% rename from tests/utils/stage4_bootstrap.go rename to bindings/tests/utils/stage4_bootstrap.go diff --git a/tokens/reth.go b/bindings/tokens/reth.go similarity index 100% rename from tokens/reth.go rename to bindings/tokens/reth.go diff --git a/tokens/rpl-fixed.go b/bindings/tokens/rpl-fixed.go similarity index 100% rename from tokens/rpl-fixed.go rename to bindings/tokens/rpl-fixed.go diff --git a/tokens/rpl.go b/bindings/tokens/rpl.go similarity index 100% rename from tokens/rpl.go rename to bindings/tokens/rpl.go diff --git a/tokens/tokens.go b/bindings/tokens/tokens.go similarity index 100% rename from tokens/tokens.go rename to bindings/tokens/tokens.go diff --git a/types/beacon.go b/bindings/types/beacon.go similarity index 100% rename from types/beacon.go rename to bindings/types/beacon.go diff --git a/types/dao.go b/bindings/types/dao.go similarity index 100% rename from types/dao.go rename to bindings/types/dao.go diff --git a/types/minipool.go b/bindings/types/minipool.go similarity index 100% rename from types/minipool.go rename to bindings/types/minipool.go diff --git a/utils/address_generation.go b/bindings/utils/address_generation.go similarity index 100% rename from utils/address_generation.go rename to bindings/utils/address_generation.go diff --git a/utils/deposit_retrieval.go b/bindings/utils/deposit_retrieval.go similarity index 100% rename from utils/deposit_retrieval.go rename to bindings/utils/deposit_retrieval.go diff --git a/utils/eth/erc20.go b/bindings/utils/eth/erc20.go similarity index 100% rename from utils/eth/erc20.go rename to bindings/utils/eth/erc20.go diff --git a/utils/eth/logs.go b/bindings/utils/eth/logs.go similarity index 100% rename from utils/eth/logs.go rename to bindings/utils/eth/logs.go diff --git a/utils/eth/transactions.go b/bindings/utils/eth/transactions.go similarity index 100% rename from utils/eth/transactions.go rename to bindings/utils/eth/transactions.go diff --git a/utils/eth/units.go b/bindings/utils/eth/units.go similarity index 100% rename from utils/eth/units.go rename to bindings/utils/eth/units.go diff --git a/utils/json/json.go b/bindings/utils/json/json.go similarity index 100% rename from utils/json/json.go rename to bindings/utils/json/json.go diff --git a/utils/multicall/abi.go b/bindings/utils/multicall/abi.go similarity index 100% rename from utils/multicall/abi.go rename to bindings/utils/multicall/abi.go diff --git a/utils/multicall/balances.go b/bindings/utils/multicall/balances.go similarity index 100% rename from utils/multicall/balances.go rename to bindings/utils/multicall/balances.go diff --git a/utils/multicall/multicaller.go b/bindings/utils/multicall/multicaller.go similarity index 100% rename from utils/multicall/multicaller.go rename to bindings/utils/multicall/multicaller.go diff --git a/utils/state/common.go b/bindings/utils/state/common.go similarity index 100% rename from utils/state/common.go rename to bindings/utils/state/common.go diff --git a/utils/state/contracts.go b/bindings/utils/state/contracts.go similarity index 100% rename from utils/state/contracts.go rename to bindings/utils/state/contracts.go diff --git a/utils/state/megapool.go b/bindings/utils/state/megapool.go similarity index 100% rename from utils/state/megapool.go rename to bindings/utils/state/megapool.go diff --git a/utils/state/minipool.go b/bindings/utils/state/minipool.go similarity index 100% rename from utils/state/minipool.go rename to bindings/utils/state/minipool.go diff --git a/utils/state/network.go b/bindings/utils/state/network.go similarity index 100% rename from utils/state/network.go rename to bindings/utils/state/network.go diff --git a/utils/state/node.go b/bindings/utils/state/node.go similarity index 100% rename from utils/state/node.go rename to bindings/utils/state/node.go diff --git a/utils/state/odao.go b/bindings/utils/state/odao.go similarity index 100% rename from utils/state/odao.go rename to bindings/utils/state/odao.go diff --git a/utils/state/pdao.go b/bindings/utils/state/pdao.go similarity index 100% rename from utils/state/pdao.go rename to bindings/utils/state/pdao.go diff --git a/utils/strings/sanitize.go b/bindings/utils/strings/sanitize.go similarity index 100% rename from utils/strings/sanitize.go rename to bindings/utils/strings/sanitize.go diff --git a/utils/version-checker.go b/bindings/utils/version-checker.go similarity index 100% rename from utils/version-checker.go rename to bindings/utils/version-checker.go diff --git a/utils/wait.go b/bindings/utils/wait.go similarity index 100% rename from utils/wait.go rename to bindings/utils/wait.go From 9f8e91d03d4d9cfee69d024313b028689e6fcc7d Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 15:01:27 -0400 Subject: [PATCH 875/878] Remove rocketpool-go from test ci for now --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index aebaaf63c..1ddca4d4a 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ TREEGEN_TARGET_STRINGS:=$(foreach arch,$(ARCHS),${BIN_DIR}/treegen-linux-$(arch) MODULES:=$(foreach path,$(shell find . -name go.mod),$(dir $(path))) MODULE_GLOBS:=$(foreach module,$(MODULES),$(module)...) +TEST_GLOBS:=$(filter-out ./bindings/...,$(MODULE_GLOBS)) define rocketpool-cli-template .PHONY: ${BIN_DIR}/rocketpool-cli-$1-$2 @@ -153,7 +154,7 @@ lint: $(foreach module,$(MODULES),lint-$(module)) .PHONY: test test: - go test -test.timeout 20m $(MODULE_GLOBS) + go test -test.timeout 20m $(TEST_GLOBS) .PHONY: clean clean: From 3e1170584446873f7c0124340a08efcde3ff608d Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 15:41:59 -0400 Subject: [PATCH 876/878] Remove rocketpool-go from go.work.sum --- go.work.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.work.sum b/go.work.sum index 01b7ad945..d51aeff3f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1622,9 +1622,6 @@ github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeC github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rocket-pool/go-merkletree v1.0.1-0.20220406020931-c262d9b976dd h1:p9KuetSKB9nte9I/MkkiM3pwKFVQgqxxPTQ0y56Ff6s= github.com/rocket-pool/go-merkletree v1.0.1-0.20220406020931-c262d9b976dd/go.mod h1:UE9fof8P7iESVtLn1K9CTSkNRYVFHZHlf96RKbU33kA= -github.com/rocket-pool/rocketpool-go v1.8.4-0.20241122223132-c5f2be18f72b/go.mod h1:f2TVsMOYmCwaJOhshG2zRoX89PZmvCkCD7UYJ9waRkI= -github.com/rocket-pool/rocketpool-go v1.8.4-0.20250512200217-48e87a4a441b h1:T6h7a9JyhL+kfQDUKsWphwR7PJizthWxpZzpjN8SGCo= -github.com/rocket-pool/rocketpool-go v1.8.4-0.20250512200217-48e87a4a441b/go.mod h1:f2TVsMOYmCwaJOhshG2zRoX89PZmvCkCD7UYJ9waRkI= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= From 6866f531058af3b0b34aed632b234bbf01aafb79 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 16:27:11 -0400 Subject: [PATCH 877/878] Run goimports --- bindings/minipool/minipool.go | 4 ++-- rocketpool/api/node/status.go | 2 +- shared/services/state/network-state.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bindings/minipool/minipool.go b/bindings/minipool/minipool.go index c939d1a3f..f6cf2b63d 100644 --- a/bindings/minipool/minipool.go +++ b/bindings/minipool/minipool.go @@ -616,8 +616,8 @@ func GetMinipoolDepositType(rp *rocketpool.RocketPool, minipoolAddress common.Ad return types.MinipoolDeposit(*value), nil } - // Get contracts - var rocketMinipoolManagerLock sync.Mutex +// Get contracts +var rocketMinipoolManagerLock sync.Mutex func getRocketMinipoolManager(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) { rocketMinipoolManagerLock.Lock() diff --git a/rocketpool/api/node/status.go b/rocketpool/api/node/status.go index dceacbaec..7b4d70198 100644 --- a/rocketpool/api/node/status.go +++ b/rocketpool/api/node/status.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/smartnode/bindings/megapool" "github.com/rocket-pool/smartnode/bindings/dao/trustednode" + "github.com/rocket-pool/smartnode/bindings/megapool" "github.com/rocket-pool/smartnode/bindings/minipool" "github.com/rocket-pool/smartnode/bindings/network" "github.com/rocket-pool/smartnode/bindings/node" diff --git a/shared/services/state/network-state.go b/shared/services/state/network-state.go index 48b8335de..defcee7cf 100644 --- a/shared/services/state/network-state.go +++ b/shared/services/state/network-state.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/rocket-pool/smartnode/bindings/megapool" "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/megapool" "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/bindings/types" "github.com/rocket-pool/smartnode/bindings/utils/eth" From 88472ed926a5571d00bf2a8d95fba2ca08243033 Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Wed, 21 May 2025 15:54:32 -0400 Subject: [PATCH 878/878] Merge branch 'master' into jms/monorepo-saturn --- go.work | 2 ++ rocketpool/watchtower/submit-rpl-price.go | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/go.work b/go.work index 7d04138ac..a928ef83e 100644 --- a/go.work +++ b/go.work @@ -11,3 +11,5 @@ use ( replace github.com/wealdtech/go-merkletree v1.0.1-0.20190605192610-2bb163c2ea2a => github.com/rocket-pool/go-merkletree v1.0.1-0.20220406020931-c262d9b976dd replace github.com/rocket-pool/smartnode => ./ + +// replace github.com/rocket-pool/rocketpool-go => ../rocketpool-go \ No newline at end of file diff --git a/rocketpool/watchtower/submit-rpl-price.go b/rocketpool/watchtower/submit-rpl-price.go index 56a463da8..c87982f12 100644 --- a/rocketpool/watchtower/submit-rpl-price.go +++ b/rocketpool/watchtower/submit-rpl-price.go @@ -375,29 +375,30 @@ func (t *submitRplPrice) run(state *state.NetworkState) error { eth2Config := state.BeaconConfig var hasSubmittedPastBlock bool + var eventFound bool var nextSubmissionTime time.Time var targetBlockNumber uint64 var lastSubmissionSlotTimestamp uint64 // Check if the node has submitted prices for the latest block if lastSubmissionBlock != 0 { - found, lastSubmissionEvent, err := network.GetPriceUpdatedEvent(t.rp, lastSubmissionBlock, nil) + eventFound, lastSubmissionEvent, err := network.GetPriceUpdatedEvent(t.rp, lastSubmissionBlock, nil) if err != nil { t.log.Printlnf("Error getting price submission event for block %d", lastSubmissionBlock) return err } - if !found { + if !eventFound { t.log.Printlnf("No price submission event found for block %d", lastSubmissionBlock) - return fmt.Errorf("no price submission event found for block %d", lastSubmissionBlock) - } - lastSubmissionSlotTimestamp = lastSubmissionEvent.SlotTimestamp.Uint64() + } else { + lastSubmissionSlotTimestamp = lastSubmissionEvent.SlotTimestamp.Uint64() - hasSubmittedPastBlock, err = t.hasSubmittedSpecificBlockPrices(nodeAccount.Address, lastSubmissionBlock, lastSubmissionSlotTimestamp, state.NetworkDetails.RplPrice) - if err != nil { - t.log.Printlnf("Error checking if node has submitted prices for block %d: %s", lastSubmissionBlock, err.Error()) - return err + hasSubmittedPastBlock, err = t.hasSubmittedSpecificBlockPrices(nodeAccount.Address, lastSubmissionBlock, lastSubmissionSlotTimestamp, state.NetworkDetails.RplPrice) + if err != nil { + t.log.Printlnf("Error checking if node has submitted prices for block %d: %s", lastSubmissionBlock, err.Error()) + return err + } } } - if hasSubmittedPastBlock || lastSubmissionBlock == 0 { + if hasSubmittedPastBlock || lastSubmissionBlock == 0 || !eventFound { // If the node participated in consensus, find the next submission target var targetBlockHeader *types.Header _, nextSubmissionTime, targetBlockHeader, err = utils.FindNextSubmissionTarget(t.rp, eth2Config, t.bc, t.ec, lastSubmissionBlock, referenceTimestamp, submissionIntervalInSeconds)