Skip to content

Commit 69226dc

Browse files
committed
fixed stack too deep issue
1 parent a3cbf84 commit 69226dc

10 files changed

+315
-229
lines changed

.solcover.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module.exports = {
22
norpc: true,
3-
compileCommand: '../node_modules/.bin/truffle compile',
4-
testCommand: 'node --max-old-space-size=4096 ../node_modules/.bin/truffle test --network coverage',
5-
skipFiles: ['interfaces','libs']
3+
skipFiles: ['interfaces', 'libs'],
4+
configureYulOptimizer: true
65
}

contracts/InitializerHbbft.sol

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pragma solidity =0.8.17;
2-
pragma experimental ABIEncoderV2;
32

43
import "./interfaces/IBlockRewardHbbft.sol";
54
import "./interfaces/ICertifier.sol";
@@ -57,14 +56,16 @@ contract InitializerHbbft {
5756
_stakingAddresses
5857
);
5958
IStakingHbbft(_contracts[3]).initialize(
60-
_contracts[0], // _validatorSetContract
61-
_stakingAddresses,
62-
_stakingParams[0], // _delegatorMinStake
63-
_stakingParams[1], // _candidateMinStake
64-
_stakingParams[2], // _maxStake
65-
_stakingParams[3], // _stakingEpochDuration
66-
_stakingParams[4], // _stakingTransitionTimeframeLength
67-
_stakingParams[5], // _stakingWithdrawDisallowPeriod
59+
IStakingHbbft.StakingParams({
60+
_validatorSetContract: _contracts[0], // _validatorSetContract
61+
_initialStakingAddresses: _stakingAddresses,
62+
_delegatorMinStake: _stakingParams[0], // _delegatorMinStake
63+
_candidateMinStake: _stakingParams[1], // _candidateMinStake
64+
_maxStake: _stakingParams[2], // _maxStake
65+
_stakingFixedEpochDuration: _stakingParams[3], // _stakingEpochDuration
66+
_stakingTransitionTimeframeLength: _stakingParams[4], // _stakingTransitionTimeframeLength
67+
_stakingWithdrawDisallowPeriod: _stakingParams[5] // _stakingWithdrawDisallowPeriod
68+
}),
6869
_publicKeys,
6970
_internetAddresses
7071
);

contracts/KeyGenHistory.sol

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pragma solidity =0.8.17;
2-
pragma experimental ABIEncoderV2;
32

43
import "./interfaces/IKeyGenHistory.sol";
54
import "./interfaces/IValidatorSetHbbft.sol";

contracts/base/StakingHbbftBase.sol

+29-28
Original file line numberDiff line numberDiff line change
@@ -341,59 +341,60 @@ contract StakingHbbftBase is UpgradeableOwned, IStakingHbbft {
341341

342342
/// @dev Initializes the network parameters.
343343
/// Can only be called by the constructor of the `InitializerHbbft` contract or owner.
344-
/// @param _validatorSetContract The address of the `ValidatorSetHbbft` contract.
345-
/// @param _initialStakingAddresses The array of initial validators' staking addresses.
346-
/// @param _delegatorMinStake The minimum allowed amount of delegator stake in Wei.
347-
/// @param _candidateMinStake The minimum allowed amount of candidate/validator stake in Wei.
348-
/// @param _stakingFixedEpochDuration The fixed duration of each epoch before keyGen starts.
349-
/// @param _stakingTransitionTimeframeLength Length of the timeframe in seconds for the transition
344+
/// @param stakingParams stores other parameters due to stack too deep issue
345+
/// _validatorSetContract The address of the `ValidatorSetHbbft` contract.
346+
/// _initialStakingAddresses The array of initial validators' staking addresses.
347+
/// _delegatorMinStake The minimum allowed amount of delegator stake in Wei.
348+
/// _candidateMinStake The minimum allowed amount of candidate/validator stake in Wei.
349+
/// _stakingFixedEpochDuration The fixed duration of each epoch before keyGen starts.
350+
/// _stakingTransitionTimeframeLength Length of the timeframe in seconds for the transition
350351
/// to the new validator set.
351-
/// @param _stakingWithdrawDisallowPeriod The duration period at the end of a staking epoch
352+
/// _stakingWithdrawDisallowPeriod The duration period at the end of a staking epoch
352353
/// during which participants cannot stake/withdraw/order/claim their staking coins
353354
function initialize(
354-
address _validatorSetContract,
355-
address[] calldata _initialStakingAddresses,
356-
uint256 _delegatorMinStake,
357-
uint256 _candidateMinStake,
358-
uint256 _maxStake,
359-
uint256 _stakingFixedEpochDuration,
360-
uint256 _stakingTransitionTimeframeLength,
361-
uint256 _stakingWithdrawDisallowPeriod,
355+
StakingParams calldata stakingParams,
362356
bytes32[] calldata _publicKeys,
363357
bytes16[] calldata _internetAddresses
364358
) external {
365-
require(_stakingFixedEpochDuration != 0, "FixedEpochDuration is 0");
366359
require(
367-
_stakingFixedEpochDuration > _stakingWithdrawDisallowPeriod,
360+
stakingParams._stakingFixedEpochDuration != 0,
361+
"FixedEpochDuration is 0"
362+
);
363+
require(
364+
stakingParams._stakingFixedEpochDuration >
365+
stakingParams._stakingWithdrawDisallowPeriod,
368366
"FixedEpochDuration must be longer than withdrawDisallowPeriod"
369367
);
370368
require(
371-
_stakingWithdrawDisallowPeriod != 0,
369+
stakingParams._stakingWithdrawDisallowPeriod != 0,
372370
"WithdrawDisallowPeriod is 0"
373371
);
374372
require(
375-
_stakingTransitionTimeframeLength != 0,
373+
stakingParams._stakingTransitionTimeframeLength != 0,
376374
"The transition timeframe must be longer than 0"
377375
);
378376
require(
379-
_stakingTransitionTimeframeLength < _stakingFixedEpochDuration,
377+
stakingParams._stakingTransitionTimeframeLength <
378+
stakingParams._stakingFixedEpochDuration,
380379
"The transition timeframe must be shorter then the epoch duration"
381380
);
382381

383382
_initialize(
384-
_validatorSetContract,
385-
_initialStakingAddresses,
386-
_delegatorMinStake,
387-
_candidateMinStake,
388-
_maxStake,
383+
stakingParams._validatorSetContract,
384+
stakingParams._initialStakingAddresses,
385+
stakingParams._delegatorMinStake,
386+
stakingParams._candidateMinStake,
387+
stakingParams._maxStake,
389388
_publicKeys,
390389
_internetAddresses
391390
);
392-
stakingFixedEpochDuration = _stakingFixedEpochDuration;
393-
stakingWithdrawDisallowPeriod = _stakingWithdrawDisallowPeriod;
391+
stakingFixedEpochDuration = stakingParams._stakingFixedEpochDuration;
392+
stakingWithdrawDisallowPeriod = stakingParams
393+
._stakingWithdrawDisallowPeriod;
394394
//note: this might be still 0 when created in the genesis block.
395395
stakingEpochStartTime = validatorSetContract.getCurrentTimestamp();
396-
stakingTransitionTimeframeLength = _stakingTransitionTimeframeLength;
396+
stakingTransitionTimeframeLength = stakingParams
397+
._stakingTransitionTimeframeLength;
397398
}
398399

399400
/// @dev Removes a specified pool from the `pools` array (a list of active pools which can be retrieved by the

contracts/interfaces/IKeyGenHistory.sol

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pragma solidity =0.8.17;
2-
pragma experimental ABIEncoderV2;
32

43
interface IKeyGenHistory {
54
function initialize(

contracts/interfaces/IStakingHbbft.sol

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
pragma solidity =0.8.17;
22

33
interface IStakingHbbft {
4+
struct StakingParams {
5+
address _validatorSetContract;
6+
address[] _initialStakingAddresses;
7+
uint256 _delegatorMinStake;
8+
uint256 _candidateMinStake;
9+
uint256 _maxStake;
10+
uint256 _stakingFixedEpochDuration;
11+
uint256 _stakingTransitionTimeframeLength;
12+
uint256 _stakingWithdrawDisallowPeriod;
13+
}
14+
415
function incrementStakingEpoch() external;
516

617
function initialize(
7-
address,
8-
address[] calldata,
9-
uint256,
10-
uint256,
11-
uint256,
12-
uint256,
13-
uint256,
14-
uint256,
18+
StakingParams calldata,
1519
bytes32[] calldata,
1620
bytes16[] calldata
1721
) external;

hardhat.config.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ const config: {} = {
127127
solidity: {
128128
version: "0.8.17",
129129
settings: {
130-
viaIR: true,
131130
// metadata: {
132131
// // Not including the metadata hash
133132
// // https://github.com/paulrberg/hardhat-template/issues/31
@@ -138,7 +137,11 @@ const config: {} = {
138137
optimizer: {
139138
enabled: true,
140139
runs: 800,
140+
details: {
141+
yul: true,
142+
},
141143
},
144+
evmVersion: "istanbul"
142145
},
143146
},
144147
typechain: {

test/BlockRewardHbbft.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
RandomHbbftMock,
77
ValidatorSetHbbftMock,
88
StakingHbbftCoinsMock,
9-
KeyGenHistory
9+
KeyGenHistory,
10+
IStakingHbbft
1011
} from "../src/types";
1112

1213
import fp from 'lodash/fp';
@@ -141,16 +142,20 @@ describe('BlockRewardHbbft', () => {
141142
initialStakingAddresses, // _initialStakingAddresses
142143
);
143144

145+
let structure: IStakingHbbft.InitializerStruct = {
146+
_validatorSetContract: validatorSetHbbft.address,
147+
_initialStakingAddresses: initialStakingAddresses,
148+
_delegatorMinStake: MIN_STAKE,
149+
_candidateMinStake: MIN_STAKE,
150+
_maxStake: MAX_STAKE,
151+
_stakingFixedEpochDuration: STAKING_FIXED_EPOCH_DURATION,
152+
_stakingTransitionTimeframeLength: STAKING_TRANSITION_WINDOW_LENGTH,
153+
_stakingWithdrawDisallowPeriod: STAKE_WITHDRAW_DISALLOW_PERIOD
154+
};
155+
144156
// Initialize StakingHbbft
145157
await stakingHbbft.initialize(
146-
validatorSetHbbft.address, // _validatorSetContract
147-
initialStakingAddresses, // _initialStakingAddresses
148-
MIN_STAKE, // _delegatorMinStake
149-
MIN_STAKE, // _candidateMinStake
150-
MAX_STAKE, // _maxStake
151-
STAKING_FIXED_EPOCH_DURATION, // _stakingFixedEpochDuration,
152-
STAKING_TRANSITION_WINDOW_LENGTH, // _stakingTransitionTimeframeLength
153-
STAKE_WITHDRAW_DISALLOW_PERIOD, // _stakeWithdrawDisallowPeriod
158+
structure, // initializer structure
154159
initialValidatorsPubKeys, // _publicKeys
155160
initialValidatorsIpAddresses // _internetAddresses
156161
);

0 commit comments

Comments
 (0)