diff --git a/pkg/node/node.go b/pkg/node/node.go index 486e76e324f..f4388668be5 100644 --- a/pkg/node/node.go +++ b/pkg/node/node.go @@ -1004,18 +1004,44 @@ func NewBee( stakingContract := staking.New(overlayEthAddress, stakingContractAddress, abiutil.MustParseABI(chainCfg.StakingABI), bzzTokenAddress, transactionService, common.BytesToHash(nonce), o.TrxDebugMode, uint8(o.ReserveCapacityDoubling)) - if chainEnabled && changedOverlay { - stake, err := stakingContract.GetPotentialStake(ctx) + if chainEnabled { + + if changedOverlay { + stake, err := stakingContract.GetPotentialStake(ctx) + if err != nil { + return nil, err + } + if stake.Cmp(big.NewInt(0)) > 0 { + logger.Debug("changing overlay address in staking contract") + tx, err := stakingContract.ChangeStakeOverlay(ctx, common.BytesToHash(nonce)) + if err != nil { + return nil, fmt.Errorf("cannot change staking overlay address: %v", err.Error()) + } + logger.Info("overlay address changed in staking contract", "transaction", tx) + } + } + + // make sure that the staking contract has the up to date height + tx, updated, err := stakingContract.UpdateHeight(ctx) if err != nil { - return nil, errors.New("getting stake balance") + return nil, err + } + if updated { + logger.Info("updated new reserve capacity doubling height in the staking contract", "transaction", tx, "new_height", o.ReserveCapacityDoubling) } - if stake.Cmp(big.NewInt(0)) > 0 { - logger.Debug("changing overlay address in staking contract") - tx, err := stakingContract.ChangeStakeOverlay(ctx, common.BytesToHash(nonce)) + + if o.ReserveCapacityDoubling > 0 { + stake, err := stakingContract.GetPotentialStake(ctx) if err != nil { - return nil, fmt.Errorf("cannot change staking overlay address: %v", err.Error()) + return nil, err + } + if stake.Cmp(big.NewInt(0)) > 0 { + // Check if the staked amount is sufficient to cover the additional neighborhoods. + // The staked amount must be at least 2^h * MinimumStake. + if stake.Cmp(big.NewInt(0).Mul(big.NewInt(1<