diff --git a/api.json b/api.json index 2769131..edfa33a 100644 --- a/api.json +++ b/api.json @@ -115,7 +115,8 @@ "keepTxFees": false, "interval": "10m", "daemon": "http://127.0.0.1:8545", - "timeout": "10s" + "timeout": "10s", + "isLondonHardForkEnabled": false }, "payouts": { "enabled": false, diff --git a/payouts/unlocker.go b/payouts/unlocker.go index 63f78b1..145daa5 100644 --- a/payouts/unlocker.go +++ b/payouts/unlocker.go @@ -1,6 +1,7 @@ package payouts import ( + "errors" "fmt" "log" "math/big" @@ -17,24 +18,28 @@ import ( ) type UnlockerConfig struct { - Enabled bool `json:"enabled"` - PoolFee float64 `json:"poolFee"` - PoolFeeAddress string `json:"poolFeeAddress"` - Depth int64 `json:"depth"` - ImmatureDepth int64 `json:"immatureDepth"` - KeepTxFees bool `json:"keepTxFees"` - Interval string `json:"interval"` - Daemon string `json:"daemon"` - Timeout string `json:"timeout"` - Ecip1017FBlock int64 `json:"ecip1017FBlock"` - Ecip1017EraRounds *big.Int `json:"ecip1017EraRounds"` - ByzantiumFBlock *big.Int `json:"byzantiumFBlock"` - ConstantinopleFBlock *big.Int `json:"constantinopleFBlock"` - Network string `json:"network"` + Enabled bool `json:"enabled"` + PoolFee float64 `json:"poolFee"` + PoolFeeAddress string `json:"poolFeeAddress"` + Depth int64 `json:"depth"` + ImmatureDepth int64 `json:"immatureDepth"` + KeepTxFees bool `json:"keepTxFees"` + Interval string `json:"interval"` + Daemon string `json:"daemon"` + Timeout string `json:"timeout"` + Ecip1017FBlock int64 `json:"ecip1017FBlock"` + Ecip1017EraRounds *big.Int `json:"ecip1017EraRounds"` + ByzantiumFBlock *big.Int `json:"byzantiumFBlock"` + ConstantinopleFBlock *big.Int `json:"constantinopleFBlock"` + Network string `json:"network"` + IsLondonHardForkEnabled bool `json:"isLondonHardForkEnabled"` } const minDepth = 16 +// London hark fork +const londonHardForkHeight = 12965000 + // params for canxium const HydroForkBlock = 4204800 @@ -928,14 +933,33 @@ func getUncleRewardEthereum(uHeight *big.Int, height *big.Int, reward *big.Int) func (u *BlockUnlocker) getExtraRewardForTx(block *rpc.GetBlockReply) (*big.Int, error) { amount := new(big.Int) + blockHeight, err := strconv.ParseInt(strings.Replace(block.Number, "0x", "", -1), 16, 64) + if err != nil { + return nil, err + } + baseFeePerGas := util.String2Big(block.BaseFeePerGas) + + config := UnlockerConfig{ + IsLondonHardForkEnabled: blockHeight >= londonHardForkHeight, + } + for _, tx := range block.Transactions { receipt, err := u.rpc.GetTxReceipt(tx.Hash) if err != nil { - return nil, err + log.Println("Error getting transaction receipt:", err) + continue } if receipt != nil { gasUsed := util.String2Big(receipt.GasUsed) gasPrice := util.String2Big(tx.GasPrice) + + if config.IsLondonHardForkEnabled { + gasPrice = new(big.Int).Sub(gasPrice, baseFeePerGas) + if gasPrice.Cmp(big.NewInt(0)) < 0 { + return nil, errors.New("gasPrice less than baseFeePerGas") + } + } + fee := new(big.Int).Mul(gasUsed, gasPrice) amount.Add(amount, fee) } diff --git a/rpc/rpc.go b/rpc/rpc.go index 070b2eb..0dd56b9 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -45,19 +45,20 @@ type RPCClient struct { } type GetBlockReply struct { - Number string `json:"number"` - Hash string `json:"hash"` - Nonce string `json:"nonce"` - Miner string `json:"miner"` - Difficulty string `json:"difficulty"` - GasLimit string `json:"gasLimit"` - GasUsed string `json:"gasUsed"` - BaseFeePerGas string `json:"baseFeePerGas"` - Timestamp string `json:"timestamp"` - Transactions []Tx `json:"transactions"` - Uncles []string `json:"uncles"` + Number string `json:"number"` + Hash string `json:"hash"` + Nonce string `json:"nonce"` + Miner string `json:"miner"` + Difficulty string `json:"difficulty"` + GasLimit string `json:"gasLimit"` + GasUsed string `json:"gasUsed"` + Timestamp string `json:"timestamp"` + Transactions []Tx `json:"transactions"` + Uncles []string `json:"uncles"` // https://github.com/ethereum/EIPs/issues/95 SealFields []string `json:"sealFields"` + // london hard fork + BaseFeePerGas string `json:"baseFeePerGas"` } type GetBlockReplyPart struct {