Superfluid is the money streaming protocol, powering a real-time onchain economy. Start earning every second with streaming airdrops, rewards and yield.
Scope
On what chains are the smart contracts going to be deployed?
This smart-contract suite is intended to be deployed on the exhaustive list of networks below :
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?
The project WILL ONLY integrate a Super Token that Superfluid Core Team will deploy.
The token will be deployed as a plain ERC20 on Ethereum Mainnet, will then be wrapped as SuperToken and bridged to other chains / L2 (as Super Token).
The Super Token that will be used with these contracts is similar to the Super Token at the following address :
https://basescan.org/token/0x2112b92A4f6496B7b2f10850857FfA270464d054
For more info regarding SuperTokens, see https://docs.superfluid.finance/docs/category/super-tokens
Are there any limitations on values set by admins (or other roles) in the codebase, including restrictions on array lengths?
FluidEPProgramManager.sol :
createProgram(...)
:programAdmin
and signer
are valid and correct addressesstartFunding(...)
:FluidTreasury
will have granted allowance to this contract for the desired amount prior to this callsubsidyFundingRate
will be set to0
. After some time, the subsidyFundingRate
will be increased to500
(i.e. 5%). It is known that the subsidies will only start flowing for the program funded after the rate is updated.EARLY_PROGRAM_END
is currently set to 7 days. This value could potentially be reduced (to 5 or 3 days). FluidLocker.sol :
lockerOwner
).UNLOCK_AVAILABLE
will initially be set to false
. After some time, the beacon proxy will be updated and this valus will be set to true
.FluidLockerFactory.sol :
Fontaine.sol
initialize(...)
:StakingRewardController.sol
lockerFactory
will be set during deploymentAre there any limitations on values set by admins (or other roles) in protocols you integrate with, including restrictions on array lengths?
No.
Is the codebase expected to comply with any specific EIPs?
The codebase is expected to comply with EIP-1271 (simple signature verification).
Context:
In order to grant units in Superfluid GDA pools, we rely on a third party tool : Stack (see stack.so).
Stack essentially allocates "points" to users based on onchain activity.
On user requests (i.e. when users need to claim these points that are representing pool units), Stack generate a signature that contains user related details and the amount of units to be claimed.
The contract verifies that the signature is originated from a Stack whitelisted signer and allocate the units once the signature is verified.
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.
Yes, as mentioned above, the protocol rely on off-chain signature from a third party to grant GDA pool units to users.
Additionally, Superfluid will run some offchain monitoring system to ensure that programs do not overrun their duration (see PROGRAM_DURATION
in FluidEPProgramManager).
Upon detecting an approaching end of a program a transaction call to stopFunding
will be performed, ensuring that the different streams inherent to a program are closed on time. It is assumed that these calls will be performed on time.
What properties/invariants do you want to hold even if breaking them has a low/unknown impact?
While the boolean UNLOCK_AVAILABLE
is set to false
(initial phase), the sum of all tokens distributed through FluidEPProgramManager
should be equal to the sum of all tokens inside the FluidLocker
instances plus the undistributed amount (still held in the FluidEPProgramManager
contract)
Token distributed through the FluidEPProgramManager
should always land in a FluidLocker
instance (until withdrawn).
The sum of all the token distributed to FluidLocker
instance and distributed to the tax distribution pool (if subsidyFundingRate
is not null) should be equal to the sum of all token distributed through the FluidEPProgramManager
.
Please discuss any design choices you made.
FluidEPProgramManager.stopFunding
function permissionless.
FluidEPProgramManager
contract and stream will not necessarily be liquidated if there are still funds to provision them.FluidEPProgramManager.stopFunding
can create dust.
Stakers units in the tax distribution pools :
Please provide links to previous audits (if any).
N/A
Please list any relevant protocol resources.
Superfluid Docs :
https://docs.superfluid.finance/
Superfluid SuperToken Docs :
https://docs.superfluid.finance/docs/protocol/super-tokens/overview
Superfluid GDA Docs :
https://docs.superfluid.finance/docs/protocol/distributions/overview
Additional audit information.
It is suggested to look carefully at below functions :
In FluidEPProgramManager
:
startFunding
stopFunding
cancelProgram
In FluidLocker
:
unlock
It is also suggested to ensure that the Token cannot be extracted from FluidLocker
instances in any other way than the FluidLocker.unlock
function (it can be assumed that beacon upgrades will not offer such possibility).
Total Rewards
Contest Pool
Lead Senior Watson
Judging Pool
Lead Judge
8,500 USDC
7,000 USDC
750 USDC
Status
Scope
Start Time
End Time
Judging Rules