Skip to content

Commit 31d789e

Browse files
authored
Merge pull request #979 from rocket-pool/saturn-fee-recipient-changes
Saturn fee recipient changes
2 parents efddf29 + b2e2039 commit 31d789e

File tree

141 files changed

+15106
-1142
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+15106
-1142
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package protocol
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
"sync"
7+
8+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
9+
"github.com/ethereum/go-ethereum/common"
10+
11+
"github.com/rocket-pool/smartnode/bindings/dao/protocol"
12+
"github.com/rocket-pool/smartnode/bindings/rocketpool"
13+
"github.com/rocket-pool/smartnode/bindings/types"
14+
"github.com/rocket-pool/smartnode/bindings/utils/eth"
15+
)
16+
17+
// Config
18+
const (
19+
NodeSettingsContractName string = "rocketDAOProtocolSettingsNode"
20+
MinimumPerMinipoolStakeSettingPath string = "node.per.minipool.stake.minimum"
21+
MaximumPerMinipoolStakeSettingPath string = "node.per.minipool.stake.maximum"
22+
)
23+
24+
// The minimum RPL stake per minipool as a fraction of assigned user ETH
25+
func GetMinimumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) {
26+
nodeSettingsContract, err := getNodeSettingsContract(rp, opts)
27+
if err != nil {
28+
return 0, err
29+
}
30+
value := new(*big.Int)
31+
if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil {
32+
return 0, fmt.Errorf("error getting minimum RPL stake per minipool: %w", err)
33+
}
34+
return eth.WeiToEth(*value), nil
35+
}
36+
func ProposeMinimumPerMinipoolStake(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) {
37+
return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts)
38+
}
39+
func EstimateProposeMinimumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) {
40+
return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MinimumPerMinipoolStakeSettingPath), NodeSettingsContractName, MinimumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts)
41+
}
42+
43+
// The minimum RPL stake per minipool as a fraction of assigned user ETH
44+
func GetMinimumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) {
45+
nodeSettingsContract, err := getNodeSettingsContract(rp, opts)
46+
if err != nil {
47+
return nil, err
48+
}
49+
value := new(*big.Int)
50+
if err := nodeSettingsContract.Call(opts, value, "getMinimumPerMinipoolStake"); err != nil {
51+
return nil, fmt.Errorf("error getting minimum RPL stake per minipool: %w", err)
52+
}
53+
return *value, nil
54+
}
55+
56+
// The maximum RPL stake per minipool as a fraction of assigned user ETH
57+
func GetMaximumPerMinipoolStake(rp *rocketpool.RocketPool, opts *bind.CallOpts) (float64, error) {
58+
nodeSettingsContract, err := getNodeSettingsContract(rp, opts)
59+
if err != nil {
60+
return 0, err
61+
}
62+
value := new(*big.Int)
63+
if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil {
64+
return 0, fmt.Errorf("error getting maximum RPL stake per minipool: %w", err)
65+
}
66+
return eth.WeiToEth(*value), nil
67+
}
68+
func ProposeMaximumPerMinipoolStake(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (uint64, common.Hash, error) {
69+
return protocol.ProposeSetUint(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts)
70+
}
71+
func EstimateProposeMaximumPerMinipoolStakeGas(rp *rocketpool.RocketPool, value *big.Int, blockNumber uint32, treeNodes []types.VotingTreeNode, opts *bind.TransactOpts) (rocketpool.GasInfo, error) {
72+
return protocol.EstimateProposeSetUintGas(rp, fmt.Sprintf("set %s", MaximumPerMinipoolStakeSettingPath), NodeSettingsContractName, MaximumPerMinipoolStakeSettingPath, value, blockNumber, treeNodes, opts)
73+
}
74+
75+
// The maximum RPL stake per minipool as a fraction of assigned user ETH
76+
func GetMaximumPerMinipoolStakeRaw(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*big.Int, error) {
77+
nodeSettingsContract, err := getNodeSettingsContract(rp, opts)
78+
if err != nil {
79+
return nil, err
80+
}
81+
value := new(*big.Int)
82+
if err := nodeSettingsContract.Call(opts, value, "getMaximumPerMinipoolStake"); err != nil {
83+
return nil, fmt.Errorf("error getting maximum RPL stake per minipool: %w", err)
84+
}
85+
return *value, nil
86+
}
87+
88+
// Get contracts
89+
var nodeSettingsContractLock sync.Mutex
90+
91+
func getNodeSettingsContract(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) {
92+
nodeSettingsContractLock.Lock()
93+
defer nodeSettingsContractLock.Unlock()
94+
return rp.GetContract(NodeSettingsContractName, opts)
95+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package rewards
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
"sync"
7+
8+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
9+
"github.com/ethereum/go-ethereum/common"
10+
"github.com/rocket-pool/smartnode/bindings/rocketpool"
11+
)
12+
13+
// Check if the given node has already claimed rewards for the given interval
14+
func IsClaimed(rp *rocketpool.RocketPool, index *big.Int, claimerAddress common.Address, opts *bind.CallOpts) (bool, error) {
15+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, opts)
16+
if err != nil {
17+
return false, err
18+
}
19+
isClaimed := new(bool)
20+
if err := rocketDistributorMainnet.Call(opts, isClaimed, "isClaimed", index, claimerAddress); err != nil {
21+
return false, fmt.Errorf("error getting rewards claim status for interval %s, node %s: %w", index.String(), claimerAddress.Hex(), err)
22+
}
23+
return *isClaimed, nil
24+
}
25+
26+
// Get the Merkle root for an interval
27+
func MerkleRoots(rp *rocketpool.RocketPool, interval *big.Int, opts *bind.CallOpts) ([]byte, error) {
28+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, opts)
29+
if err != nil {
30+
return nil, err
31+
}
32+
bytes := new([32]byte)
33+
if err := rocketDistributorMainnet.Call(opts, bytes, "merkleRoots", interval); err != nil {
34+
return nil, fmt.Errorf("error getting Merkle root for interval %s: %w", interval.String(), err)
35+
}
36+
return (*bytes)[:], nil
37+
}
38+
39+
// Estimate claim rewards gas
40+
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) {
41+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil)
42+
if err != nil {
43+
return rocketpool.GasInfo{}, err
44+
}
45+
return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs)
46+
}
47+
48+
// Claim rewards
49+
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) {
50+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil)
51+
if err != nil {
52+
return common.Hash{}, err
53+
}
54+
tx, err := rocketDistributorMainnet.Transact(opts, "claim", address, indices, amountRPL, amountETH, merkleProofs)
55+
if err != nil {
56+
return common.Hash{}, fmt.Errorf("error claiming rewards: %w", err)
57+
}
58+
return tx.Hash(), nil
59+
}
60+
61+
// Estimate claim and restake rewards gas
62+
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) {
63+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil)
64+
if err != nil {
65+
return rocketpool.GasInfo{}, err
66+
}
67+
return rocketDistributorMainnet.GetTransactionGasInfo(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount)
68+
}
69+
70+
// Claim and restake rewards
71+
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) {
72+
rocketDistributorMainnet, err := getRocketDistributorMainnet(rp, nil)
73+
if err != nil {
74+
return common.Hash{}, err
75+
}
76+
tx, err := rocketDistributorMainnet.Transact(opts, "claimAndStake", address, indices, amountRPL, amountETH, merkleProofs, stakeAmount)
77+
if err != nil {
78+
return common.Hash{}, fmt.Errorf("error claiming rewards: %w", err)
79+
}
80+
return tx.Hash(), nil
81+
}
82+
83+
// Get contracts
84+
var rocketDistributorMainnetLock sync.Mutex
85+
86+
func getRocketDistributorMainnet(rp *rocketpool.RocketPool, opts *bind.CallOpts) (*rocketpool.Contract, error) {
87+
rocketDistributorMainnetLock.Lock()
88+
defer rocketDistributorMainnetLock.Unlock()
89+
return rp.GetContract("rocketMerkleDistributorMainnet", opts)
90+
}

0 commit comments

Comments
 (0)