tx · D6TYaZeedRgErmTQhgRTdYZotxi8NPR6X711YYJR14NR

3MzjjX9VGt9GCfJY1THfyP952X6shfzoSf7:  -0.03200000 Waves

2022.06.11 14:15 [2091651] smart account 3MzjjX9VGt9GCfJY1THfyP952X6shfzoSf7 > SELF 0.00000000 Waves

{ "type": 13, "id": "D6TYaZeedRgErmTQhgRTdYZotxi8NPR6X711YYJR14NR", "fee": 3200000, "feeAssetId": null, "timestamp": 1654946174933, "version": 2, "chainId": 84, "sender": "3MzjjX9VGt9GCfJY1THfyP952X6shfzoSf7", "senderPublicKey": "59tXRHNYRtDt5hwvN88jQkFYMC56o5W8ctJPipyMEV8m", "proofs": [ "5jSkWbcxsHzMVLUPC1qyc2PjAGDYAFwgWgUQed1ehnS3iTe5XTs4u62kFi99y1qb7L7LKuKPQd2Rqu68P1RJMgXN" ], "script": "base64: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c2l0ZUtleQAAAAIFAAAACWtfYmFsYW5jZQUAAAAHX3N0YWtlcgAAAAAAAAAAAAEAAAAQdXBkYXRlUmV3YXJkUmF0ZQAAAAEAAAALX3Jld2FyZFJhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtfcmV3YXJkUmF0ZQUAAAALX3Jld2FyZFJhdGUFAAAAA25pbAEAAAAKdXBkYXRlVGltZQAAAAIAAAAPX2xhc3RVcGRhdGVUaW1lAAAADV9wZXJpb2RGaW5pc2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGtfbGFzdFVwZGF0ZVRpbWUFAAAAD19sYXN0VXBkYXRlVGltZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa19wZXJpb2RGaW5pc2gFAAAADV9wZXJpb2RGaW5pc2gFAAAAA25pbAEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABAAAAFV9yZXdhcmRQZXJUb2tlblN0b3JlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAWa19yZXdhcmRQZXJUb2tlblN0b3JlZAUAAAAVX3Jld2FyZFBlclRva2VuU3RvcmVkBQAAAANuaWwBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwAAAAdfc3Rha2VyAAAAB19yZXdhcmQAAAATX3VzZXJSZXdhcmRQZXJUb2tlbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAMa191c2VyUmV3YXJkBQAAAAdfc3Rha2VyBQAAAAdfcmV3YXJkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABRrX3VzZXJSZXdhcmRQZXJUb2tlbgUAAAAHX3N0YWtlcgUAAAATX3VzZXJSZXdhcmRQZXJUb2tlbgUAAAADbmlsAQAAAA11cGRhdGVCYWxhbmNlAAAAAgAAAAdfc3Rha2VyAAAABl9kZWx0YQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAJa19iYWxhbmNlBQAAAAdfc3Rha2VyCQAAZAAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAZfZGVsdGEFAAAAA25pbAEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAJAABpAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAAAAAAA+gBAAAADnJld2FyZFBlclRva2VuAAAAAAMJAAAAAAAAAgkBAAAAC3RvdGFsU3VwcGx5AAAAAAAAAAAAAAAAAAkBAAAAFHJld2FyZFBlclRva2VuU3RvcmVkAAAAAAkAAGQAAAACCQEAAAAUcmV3YXJkUGVyVG9rZW5TdG9yZWQAAAAACQAAaQAAAAIJAABoAAAAAgkAAGUAAAACCQEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAJAQAAAA5sYXN0VXBkYXRlVGltZQAAAAAJAQAAAApyZXdhcmRSYXRlAAAAAAkBAAAAC3RvdGFsU3VwcGx5AAAAAAEAAAAGZWFybmVkAAAAAgAAAAdfc3Rha2VyAAAACF9iYWxhbmNlBAAAAAtyZXdhcmREZWx0YQkAAGUAAAACCQEAAAAOcmV3YXJkUGVyVG9rZW4AAAAACQEAAAAWdXNlclJld2FyZFBlclRva2VuUGFpZAAAAAEFAAAAB19zdGFrZXIJAABkAAAAAgkAAGgAAAACBQAAAAhfYmFsYW5jZQUAAAALcmV3YXJkRGVsdGEJAQAAAAdyZXdhcmRzAAAAAQUAAAAHX3N0YWtlcgEAAAAMdXBkYXRlUmV3YXJkAAAAAgAAAAdfc3Rha2VyAAAACF9iYWxhbmNlBAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAADnJld2FyZFBlclRva2VuAAAAAAQAAAARbmV3TGFzdFVwZGF0ZVRpbWUJAQAAABNjdXJyZW50VGltZXN0YW1wU2VjAAAAAAQAAAALJHQwMzMzMjM1MDUDCQEAAAACIT0AAAACBQAAAAdfc3Rha2VyAgAAAAAJAAUUAAAAAgkBAAAABmVhcm5lZAAAAAIFAAAAB19zdGFrZXIFAAAACF9iYWxhbmNlBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkABRQAAAACAAAAAAAAAAAAAAAAAAAAAAAABAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDAzMzMyMzUwNQAAAAJfMQQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwMzMzMjM1MDUAAAACXzIJAAUWAAAABAUAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQFAAAAEW5ld0xhc3RVcGRhdGVUaW1lBQAAAAxzdGFrZXJFYXJuZWQFAAAAGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAAAAAUAAAABaQEAAAAFc3Rha2UAAAAABAAAAAdfc3Rha2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAHX2Ftb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50AwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAADVFNOCQAAAgAAAAECAAAAFUludmFsaWQgc3Rha2luZyBhc3NldAQAAAALJHQwMzgxNTM5OTcJAQAAAAx1cGRhdGVSZXdhcmQAAAACBQAAAAdfc3Rha2VyCQAAZAAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAdfYW1vdW50BAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFAAAACyR0MDM4MTUzOTk3AAAAAl8xBAAAABFuZXdMYXN0VXBkYXRlVGltZQgFAAAACyR0MDM4MTUzOTk3AAAAAl8yBAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDAzODE1Mzk5NwAAAAJfMwQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwMzgxNTM5OTcAAAACXzQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAABF1cGRhdGVVc2VyUmV3YXJkcwAAAAMFAAAAB19zdGFrZXIAAAAAAAAAAAAFAAAAGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBAAAAGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAAAAAQUAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQAAAAp1cGRhdGVUaW1lAAAAAgUAAAARbmV3TGFzdFVwZGF0ZVRpbWUJAQAAAAxwZXJpb2RGaW5pc2gAAAAACQEAAAANdXBkYXRlQmFsYW5jZQAAAAIFAAAAB19zdGFrZXIFAAAAB19hbW91bnQAAAABaQEAAAAHdW5TdGFrZQAAAAEAAAAHX2Ftb3VudAQAAAAHX3N0YWtlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAB19hbW91bnQJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyCQAAAgAAAAECAAAAD0ludmFsaWQgYmFsYW5jZQQAAAALJHQwNDQxMjQ1OTQJAQAAAAx1cGRhdGVSZXdhcmQAAAACBQAAAAdfc3Rha2VyCQAAZQAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAdfYW1vdW50BAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFAAAACyR0MDQ0MTI0NTk0AAAAAl8xBAAAABFuZXdMYXN0VXBkYXRlVGltZQgFAAAACyR0MDQ0MTI0NTk0AAAAAl8yBAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDA0NDEyNDU5NAAAAAJfMwQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwNDQxMjQ1OTQAAAACXzQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwUAAAAHX3N0YWtlcgAAAAAAAAAAAAUAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAABFuZXdMYXN0VXBkYXRlVGltZQkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAQAAAA11cGRhdGVCYWxhbmNlAAAAAgUAAAAHX3N0YWtlcgkBAAAAAS0AAAABBQAAAAdfYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAHX2Ftb3VudAUAAAADVFNOBQAAAANuaWwAAAABaQEAAAAPd2l0aGRyYXdSZXdhcmRzAAAAAAQAAAAHX3N0YWtlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACyR0MDUwMDk1MTYxCQEAAAAMdXBkYXRlUmV3YXJkAAAAAgUAAAAHX3N0YWtlcgkBAAAACWJhbGFuY2VPZgAAAAEFAAAAB19zdGFrZXIEAAAAF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCAUAAAALJHQwNTAwOTUxNjEAAAACXzEEAAAAEW5ld0xhc3RVcGRhdGVUaW1lCAUAAAALJHQwNTAwOTUxNjEAAAACXzIEAAAADHN0YWtlckVhcm5lZAgFAAAACyR0MDUwMDk1MTYxAAAAAl8zBAAAABhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQIBQAAAAskdDA1MDA5NTE2MQAAAAJfNAMJAABnAAAAAgAAAAAAAAAAAAUAAAAMc3Rha2VyRWFybmVkCQAAAgAAAAECAAAACU5vIHJld2FyZAkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwUAAAAHX3N0YWtlcgAAAAAAAAAAAAUAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAABFuZXdMYXN0VXBkYXRlVGltZQkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxzdGFrZXJFYXJuZWQFAAAABFVTRE4FAAAAA25pbAAAAAFpAQAAAAphZGRSZXdhcmRzAAAAAAMJAQAAAAIhPQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQFAAAABFVTRE4JAAACAAAAAQIAAAAaSW52YWxpaWQgYWRkUmV3YXJkcyBwYXJhbXMEAAAAB19yZXdhcmQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQICQEAAAAMdXBkYXRlUmV3YXJkAAAAAgUAAAALTk9fQURERFJFU1MFAAAACU5PX1NUQUtFUgAAAAJfMQQAAAAJdGltZXN0YW1wCQEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAEAAAADW5ld1Jld2FyZFJhdGUDCQAAZgAAAAIFAAAACXRpbWVzdGFtcAkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAABpAAAAAgUAAAAHX3Jld2FyZAUAAAAIRFVSQVRJT04EAAAADXJlbWFpbmluZ1RpbWUJAABlAAAAAgkBAAAADHBlcmlvZEZpbmlzaAAAAAAFAAAACXRpbWVzdGFtcAQAAAAIbGVmdG92ZXIJAABoAAAAAgkBAAAACnJld2FyZFJhdGUAAAAABQAAAA1yZW1haW5pbmdUaW1lCQAAaQAAAAIJAABkAAAAAgUAAAAHX3Jld2FyZAUAAAAIbGVmdG92ZXIFAAAACERVUkFUSU9OCQAETgAAAAIJAAROAAAAAgkBAAAAEHVwZGF0ZVJld2FyZFJhdGUAAAABBQAAAA1uZXdSZXdhcmRSYXRlCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAAAl0aW1lc3RhbXAJAABkAAAAAgUAAAAJdGltZXN0YW1wBQAAAAhEVVJBVElPTgAAAAFpAQAAAAt2aWV3X3Jld2FyZAAAAAEAAAAHX3N0YWtlcgQAAAAMc3Rha2VyRWFybmVkCAkBAAAADHVwZGF0ZVJld2FyZAAAAAIFAAAAB19zdGFrZXIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyAAAAAl8zCQAAAgAAAAEJAAGkAAAAAQUAAAAMc3Rha2VyRWFybmVkAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXmZaLXB", "height": 2091651, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let k_totalSupply = "k_totalSupply"
5+
6+let k_lastUpdateTime = "k_lastUpdateTime"
7+
8+let k_rewardPerTokenStored = "k_rewardPerTokenStored"
9+
10+let k_rewardRate = "k_rewardRate"
11+
12+let k_periodFinish = "k_periodFinish"
13+
14+let k_balance = "k_balance"
15+
16+let k_userRewardPerToken = "k_userRewardPerToken"
17+
18+let k_userReward = "k_userReward"
19+
20+let ADMIN_ADDRESS = Address(base58'3NAQjwY35wDTZhPyNUUuw9qUaaTfpZSWaVA')
21+
22+let USDN = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
23+
24+let TSN = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNY'
25+
26+let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
27+
28+let DURATION = ((60 * 60) * 24)
29+
30+let NO_ADDDRESS = ""
31+
32+let NO_STAKER = 0
33+
34+func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
35+
36+
37+func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
38+
39+
40+func abs (_x) = if ((_x > 0))
41+ then _x
42+ else -(_x)
43+
44+
45+func toCompositeKey (_key,_address) = ((_key + "_") + _address)
46+
47+
48+func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
49+
50+
51+func totalSupply () = int(k_totalSupply)
52+
53+
54+func rewardPerTokenStored () = int(k_rewardPerTokenStored)
55+
56+
57+func lastUpdateTime () = int(k_lastUpdateTime)
58+
59+
60+func rewardRate () = int(k_rewardRate)
61+
62+
63+func periodFinish () = int(k_periodFinish)
64+
65+
66+func rewards (_staker) = valueOrElse(getInteger(this, toCompositeKey(k_userReward, _staker)), 0)
67+
68+
69+func userRewardPerTokenPaid (_staker) = valueOrElse(getInteger(this, toCompositeKey(k_userRewardPerToken, _staker)), 0)
70+
71+
72+func balanceOf (_staker) = valueOrElse(getInteger(this, toCompositeKey(k_balance, _staker)), 0)
73+
74+
75+func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
76+
77+
78+func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
79+
80+
81+func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
82+
83+
84+func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
85+
86+
87+func updateBalance (_staker,_delta) = [IntegerEntry(toCompositeKey(k_balance, _staker), (balanceOf(_staker) + _delta))]
88+
89+
90+func currentTimestampSec () = (lastBlock.timestamp / 1000)
91+
92+
93+func rewardPerToken () = if ((totalSupply() == 0))
94+ then rewardPerTokenStored()
95+ else (rewardPerTokenStored() + (((currentTimestampSec() - lastUpdateTime()) * rewardRate()) / totalSupply()))
96+
97+
98+func earned (_staker,_balance) = {
99+ let rewardDelta = (rewardPerToken() - userRewardPerTokenPaid(_staker))
100+ ((_balance * rewardDelta) + rewards(_staker))
101+ }
102+
103+
104+func updateReward (_staker,_balance) = {
105+ let newRewardPerTokenStored = rewardPerToken()
106+ let newLastUpdateTime = currentTimestampSec()
107+ let $t033323505 = if ((_staker != ""))
108+ then $Tuple2(earned(_staker, _balance), newRewardPerTokenStored)
109+ else $Tuple2(0, 0)
110+ let stakerEarned = $t033323505._1
111+ let stakerRewardPerTokenPaid = $t033323505._2
112+ $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
113+ }
114+
115+
116+@Callable(i)
117+func stake () = {
118+ let _staker = toString(i.caller)
119+ let _amount = i.payments[0].amount
120+ if ((i.payments[0].assetId != TSN))
121+ then throw("Invalid staking asset")
122+ else {
123+ let $t038153997 = updateReward(_staker, (balanceOf(_staker) + _amount))
124+ let newRewardPerTokenStored = $t038153997._1
125+ let newLastUpdateTime = $t038153997._2
126+ let stakerEarned = $t038153997._3
127+ let stakerRewardPerTokenPaid = $t038153997._4
128+ (((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
129+ }
130+ }
131+
132+
133+
134+@Callable(i)
135+func unStake (_amount) = {
136+ let _staker = toString(i.caller)
137+ if ((_amount > balanceOf(_staker)))
138+ then throw("Invalid balance")
139+ else {
140+ let $t044124594 = updateReward(_staker, (balanceOf(_staker) - _amount))
141+ let newRewardPerTokenStored = $t044124594._1
142+ let newLastUpdateTime = $t044124594._2
143+ let stakerEarned = $t044124594._3
144+ let stakerRewardPerTokenPaid = $t044124594._4
145+ ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(_amount))) ++ [ScriptTransfer(i.caller, _amount, TSN)])
146+ }
147+ }
148+
149+
150+
151+@Callable(i)
152+func withdrawRewards () = {
153+ let _staker = toString(i.caller)
154+ let $t050095161 = updateReward(_staker, balanceOf(_staker))
155+ let newRewardPerTokenStored = $t050095161._1
156+ let newLastUpdateTime = $t050095161._2
157+ let stakerEarned = $t050095161._3
158+ let stakerRewardPerTokenPaid = $t050095161._4
159+ if ((0 >= stakerEarned))
160+ then throw("No reward")
161+ else (((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ [ScriptTransfer(i.caller, stakerEarned, USDN)])
162+ }
163+
164+
165+
166+@Callable(i)
167+func addRewards () = if ((i.payments[0].assetId != USDN))
168+ then throw("Invaliid addRewards params")
169+ else {
170+ let _reward = i.payments[0].amount
171+ let newRewardPerTokenStored = updateReward(NO_ADDDRESS, NO_STAKER)._1
172+ let timestamp = currentTimestampSec()
173+ let newRewardRate = if ((timestamp > periodFinish()))
174+ then (_reward / DURATION)
175+ else {
176+ let remainingTime = (periodFinish() - timestamp)
177+ let leftover = (rewardRate() * remainingTime)
178+ ((_reward + leftover) / DURATION)
179+ }
180+ ((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(timestamp, (timestamp + DURATION)))
181+ }
182+
183+
184+
185+@Callable(i)
186+func view_reward (_staker) = {
187+ let stakerEarned = updateReward(_staker, balanceOf(_staker))._3
188+ throw(toString(stakerEarned))
189+ }
190+
191+
192+@Verifier(tx)
193+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
194+

github/deemru/w8io/169f3d6 
18.84 ms