-
Notifications
You must be signed in to change notification settings - Fork 339
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add erc4626 #1170
base: main
Are you sure you want to change the base?
Add erc4626 #1170
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #1170 +/- ##
==========================================
+ Coverage 91.89% 92.31% +0.41%
==========================================
Files 47 48 +1
Lines 1197 1314 +117
==========================================
+ Hits 1100 1213 +113
- Misses 97 101 +4
Continue to review full report in Codecov by Sentry.
|
@andrew-fleming I know this is draft PR, but when going through code, found something. In the FeeConfigTrait, the adjust_mint function says the input is shares, but preview_mint passes assets as input. Similarly adjust_redeem too. Just pointing it out so that it doesn't confuse anyone. If its known, please ignore this comment. |
@akiraonstarknet sorry for the delay, I was on holiday the past couple weeks. And yes, you are correct. The initial param is |
WIP
Fixes #???
PR Checklist
...still a WIP. The tests need to be refactored and improved. The idea was to make sure the logic works as expected so there's a standard (from the openzeppelin solidity tests) for any and all changes moving forward.
Some things to note and discuss:
Decimals
EIP4626 states at the end of the doc:
The OpenZeppelin solidity implementation checks for the underlying asset's tokens upon construction with a try/catch which defaults to
18
decimals if query fails. Given Starknet's current status with try/catch (✌️ dual dispatchers), this doesn't seem like a viable approach. If the vault is for an undeployed token, the deployment will fail. This PR proposes that the decimals (both underlying decimals and offset decimals) are explicitly defined by the contract through the ImmutableConfig.Math
u512 Precision math for multiply and divide (
u256_mul_div
)This PR leverages the corelib's
wide_mul
andu512_safe_div_rem_by_u256
for mathematical precision. This is set as a tmp solution and should be scrutinized further. More tests should be provided and we should look for ways to optimize.Exponentiation
This PR requires exponentiation for converting to shares and assets. The current implementation is the brute force formula. We can definitely improve this.
FeeConfigTrait
This PR proposes to utilize
FeeConfigTrait
(which is really like a hook) for contracts to integrate entry and exit fees forpreview_
fns. The state-changing methods of ERC4626 rely onpreview_
to determine the number of assets or shares to exchange.Another approach that can reduce the verbosity of the traits/hooks is to have a single
adjust_assets_or_shares
function that accepts anExchangeType
.The downside though is I think it's easy to misuse i.e.
IMO having a dedicated function for each exchange type is more difficult to mess up...but it's at the cost of some verbosity.
LimitsConfigTrait
This mirrors the
FeeConfigTrait
except that these target the limits on themax_
methods and return anOption
soOption::None
can point to the default. Same arguments apply for not having a single trait/hook with anExchangeType
parameter.before_withdraw
andafter_deposit
hooksThe
before_withdraw
andafter_deposit
hooks take inspiration from solmate's solidity implementation of erc4626. These hooks are where contracts can transfer fees calculated from theFeeConfigTrait
in the implementing contract. See the Fees mock to see how this works in the proposed PR.