Skip to content

Commit 6fb6cb0

Browse files
authored
Merge pull request #69 from 0xIntuition/ENG-1379-in-out-examples
ENG-1379: Create in/out test use cases based on numbers
2 parents c076f68 + 2e3b0a3 commit 6fb6cb0

File tree

3 files changed

+470
-26
lines changed

3 files changed

+470
-26
lines changed

_playground/ethmultivault.py

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
from decimal import *
2+
from web3 import Web3
3+
import math
4+
5+
6+
## ------------ Parameters ------------
7+
8+
# Atom
9+
atomCreationProtocolFee = Web3.to_wei(Decimal('0.0002'), 'ether')
10+
atomWalletInitialDepositAmount = Web3.to_wei(Decimal('0.0001'), 'ether')
11+
12+
# Triple
13+
tripleCreationProtocolFee = Web3.to_wei(Decimal('0.0002'), 'ether')
14+
atomDepositFractionOnTripleCreation = Web3.to_wei(Decimal('0.0003'), 'ether')
15+
atomDepositFractionForTriple = 1500 # 15%
16+
17+
# General
18+
minShare = Web3.to_wei(Decimal('0.0000000000001'), 'ether')
19+
protocolFee = 100 # 1%
20+
entryFee = 500 # 5%
21+
feeDenominator = 10000
22+
23+
# Costs
24+
atomCost = Decimal(atomCreationProtocolFee) + Decimal(atomWalletInitialDepositAmount) + Decimal(minShare)
25+
tripleCost = Decimal(tripleCreationProtocolFee) + Decimal(atomDepositFractionOnTripleCreation) + Decimal(2) * Decimal(minShare)
26+
27+
28+
## ------------ Functions ------------
29+
30+
def createAtom(value: Decimal) -> tuple[Decimal, Decimal, Decimal, Decimal, Decimal]:
31+
# Variables
32+
userDeposit = value - atomCost
33+
protocolFeeAmount = math.ceil(userDeposit * Decimal(protocolFee) / Decimal(feeDenominator))
34+
userDepositAfterProtocolFees = userDeposit - Decimal(protocolFeeAmount)
35+
36+
# Atom vault
37+
userShares = userDepositAfterProtocolFees
38+
totalShares = userDepositAfterProtocolFees + Decimal(atomWalletInitialDepositAmount) + Decimal(minShare)
39+
totalAssets = totalShares
40+
41+
# Addresses
42+
atomWalletShares = Decimal(atomWalletInitialDepositAmount)
43+
zeroWalletShares = minShare
44+
protocolVaultAssets = Decimal(atomCreationProtocolFee) + Decimal(protocolFeeAmount)
45+
46+
return (userShares, totalShares, totalAssets, atomWalletShares, protocolVaultAssets)
47+
48+
def createTriple(value: Decimal) -> tuple[Decimal, Decimal, Decimal, Decimal, Decimal, Decimal, Decimal, Decimal, Decimal]:
49+
# Variables
50+
userDeposit = value - tripleCost
51+
protocolFeeAmount = math.ceil(userDeposit * Decimal(protocolFee) / Decimal(feeDenominator))
52+
userDepositAfterProtocolFees = userDeposit - Decimal(protocolFeeAmount)
53+
atomDepositFraction = userDepositAfterProtocolFees * Decimal(atomDepositFractionForTriple) / Decimal(feeDenominator)
54+
perAtom = atomDepositFraction / Decimal(3)
55+
userAssetsAfterAtomDepositFraction = userDepositAfterProtocolFees - atomDepositFraction
56+
entryFeeAmount = perAtom * Decimal(entryFee) / Decimal(feeDenominator)
57+
assetsForTheAtom = perAtom - entryFeeAmount
58+
userSharesAfterTotalFees = assetsForTheAtom # assuming current price = 1 ether
59+
60+
# Triple vaults
61+
userSharesPositiveVault = userAssetsAfterAtomDepositFraction
62+
totalSharesPositiveVault = userAssetsAfterAtomDepositFraction + Decimal(minShare)
63+
totalAssetsPositiveVault = totalSharesPositiveVault
64+
totalSharesNegativeVault = Decimal(minShare)
65+
totalAssetsNegativeVault = Decimal(minShare)
66+
67+
# Underlying atom's vaults
68+
userSharesAtomVault = userSharesAfterTotalFees
69+
totalAssetsAtomVault = assetsForTheAtom + entryFeeAmount + Decimal(atomDepositFractionOnTripleCreation) / Decimal(3)
70+
totalSharesAtomVault = userSharesAfterTotalFees
71+
72+
# Addresses
73+
#zeroWalletShares = Decimal(2) * Decimal(minShare)
74+
protocolVaultAssets = Decimal(tripleCreationProtocolFee) + Decimal(protocolFeeAmount)
75+
76+
return (userSharesPositiveVault,
77+
totalSharesPositiveVault,
78+
totalAssetsPositiveVault,
79+
totalSharesNegativeVault,
80+
totalAssetsNegativeVault,
81+
userSharesAtomVault,
82+
totalSharesAtomVault,
83+
totalAssetsAtomVault,
84+
protocolVaultAssets)
85+
86+
87+
## ------------ Create atom data ------------
88+
89+
print()
90+
print("Create atom data")
91+
92+
for value in [
93+
atomCost,
94+
Decimal(atomCost) + Decimal(1),
95+
Web3.to_wei(Decimal('1'), 'ether'),
96+
Web3.to_wei(Decimal('10'), 'ether'),
97+
Web3.to_wei(Decimal('100'), 'ether'),
98+
Web3.to_wei(Decimal('1000'), 'ether'),
99+
]:
100+
(userShares, totalShares, totalAssets, atomWalletShares, protocolVaultAssets) = createAtom(value)
101+
102+
print(f"useCaseAtoms.push(UseCaseAtom({{ \
103+
value: {value}, \
104+
userShares: {userShares}, \
105+
atomWalletShares: {atomWalletShares}, \
106+
totalShares: {totalShares}, \
107+
totalAssets: {totalAssets}, \
108+
protocolVaultAssets: {protocolVaultAssets} \
109+
}}));".replace(" ", ''))
110+
111+
112+
## ------------ Create Triple data ------------
113+
114+
print()
115+
print("Create triple data")
116+
117+
for value in [
118+
tripleCost,
119+
Decimal(tripleCost) + Decimal(1),
120+
Web3.to_wei(Decimal('1'), 'ether'),
121+
Web3.to_wei(Decimal('10'), 'ether'),
122+
Web3.to_wei(Decimal('100'), 'ether'),
123+
Web3.to_wei(Decimal('1000'), 'ether'),
124+
]:
125+
# Create atoms
126+
(userShares0, totalShares0, totalAssets0, atomWalletShares0, protocolVaultAssets0) = createAtom(value)
127+
(userShares1, totalShares1, totalAssets1, atomWalletShares1, protocolVaultAssets1) = createAtom(value + Decimal(1))
128+
(userShares2, totalShares2, totalAssets2, atomWalletShares2, protocolVaultAssets2) = createAtom(value + Decimal(2))
129+
130+
# Create triple
131+
(userSharesPositiveVault, totalSharesPositiveVault, totalAssetsPositiveVault, totalSharesNegativeVault,
132+
totalAssetsNegativeVault, userSharesAtomVault,totalSharesAtomVault, totalAssetsAtomVault, protocolVaultAssets) = createTriple(value)
133+
134+
print(f"useCaseTriples.push(UseCaseTriple({{ \
135+
value: {value}, \
136+
userShares: {userSharesPositiveVault}, \
137+
totalSharesPos: {totalSharesPositiveVault}, \
138+
totalAssetsPos: {totalAssetsPositiveVault}, \
139+
totalSharesNeg: {totalSharesNegativeVault}, \
140+
totalAssetsNeg: {totalAssetsNegativeVault}, \
141+
protocolVaultAssets: {protocolVaultAssets0 + protocolVaultAssets1 + protocolVaultAssets2 + protocolVaultAssets}, \
142+
subject:UseCaseAtom({{ \
143+
value: {value}, \
144+
userShares: {userShares0 + userSharesAtomVault}, \
145+
atomWalletShares: {atomWalletShares0}, \
146+
totalShares: {totalShares0 + totalSharesAtomVault}, \
147+
totalAssets: {totalAssets0 + totalAssetsAtomVault}, \
148+
protocolVaultAssets: {protocolVaultAssets0} \
149+
}}), \
150+
predicate:UseCaseAtom({{ \
151+
value: {value + Decimal(1)}, \
152+
userShares: {userShares1 + userSharesAtomVault}, \
153+
atomWalletShares: {atomWalletShares1}, \
154+
totalShares: {totalShares1 + totalSharesAtomVault}, \
155+
totalAssets: {totalAssets1 + totalAssetsAtomVault}, \
156+
protocolVaultAssets: {protocolVaultAssets1} \
157+
}}), \
158+
obj:UseCaseAtom({{ \
159+
value: {value + Decimal(2)}, \
160+
userShares: {userShares2 + userSharesAtomVault}, \
161+
atomWalletShares: {atomWalletShares2}, \
162+
totalShares: {totalShares2 + totalSharesAtomVault}, \
163+
totalAssets: {totalAssets2 + totalAssetsAtomVault}, \
164+
protocolVaultAssets: {protocolVaultAssets2} \
165+
}}) \
166+
}}));".replace(" ", ''))

test/EthMultiVaultBase.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ contract EthMultiVaultBase is Test, IEthMultiVaultEvents {
103103
(, totalShares) = ethMultiVault.vaults(id);
104104
}
105105

106+
function getCounterIdFromTriple(uint256 id) public view returns (uint256 counterId) {
107+
counterId = ethMultiVault.getCounterIdFromTriple(id);
108+
}
109+
106110
function vaultBalanceOf(uint256 id, address account) public view returns (uint256 shares) {
107111
(shares,) = ethMultiVault.getVaultStateForUser(id, account);
108112
}

0 commit comments

Comments
 (0)