33import { Card } from "@pythnetwork/component-library/Card" ;
44import { Label } from "@pythnetwork/component-library/unstyled/Label" ;
55import { Input } from "@pythnetwork/component-library/unstyled/TextField" ;
6- import { clsx } from "clsx" ;
76import { useState , useEffect } from "react" ;
87
98import styles from "./index.module.scss" ;
109
1110// Components for mathematical notation
1211const MathExpression = ( { children } : { children : React . ReactNode } ) => (
13- < span className = { clsx ( styles . mathExpression ) } > { children } </ span >
12+ < span className = { styles . mathExpression } > { children } </ span >
1413) ;
1514
1615// Component for subscripts and superscripts
@@ -35,42 +34,38 @@ const RewardSimulator: React.FC = () => {
3534 const [ delegatorRewardRate , setDelegatorRewardRate ] = useState ( 0 ) ;
3635
3736 useEffect ( ( ) => {
38- const calculateRewards = ( ) => {
39- const totalStake = publisherStake + delegatorStake ;
40- const eligibleAmount = Math . min ( totalStake , maxCap ) ;
41- const totalReward = ( rewardRate / 100 ) * eligibleAmount ;
42-
43- const publisherRewardBase =
44- ( rewardRate / 100 ) * Math . min ( publisherStake , maxCap ) ;
45- const delegatorRewardBase = totalReward - publisherRewardBase ;
46-
47- const delegatorFeeAmount = ( delegatorFee / 100 ) * delegatorRewardBase ;
48-
49- const finalDelegatorReward = delegatorRewardBase - delegatorFeeAmount ;
50- const finalPublisherReward = publisherRewardBase + delegatorFeeAmount ;
51-
52- setPublisherReward ( Number ( finalPublisherReward . toFixed ( 2 ) ) ) ;
53- setDelegatorReward ( Number ( finalDelegatorReward . toFixed ( 2 ) ) ) ;
54- setPublisherRewardRate (
55- Number ( ( ( finalPublisherReward * 100 ) / publisherStake ) . toFixed ( 2 ) ) ,
56- ) ;
57- setDelegatorRewardRate (
58- Number ( ( ( finalDelegatorReward * 100 ) / delegatorStake ) . toFixed ( 2 ) ) ,
59- ) ;
60- } ;
61-
62- calculateRewards ( ) ;
37+ const totalStake = publisherStake + delegatorStake ;
38+ const eligibleAmount = Math . min ( totalStake , maxCap ) ;
39+ const totalReward = ( rewardRate / 100 ) * eligibleAmount ;
40+
41+ const publisherRewardBase =
42+ ( rewardRate / 100 ) * Math . min ( publisherStake , maxCap ) ;
43+ const delegatorRewardBase = totalReward - publisherRewardBase ;
44+
45+ const delegatorFeeAmount = ( delegatorFee / 100 ) * delegatorRewardBase ;
46+
47+ const finalDelegatorReward = delegatorRewardBase - delegatorFeeAmount ;
48+ const finalPublisherReward = publisherRewardBase + delegatorFeeAmount ;
49+
50+ setPublisherReward ( Number ( finalPublisherReward . toFixed ( 2 ) ) ) ;
51+ setDelegatorReward ( Number ( finalDelegatorReward . toFixed ( 2 ) ) ) ;
52+ setPublisherRewardRate (
53+ Number ( ( ( finalPublisherReward * 100 ) / publisherStake ) . toFixed ( 2 ) ) ,
54+ ) ;
55+ setDelegatorRewardRate (
56+ Number ( ( ( finalDelegatorReward * 100 ) / delegatorStake ) . toFixed ( 2 ) ) ,
57+ ) ;
6358 } , [ publisherStake , delegatorStake , maxCap , delegatorFee , rewardRate ] ) ;
6459
6560 return (
6661 < Card
6762 variant = "secondary"
6863 title = "Reward Simulator"
6964 nonInteractive
70- className = { clsx ( styles . card ) }
65+ className = { styles . card }
7166 >
72- < div className = { clsx ( styles . inputGrid ) } >
73- < div className = { clsx ( styles . inputGroup ) } >
67+ < div className = { styles . inputGrid } >
68+ < div className = { styles . inputGroup } >
7469 < Label htmlFor = "publisher-stake" >
7570 Publisher Stake (
7671 < MathExpression >
@@ -86,12 +81,12 @@ const RewardSimulator: React.FC = () => {
8681 onChange = { ( e ) => {
8782 setPublisherStake ( Number ( e . target . value ) ) ;
8883 } }
89- className = { clsx ( styles . input ) }
84+ className = { styles . input ?? "" }
9085 min = "0"
9186 />
9287 </ div >
9388
94- < div className = { clsx ( styles . inputGroup ) } >
89+ < div className = { styles . inputGroup } >
9590 < Label htmlFor = "delegator-stake" >
9691 Delegator Stake (
9792 < MathExpression >
@@ -107,12 +102,12 @@ const RewardSimulator: React.FC = () => {
107102 onChange = { ( e ) => {
108103 setDelegatorStake ( Number ( e . target . value ) ) ;
109104 } }
110- className = { clsx ( styles . input ) }
105+ className = { styles . input ?? "" }
111106 min = "0"
112107 />
113108 </ div >
114109
115- < div className = { clsx ( styles . inputGroup ) } >
110+ < div className = { styles . inputGroup } >
116111 < Label htmlFor = "max-cap" >
117112 Maximum Cap (
118113 < MathExpression >
@@ -127,12 +122,12 @@ const RewardSimulator: React.FC = () => {
127122 onChange = { ( e ) => {
128123 setMaxCap ( Number ( e . target . value ) ) ;
129124 } }
130- className = { clsx ( styles . input ) }
125+ className = { styles . input ?? "" }
131126 min = "0"
132127 />
133128 </ div >
134129
135- < div className = { clsx ( styles . inputGroup ) } >
130+ < div className = { styles . inputGroup } >
136131 < Label htmlFor = "delegator-fee" >
137132 Delegator Fee (< MathExpression > f</ MathExpression > ) (%):
138133 </ Label >
@@ -143,14 +138,14 @@ const RewardSimulator: React.FC = () => {
143138 onChange = { ( e ) => {
144139 setDelegatorFee ( Number ( e . target . value ) ) ;
145140 } }
146- className = { clsx ( styles . input ) }
141+ className = { styles . input ?? "" }
147142 min = "0"
148143 max = "100"
149144 step = "0.1"
150145 />
151146 </ div >
152147
153- < div className = { clsx ( styles . inputGroup ) } >
148+ < div className = { styles . inputGroup } >
154149 < Label htmlFor = "reward-rate" >
155150 Reward Rate (< MathExpression > r</ MathExpression > ) (%):
156151 </ Label >
@@ -161,76 +156,72 @@ const RewardSimulator: React.FC = () => {
161156 onChange = { ( e ) => {
162157 setRewardRate ( Number ( e . target . value ) ) ;
163158 } }
164- className = { clsx ( styles . input ) }
159+ className = { styles . input ?? "" }
165160 min = "0"
166161 max = "100"
167162 step = "0.1"
168163 />
169164 </ div >
170165 </ div >
171166
172- < div className = { clsx ( styles . resultsSection ) } >
173- < div className = { clsx ( styles . resultsGrid ) } >
174- < div className = { clsx ( styles . resultGroup ) } >
175- < h4 className = { clsx ( styles . resultTitle ) } > Calculated Rewards</ h4 >
176- < div className = { clsx ( styles . resultValues ) } >
177- < p className = { clsx ( styles . resultItem ) } >
178- < span className = { clsx ( styles . resultLabel ) } >
167+ < div className = { styles . resultsSection } >
168+ < div className = { styles . resultsGrid } >
169+ < div className = { styles . resultGroup } >
170+ < h4 className = { styles . resultTitle } > Calculated Rewards</ h4 >
171+ < div className = { styles . resultValues } >
172+ < p className = { styles . resultItem } >
173+ < span className = { styles . resultLabel } >
179174 Publisher Reward (
180175 < MathExpression >
181176 R< Sup > p</ Sup >
182177 < Sub > p</ Sub >
183178 </ MathExpression >
184179 ):
185180 </ span > { " " }
186- < span className = { clsx ( styles . resultValue ) } >
187- { publisherReward }
188- </ span >
181+ < span className = { styles . resultValue } > { publisherReward } </ span >
189182 </ p >
190- < p className = { clsx ( styles . resultItem ) } >
191- < span className = { clsx ( styles . resultLabel ) } >
183+ < p className = { styles . resultItem } >
184+ < span className = { styles . resultLabel } >
192185 Delegator Reward (
193186 < MathExpression >
194187 R< Sup > d</ Sup >
195188 < Sub > p</ Sub >
196189 </ MathExpression >
197190 ):
198191 </ span > { " " }
199- < span className = { clsx ( styles . resultValue ) } >
200- { delegatorReward }
201- </ span >
192+ < span className = { styles . resultValue } > { delegatorReward } </ span >
202193 </ p >
203194 </ div >
204195 </ div >
205196
206- < div className = { clsx ( styles . resultGroup ) } >
207- < h4 className = { clsx ( styles . resultTitle ) } >
197+ < div className = { styles . resultGroup } >
198+ < h4 className = { styles . resultTitle } >
208199 Calculated Reward Rates (Yearly)
209200 </ h4 >
210- < div className = { clsx ( styles . resultValues ) } >
211- < p className = { clsx ( styles . resultItem ) } >
212- < span className = { clsx ( styles . resultLabel ) } >
201+ < div className = { styles . resultValues } >
202+ < p className = { styles . resultItem } >
203+ < span className = { styles . resultLabel } >
213204 Publisher Rate (
214205 < MathExpression >
215206 r< Sup > p</ Sup >
216207 < Sub > p</ Sub >
217208 </ MathExpression >
218209 ):
219210 </ span > { " " }
220- < span className = { clsx ( styles . resultValue ) } >
211+ < span className = { styles . resultValue } >
221212 { publisherRewardRate } %
222213 </ span >
223214 </ p >
224- < p className = { clsx ( styles . resultItem ) } >
225- < span className = { clsx ( styles . resultLabel ) } >
215+ < p className = { styles . resultItem } >
216+ < span className = { styles . resultLabel } >
226217 Delegator Rate (
227218 < MathExpression >
228219 r< Sup > d</ Sup >
229220 < Sub > p</ Sub >
230221 </ MathExpression >
231222 ):
232223 </ span > { " " }
233- < span className = { clsx ( styles . resultValue ) } >
224+ < span className = { styles . resultValue } >
234225 { delegatorRewardRate } %
235226 </ span >
236227 </ p >
0 commit comments