3
3
import { Card } from "@pythnetwork/component-library/Card" ;
4
4
import { Label } from "@pythnetwork/component-library/unstyled/Label" ;
5
5
import { Input } from "@pythnetwork/component-library/unstyled/TextField" ;
6
- import { clsx } from "clsx" ;
7
6
import { useState , useEffect } from "react" ;
8
7
9
8
import styles from "./index.module.scss" ;
10
9
11
10
// Components for mathematical notation
12
11
const MathExpression = ( { children } : { children : React . ReactNode } ) => (
13
- < span className = { clsx ( styles . mathExpression ) } > { children } </ span >
12
+ < span className = { styles . mathExpression } > { children } </ span >
14
13
) ;
15
14
16
15
// Component for subscripts and superscripts
@@ -35,42 +34,38 @@ const RewardSimulator: React.FC = () => {
35
34
const [ delegatorRewardRate , setDelegatorRewardRate ] = useState ( 0 ) ;
36
35
37
36
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
+ ) ;
63
58
} , [ publisherStake , delegatorStake , maxCap , delegatorFee , rewardRate ] ) ;
64
59
65
60
return (
66
61
< Card
67
62
variant = "secondary"
68
63
title = "Reward Simulator"
69
64
nonInteractive
70
- className = { clsx ( styles . card ) }
65
+ className = { styles . card }
71
66
>
72
- < div className = { clsx ( styles . inputGrid ) } >
73
- < div className = { clsx ( styles . inputGroup ) } >
67
+ < div className = { styles . inputGrid } >
68
+ < div className = { styles . inputGroup } >
74
69
< Label htmlFor = "publisher-stake" >
75
70
Publisher Stake (
76
71
< MathExpression >
@@ -86,12 +81,12 @@ const RewardSimulator: React.FC = () => {
86
81
onChange = { ( e ) => {
87
82
setPublisherStake ( Number ( e . target . value ) ) ;
88
83
} }
89
- className = { clsx ( styles . input ) }
84
+ className = { styles . input ?? "" }
90
85
min = "0"
91
86
/>
92
87
</ div >
93
88
94
- < div className = { clsx ( styles . inputGroup ) } >
89
+ < div className = { styles . inputGroup } >
95
90
< Label htmlFor = "delegator-stake" >
96
91
Delegator Stake (
97
92
< MathExpression >
@@ -107,12 +102,12 @@ const RewardSimulator: React.FC = () => {
107
102
onChange = { ( e ) => {
108
103
setDelegatorStake ( Number ( e . target . value ) ) ;
109
104
} }
110
- className = { clsx ( styles . input ) }
105
+ className = { styles . input ?? "" }
111
106
min = "0"
112
107
/>
113
108
</ div >
114
109
115
- < div className = { clsx ( styles . inputGroup ) } >
110
+ < div className = { styles . inputGroup } >
116
111
< Label htmlFor = "max-cap" >
117
112
Maximum Cap (
118
113
< MathExpression >
@@ -127,12 +122,12 @@ const RewardSimulator: React.FC = () => {
127
122
onChange = { ( e ) => {
128
123
setMaxCap ( Number ( e . target . value ) ) ;
129
124
} }
130
- className = { clsx ( styles . input ) }
125
+ className = { styles . input ?? "" }
131
126
min = "0"
132
127
/>
133
128
</ div >
134
129
135
- < div className = { clsx ( styles . inputGroup ) } >
130
+ < div className = { styles . inputGroup } >
136
131
< Label htmlFor = "delegator-fee" >
137
132
Delegator Fee (< MathExpression > f</ MathExpression > ) (%):
138
133
</ Label >
@@ -143,14 +138,14 @@ const RewardSimulator: React.FC = () => {
143
138
onChange = { ( e ) => {
144
139
setDelegatorFee ( Number ( e . target . value ) ) ;
145
140
} }
146
- className = { clsx ( styles . input ) }
141
+ className = { styles . input ?? "" }
147
142
min = "0"
148
143
max = "100"
149
144
step = "0.1"
150
145
/>
151
146
</ div >
152
147
153
- < div className = { clsx ( styles . inputGroup ) } >
148
+ < div className = { styles . inputGroup } >
154
149
< Label htmlFor = "reward-rate" >
155
150
Reward Rate (< MathExpression > r</ MathExpression > ) (%):
156
151
</ Label >
@@ -161,76 +156,72 @@ const RewardSimulator: React.FC = () => {
161
156
onChange = { ( e ) => {
162
157
setRewardRate ( Number ( e . target . value ) ) ;
163
158
} }
164
- className = { clsx ( styles . input ) }
159
+ className = { styles . input ?? "" }
165
160
min = "0"
166
161
max = "100"
167
162
step = "0.1"
168
163
/>
169
164
</ div >
170
165
</ div >
171
166
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 } >
179
174
Publisher Reward (
180
175
< MathExpression >
181
176
R< Sup > p</ Sup >
182
177
< Sub > p</ Sub >
183
178
</ MathExpression >
184
179
):
185
180
</ span > { " " }
186
- < span className = { clsx ( styles . resultValue ) } >
187
- { publisherReward }
188
- </ span >
181
+ < span className = { styles . resultValue } > { publisherReward } </ span >
189
182
</ p >
190
- < p className = { clsx ( styles . resultItem ) } >
191
- < span className = { clsx ( styles . resultLabel ) } >
183
+ < p className = { styles . resultItem } >
184
+ < span className = { styles . resultLabel } >
192
185
Delegator Reward (
193
186
< MathExpression >
194
187
R< Sup > d</ Sup >
195
188
< Sub > p</ Sub >
196
189
</ MathExpression >
197
190
):
198
191
</ span > { " " }
199
- < span className = { clsx ( styles . resultValue ) } >
200
- { delegatorReward }
201
- </ span >
192
+ < span className = { styles . resultValue } > { delegatorReward } </ span >
202
193
</ p >
203
194
</ div >
204
195
</ div >
205
196
206
- < div className = { clsx ( styles . resultGroup ) } >
207
- < h4 className = { clsx ( styles . resultTitle ) } >
197
+ < div className = { styles . resultGroup } >
198
+ < h4 className = { styles . resultTitle } >
208
199
Calculated Reward Rates (Yearly)
209
200
</ 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 } >
213
204
Publisher Rate (
214
205
< MathExpression >
215
206
r< Sup > p</ Sup >
216
207
< Sub > p</ Sub >
217
208
</ MathExpression >
218
209
):
219
210
</ span > { " " }
220
- < span className = { clsx ( styles . resultValue ) } >
211
+ < span className = { styles . resultValue } >
221
212
{ publisherRewardRate } %
222
213
</ span >
223
214
</ p >
224
- < p className = { clsx ( styles . resultItem ) } >
225
- < span className = { clsx ( styles . resultLabel ) } >
215
+ < p className = { styles . resultItem } >
216
+ < span className = { styles . resultLabel } >
226
217
Delegator Rate (
227
218
< MathExpression >
228
219
r< Sup > d</ Sup >
229
220
< Sub > p</ Sub >
230
221
</ MathExpression >
231
222
):
232
223
</ span > { " " }
233
- < span className = { clsx ( styles . resultValue ) } >
224
+ < span className = { styles . resultValue } >
234
225
{ delegatorRewardRate } %
235
226
</ span >
236
227
</ p >
0 commit comments