
Summer.fi (ex Oasis.app) is one of DeFi’s oldest and most trusted platforms, renowned for curating the best protocols. The contest focuses on the second deployment of Summer.fi governance contracts, including the new governance token xSumr, the SummerGovernor, and two staking modules: a vesting wallets staking module and a SUMR (OFT-enabled) token staking module.
Scope
On what chains are the smart contracts going to be deployed?
all contracts - base
SummerGovernorV2 - base, sonic, arbitrum, mainnet
If you are integrating tokens, are you allowing only whitelisted tokens to work with the codebase or any complying with the standard? Are they assumed to have certain properties, e.g. be non-reentrant? Are there any types of weird tokens you want to integrate?
staking token will be : https://basescan.org/address/0x194f360D130F2393a5E9F3117A6a1B78aBEa1624
reward tokens -> sumr,usdc,usdt,weth,wbtc,eurc
Even though Sumr token is not globaly transferable right now, it should be considered that when the protocol is deployed Sumr token will be globally transferable and transferEnabled will be true.
Are there any limitations on values set by admins (or other roles) in the codebase, including restrictions on array lengths?
SummerStaking.solupdateLockupBucketCap(Bucket _bucket, uint256 _newCap) (onlyGovernor)_newCap.type(uint256).max effectively unlimited.updatePenaltyEnabled(bool _penaltyEnabled) (onlyGovernor)rescueToken(address _token, address _to) (onlyGovernor)_token != address(WRAPPED_SUMMER_TOKEN); _to any non-zero address implied by SafeERC20 semantics.MAX_LOCKUP_PERIOD = 3*365d, MAX_AMOUNT_OF_STAKES = 1000, penalty bounds 2%–20%.SummerVestingWalletsEscrow.soladdVestingFactory(address _vestingFactory) (onlyGovernor)_vestingFactory != 0, must not already be added (duplicate prevented).removeVestingFactory(address _vestingFactory) (onlyGovernor)_vestingFactory != 0, must exist in set.rescueWallet(address _wallet, address _newOwner) (onlyGovernor)_newOwner != 0.rescueToken(address _token, address _to) (onlyGovernor)_token != 0, _to != 0.address[] _initialVestingFactoriesStakedSummerToken.sol (xSUMR)addStakingModule/removeStakingModule(address) (onlyGovernor)add requires non-zero; remove no additional constraints.MINTER_ROLE and BURNER_ROLE.grantMinterRole/revokeMinterRole(address) (onlyGovernor)pause/unpause() (onlyGuardianOrGovernor)_canTransfer).burnFrom allowed only by token owner or addresses with BURNER_ROLE (and still respects allowance).AccessControl.grantRole/revokeRole are disabled; must use the provided governed functions.SummerGovernorV2.solproposalThreshold must be within [1000e18, 100000e18] at deploy time (via _validateProposalThreshold).sendProposalToTargetChain(...) (onlyGovernance, onlyHubChain)_payNative(uint256) requires contract balance ≥ quoted native fee.receive() accepts ETH only from LayerZero endpoint or the timelock().Are there any limitations on values set by admins (or other roles) in protocols you integrate with, including restrictions on array lengths?
No. For integrated protocols, we place no additional limits on admin-set values or array lengths; those protocols’ own governance is assumed trusted.
Is the codebase expected to comply with any specific EIPs?
-
Are there any off-chain mechanisms involved in the protocol (e.g., keeper bots, arbitrage bots, etc.)? We assume these mechanisms will not misbehave, delay, or go offline unless otherwise specified.
-
What properties/invariants do you want to hold even if breaking them has a low/unknown impact?
Voting power is always equal to the amount of staked summer / summer is staked vesting wallet
Please discuss any design choices you made.
The StakingRewardsManagerBase, SummerGovernor, and SummerTimelockController contracts form the basis of the V2 version. They were chosen because they have existing security audits from Chainsecurity and Prototech, which was preferable to developing new contracts from scratch. A summary of the audit reports and their findings is available in the README_GovernanceV2.md file.
Please provide links to previous audits (if any) and all the known issues or acceptable risks.
StakingRewardsManagerBase.sol,ProtocolAccessManaged.sol,ConfigurationManaged.sol REPORTStakingRewardsManagerBase.sol, SummerGovernor.sol REPORTIn StakingRewardsManagerBase, calling notifyRewardAmount(rewardToken, reward, newRewardsDuration) for an already-configured reward token will revert if newRewardsDuration differs from the stored rewardsDuration for that token. This is enforced to prevent mid-stream schedule changes:
// For existing reward tokens, check if current period is complete
if (_isRewardToken(rewardToken)) {
if (newRewardsDuration != rewardTokenData.rewardsDuration) {
revert CannotChangeRewardsDuration();
}
}
rewardsDuration, wait until the current reward period finishes, then call setRewardsDuration(rewardToken, newDuration). Passing a different duration via notifyRewardAmount will fail for existing tokens.setRewardsDuration after the prior period ends. Attempting to extend/shorten during an active period is intentionally disallowed.Please list any relevant protocol resources.
Additional audit information.
The StakingRewardsManagerBase is forked from the Synthetix rewards contract and adds support for multiple reward tokens. SummerStaking inherits from StakingRewardsManagerBase.
Governance is advised to wait for the rewards period to end - even if it was the same duration (if not - to use the setRewardsDuration and then notify). In general, governance should be assumed trusted enough not to cause any issues/problems to the protocol and/or the users.
Total Rewards
Contest Pool
Lead Senior Watson
Lead Judge
24,400 USDC
11,500 USDC
3,500 USDC
Status
Scope
Start Time
End Time
Judging Rules