This is the main repository for the Kwenta token and respective system contracts (staking, escrow, distribution, etc..).
An extended ERC20 contract constructed with the name “Kwenta”, symbolized as “KWENTA”, and with an initial supply of 313373. Initial distribution is handled by the deployer in the deploy script.
Only the currently set SupplySchedule contract has control over minting.
Similar to Synthetix's SupplySchedule, this contract describes the inflationary supply schedule over the next four years. There is 1% terminal inflation. Inflation begins as soon as the contract is deployed. Decay begins on week 2, meaning the first week’s rewards are not affected by decay. The current inflation target is roughly 1,009,409.43 KWENTA tokens at the end of four years. The initial weekly emission is calculated from INITIAL SUPPLY * 240% APY. Decay occurs at a rate of 2.05% a week and this should bring the weekly emission near the 1% APY mark at the end of four years.
Minting KWENTA can only be performed once a week. A minting fee is issued first to ensure sustainable rewards for minter. After which, a percentage of the new supply will be diverted to the treasury (20%). Another percentage will be diverted to the trading rewards distribution contract (20%). The remainder will go into StakingRewards.
A modified StakingRewards contract with added support for escrowed KWENTA staking.
When rewards are harvested they are escrowed in RewardEscrow for a year.
Based on Synthetix’s BaseRewardEscrowV2 with migration and account merging functionality stripped out. Supports appending escrow entries from StakingRewards, but also open to anyone with createEscrowEntry
. For example, the treasuryDAO will use this feature to escrow rewards for DAO beneficiaries.
Any escrowed Kwenta can also be staked back into StakingRewards, boosting potential rewards for stakers. When staked, tokens are not transferred, but an “escrowedBalance” is accounted for in StakingRewards. There is additional logic to make sure sufficient Kwenta is unstaked when vesting rewards.
Another mechanism introduced here is a linearly decaying vesting fee that allows beneficiaries to vest early – at a cost. Immediate vesting is subject to a fee that is 80% of the escrowed amount. It falls to 0% as the reward reaches the end of the escrow duration. The fee is sent to the kwenta treasury.
Distribution manager for the initial KWENTA distribution. Details are described in KIP-13 and scripts used to generate the distribution can be found under scripts/distribution/.
A companion contract deployed to Ethereum Mainnet to enable multisigs on L1 to claim retroactively earned KWENTA on L2.
Modified MerkleDistributor that supports rewards over multiple epochs. This will be used in conjunction with a trading rewards calculation script to pay out incentives. A portion of inflation is routed towards this contract every mint.
Staking was upgraded to V2 on the 11th of July 2023. This introduces changes described by the following KIPS:
- KIP-42: delegation of claiming ability
- KIP-58: checkpointing system and migration to V2
- KIP-62: transferable escrow entries
- KIP-77: upgradeable staking contracts
- KIP-86: support for staking integrators
- KIP-75: 50% of early vest fees distributed to stakers
Here is an overview of the changes:
Here is an explanation of the migration process:
Three main new contracts were deployed:
RewardEscrowV2.sol
- upgraded version ofRewardEscrow
StakingRewardsV2.sol
- upgraded version ofStakingRewards
EscrowMigrator.sol
- used for the migration process.
All of these contracts are upgradeable following the UUPS standard.
Also the following simple non-upgradeable contract was added to help enact KIP-75
:
StakingRewardsNotifier.sol
npm run test
npm run test:contracts
npm run test:integration
npm run test:fork
Run a local hardhat node
npx hardhat node
Deploy contracts to localhost
npm run deploy:local
Run the interact tool
npm run interact:local
You can use scripts such as npm run deploy:stakingv2-tenderly
to deploy and verify contracts on a Tenderly fork.
In order for the verification to work, you must:
- Install
tenderly-cli
brew install tenderly
- Create a Tenderly API Access Token
- Log in to tenderly via the CLI
tenderly login --access-key <KEY>
- Set the tenderly fork URL in your
.env
TENDERLY_FORK_URL=https://rpc.tenderly.co/fork/<KEY>
Now you can run npm run deploy:stakingv2-tenderly
and it will deploy and verify the contracts on Tenderly.
You can also follow the pattern in deploy-stakingv2-tenderly.ts
to deploy and verify other contracts.
Or another example of a tenderly script is get-tenderly-time.ts
.
Note: for contracts with both an implementation and proxy, when interaction with the contract is required, the proxy address should be used.
Contract | Address |
---|---|
Kwenta | 0x920Cf626a271321C151D027030D5d08aF699456b |
SupplySchedule | 0x3e8b82326Ff5f2f10da8CEa117bD44343ccb9c26 |
StakingRewards | 0x6e56A5D49F775BA08041e28030bc7826b13489e0 |
RewardEscrow | 0x1066A8eB3d90Af0Ad3F89839b974658577e75BE2 |
StakingRewardsNotifier | 0xb176DaD2916db0905cd2D65ed54FDC3a878aFFe4 |
StakingRewardsV2 Proxy | 0x61294940CE7cD1BDA10e349adC5B538B722CeB88 |
StakingRewardsV2 Implementation | 0x276df8bfe424Ab1aaD1EFC138eef3099a8ac8FE1 |
RewardEscrowV2 Proxy | 0xb2a20fCdc506a685122847b21E34536359E94C56 |
RewardEscrowV2 Implementation | 0xFBF7D647E94780F2787f8d80DA59DCe74D40C5cc |
EscrowMigrator Proxy | 0xC9aF789Ae606F69cF8Ed073A04eC92f2354b027d |
EscrowMigrator Implementation | 0x10B04483d762Bd4F193F35600112ad52391004A7 |
MultipleMerkleDistributor | 0xf486A72E8c8143ACd9F65A104A16990fDb38be14 |
MultipleMerkleDistributor (ARB) | 0x5733Ef72c134E7A276029CB4ba07Bff8b1163086 |
vKWENTA | 0x6789D8a7a7871923Fc6430432A602879eCB6520a |
vKWENTARedeemer | 0x8132EE584bCD6f8Eb1bea141DB7a7AC1E72917b9 |
Other audit reports to add:
ok I need KWENTA TOKEN TO GO LIVE. like VERY SOON. I cant take this anymore. every day I am checking discord and still no token. every day, check discord, no token. I cant take this anymore, I have under invested, by a lot. it is what it is. but I need the token to GO LIVE ALREADY. can devs DO SOMETHING??