tx · 2xTuDxd9TYCpDyWZsfoVoLSbKkZjBHCzwPdEtBjkjDPr

3N1p8KYgT8gPKQKmEAwC7dZqaCxixcLQENQ:  -0.03200000 Waves

2022.06.12 07:18 [2092669] smart account 3N1p8KYgT8gPKQKmEAwC7dZqaCxixcLQENQ > SELF 0.00000000 Waves

{ "type": 13, "id": "2xTuDxd9TYCpDyWZsfoVoLSbKkZjBHCzwPdEtBjkjDPr", "fee": 3200000, "feeAssetId": null, "timestamp": 1655007529804, "version": 2, "chainId": 84, "sender": "3N1p8KYgT8gPKQKmEAwC7dZqaCxixcLQENQ", "senderPublicKey": "2j8G3B9DwxqTkiUNTjLcakB9EwF3vC2XjM1Wpo1WXo2a", "proofs": [ "4zoitVD5DAyd9sbE1uciCDhQgUCotUJ4NZPGRMsQUXUJKNFezR6rApHsVfhhANaRVGPGyjWz7fAFDrzrTm1WL1w6" ], "script": "base64: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YmFsYW5jZQUAAAAHX3N0YWtlcgEAAAAQdXBkYXRlUmV3YXJkUmF0ZQAAAAEAAAALX3Jld2FyZFJhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtfcmV3YXJkUmF0ZQUAAAALX3Jld2FyZFJhdGUFAAAAA25pbAEAAAAKdXBkYXRlVGltZQAAAAIAAAAPX2xhc3RVcGRhdGVUaW1lAAAADV9wZXJpb2RGaW5pc2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGtfbGFzdFVwZGF0ZVRpbWUFAAAAD19sYXN0VXBkYXRlVGltZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa19wZXJpb2RGaW5pc2gFAAAADV9wZXJpb2RGaW5pc2gFAAAAA25pbAEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABAAAAFV9yZXdhcmRQZXJUb2tlblN0b3JlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAWa19yZXdhcmRQZXJUb2tlblN0b3JlZAUAAAAVX3Jld2FyZFBlclRva2VuU3RvcmVkBQAAAANuaWwBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwAAAAdfc3Rha2VyAAAAB19yZXdhcmQAAAATX3VzZXJSZXdhcmRQZXJUb2tlbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAMa191c2VyUmV3YXJkBQAAAAdfc3Rha2VyBQAAAAdfcmV3YXJkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABRrX3VzZXJSZXdhcmRQZXJUb2tlbgUAAAAHX3N0YWtlcgUAAAATX3VzZXJSZXdhcmRQZXJUb2tlbgUAAAADbmlsAQAAAA11cGRhdGVCYWxhbmNlAAAAAgAAAAdfc3Rha2VyAAAABl9kZWx0YQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAJa19iYWxhbmNlBQAAAAdfc3Rha2VyCQAAZAAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAZfZGVsdGEFAAAAA25pbAEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAJAABpAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAAAAAAA+gBAAAADnJld2FyZFBlclRva2VuAAAAAAMJAAAAAAAAAgkBAAAAC3RvdGFsU3VwcGx5AAAAAAAAAAAAAAAAAAkBAAAAFHJld2FyZFBlclRva2VuU3RvcmVkAAAAAAkAAGQAAAACCQEAAAAUcmV3YXJkUGVyVG9rZW5TdG9yZWQAAAAACQAAaQAAAAIJAABoAAAAAgkAAGUAAAACCQEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAJAQAAAA5sYXN0VXBkYXRlVGltZQAAAAAJAQAAAApyZXdhcmRSYXRlAAAAAAkBAAAAC3RvdGFsU3VwcGx5AAAAAAEAAAAGZWFybmVkAAAAAgAAAAdfc3Rha2VyAAAACF9iYWxhbmNlBAAAAAtyZXdhcmREZWx0YQkAAGUAAAACCQEAAAAOcmV3YXJkUGVyVG9rZW4AAAAACQEAAAAWdXNlclJld2FyZFBlclRva2VuUGFpZAAAAAEFAAAAB19zdGFrZXIJAABkAAAAAgkAAGgAAAACBQAAAAhfYmFsYW5jZQUAAAALcmV3YXJkRGVsdGEJAQAAAAdyZXdhcmRzAAAAAQUAAAAHX3N0YWtlcgEAAAAMdXBkYXRlUmV3YXJkAAAAAgAAAAdfc3Rha2VyAAAACF9iYWxhbmNlBAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAADnJld2FyZFBlclRva2VuAAAAAAQAAAARbmV3TGFzdFVwZGF0ZVRpbWUJAQAAABNjdXJyZW50VGltZXN0YW1wU2VjAAAAAAQAAAALJHQwMzMxMzM0ODYDCQEAAAACIT0AAAACBQAAAAdfc3Rha2VyAgAAAAAJAAUUAAAAAgkBAAAABmVhcm5lZAAAAAIFAAAAB19zdGFrZXIFAAAACF9iYWxhbmNlBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkABRQAAAACAAAAAAAAAAAAAAAAAAAAAAAABAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDAzMzEzMzQ4NgAAAAJfMQQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwMzMxMzM0ODYAAAACXzIJAAUWAAAABAUAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQFAAAAEW5ld0xhc3RVcGRhdGVUaW1lBQAAAAxzdGFrZXJFYXJuZWQFAAAAGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAAAAAUAAAABaQEAAAAFc3Rha2UAAAAABAAAAAdfc3Rha2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAHX2Ftb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50AwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAADVFNOCQAAAgAAAAECAAAAFUludmFsaWQgc3Rha2luZyBhc3NldAQAAAALJHQwMzc5NjM5NzgJAQAAAAx1cGRhdGVSZXdhcmQAAAACBQAAAAdfc3Rha2VyCQAAZAAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAdfYW1vdW50BAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFAAAACyR0MDM3OTYzOTc4AAAAAl8xBAAAABFuZXdMYXN0VXBkYXRlVGltZQgFAAAACyR0MDM3OTYzOTc4AAAAAl8yBAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDAzNzk2Mzk3OAAAAAJfMwQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwMzc5NjM5NzgAAAACXzQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAABF1cGRhdGVVc2VyUmV3YXJkcwAAAAMFAAAAB19zdGFrZXIAAAAAAAAAAAAFAAAAGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBAAAAGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAAAAAQUAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQAAAAp1cGRhdGVUaW1lAAAAAgUAAAARbmV3TGFzdFVwZGF0ZVRpbWUJAQAAAAxwZXJpb2RGaW5pc2gAAAAACQEAAAANdXBkYXRlQmFsYW5jZQAAAAIFAAAAB19zdGFrZXIFAAAAB19hbW91bnQAAAABaQEAAAAHdW5TdGFrZQAAAAEAAAAHX2Ftb3VudAQAAAAHX3N0YWtlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAB19hbW91bnQJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyCQAAAgAAAAECAAAAD0ludmFsaWQgYmFsYW5jZQQAAAALJHQwNDM5MzQ1NzUJAQAAAAx1cGRhdGVSZXdhcmQAAAACBQAAAAdfc3Rha2VyCQAAZQAAAAIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyBQAAAAdfYW1vdW50BAAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFAAAACyR0MDQzOTM0NTc1AAAAAl8xBAAAABFuZXdMYXN0VXBkYXRlVGltZQgFAAAACyR0MDQzOTM0NTc1AAAAAl8yBAAAAAxzdGFrZXJFYXJuZWQIBQAAAAskdDA0MzkzNDU3NQAAAAJfMwQAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUAAAALJHQwNDM5MzQ1NzUAAAACXzQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwUAAAAHX3N0YWtlcgAAAAAAAAAAAAUAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAABFuZXdMYXN0VXBkYXRlVGltZQkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAQAAAA11cGRhdGVCYWxhbmNlAAAAAgUAAAAHX3N0YWtlcgkBAAAAAS0AAAABBQAAAAdfYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAHX2Ftb3VudAUAAAADVFNOBQAAAANuaWwAAAABaQEAAAAPd2l0aGRyYXdSZXdhcmRzAAAAAAQAAAAHX3N0YWtlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACyR0MDQ5OTA1MTQyCQEAAAAMdXBkYXRlUmV3YXJkAAAAAgUAAAAHX3N0YWtlcgkBAAAACWJhbGFuY2VPZgAAAAEFAAAAB19zdGFrZXIEAAAAF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCAUAAAALJHQwNDk5MDUxNDIAAAACXzEEAAAAEW5ld0xhc3RVcGRhdGVUaW1lCAUAAAALJHQwNDk5MDUxNDIAAAACXzIEAAAADHN0YWtlckVhcm5lZAgFAAAACyR0MDQ5OTA1MTQyAAAAAl8zBAAAABhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQIBQAAAAskdDA0OTkwNTE0MgAAAAJfNAMJAABnAAAAAgAAAAAAAAAAAAUAAAAMc3Rha2VyRWFybmVkCQAAAgAAAAECAAAACU5vIHJld2FyZAkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAAEXVwZGF0ZVVzZXJSZXdhcmRzAAAAAwUAAAAHX3N0YWtlcgAAAAAAAAAAAAUAAAAYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAABFuZXdMYXN0VXBkYXRlVGltZQkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxzdGFrZXJFYXJuZWQFAAAABFVTRE4FAAAAA25pbAAAAAFpAQAAAAphZGRSZXdhcmRzAAAAAAMJAQAAAAIhPQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQFAAAABFVTRE4JAAACAAAAAQIAAAAaSW52YWxpaWQgYWRkUmV3YXJkcyBwYXJhbXMEAAAAB19yZXdhcmQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQICQEAAAAMdXBkYXRlUmV3YXJkAAAAAgUAAAALTk9fQURERFJFU1MFAAAACU5PX1NUQUtFUgAAAAJfMQQAAAAJdGltZXN0YW1wCQEAAAATY3VycmVudFRpbWVzdGFtcFNlYwAAAAAEAAAADW5ld1Jld2FyZFJhdGUDCQAAZgAAAAIFAAAACXRpbWVzdGFtcAkBAAAADHBlcmlvZEZpbmlzaAAAAAAJAABpAAAAAgUAAAAHX3Jld2FyZAUAAAAIRFVSQVRJT04EAAAADXJlbWFpbmluZ1RpbWUJAABlAAAAAgkBAAAADHBlcmlvZEZpbmlzaAAAAAAFAAAACXRpbWVzdGFtcAQAAAAIbGVmdG92ZXIJAABoAAAAAgkBAAAACnJld2FyZFJhdGUAAAAABQAAAA1yZW1haW5pbmdUaW1lCQAAaQAAAAIJAABkAAAAAgUAAAAHX3Jld2FyZAUAAAAIbGVmdG92ZXIFAAAACERVUkFUSU9OCQAETgAAAAIJAAROAAAAAgkBAAAAEHVwZGF0ZVJld2FyZFJhdGUAAAABBQAAAA1uZXdSZXdhcmRSYXRlCQEAAAAadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQAAAABBQAAABduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBAAAACnVwZGF0ZVRpbWUAAAACBQAAAAl0aW1lc3RhbXAJAABkAAAAAgUAAAAJdGltZXN0YW1wBQAAAAhEVVJBVElPTgAAAAFpAQAAAAt2aWV3X3Jld2FyZAAAAAEAAAAHX3N0YWtlcgQAAAAMc3Rha2VyRWFybmVkCAkBAAAADHVwZGF0ZVJld2FyZAAAAAIFAAAAB19zdGFrZXIJAQAAAAliYWxhbmNlT2YAAAABBQAAAAdfc3Rha2VyAAAAAl8zCQAAAgAAAAEJAAGkAAAAAQUAAAAMc3Rha2VyRWFybmVkAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXl3o0f4", "height": 2092669, "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'3N2dUZwYyfMXi4dXxbXgq2X9GyruHcrkscS')
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 int0 (k) = valueOrElse(getInteger(this, k), 0)
52+
53+
54+func totalSupply () = int(k_totalSupply)
55+
56+
57+func rewardPerTokenStored () = int(k_rewardPerTokenStored)
58+
59+
60+func lastUpdateTime () = int(k_lastUpdateTime)
61+
62+
63+func rewardRate () = int(k_rewardRate)
64+
65+
66+func periodFinish () = int0(k_periodFinish)
67+
68+
69+func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
70+
71+
72+func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
73+
74+
75+func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
76+
77+
78+func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
79+
80+
81+func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
82+
83+
84+func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
85+
86+
87+func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
88+
89+
90+func updateBalance (_staker,_delta) = [IntegerEntry(toCompositeKey(k_balance, _staker), (balanceOf(_staker) + _delta))]
91+
92+
93+func currentTimestampSec () = (lastBlock.timestamp / 1000)
94+
95+
96+func rewardPerToken () = if ((totalSupply() == 0))
97+ then rewardPerTokenStored()
98+ else (rewardPerTokenStored() + (((currentTimestampSec() - lastUpdateTime()) * rewardRate()) / totalSupply()))
99+
100+
101+func earned (_staker,_balance) = {
102+ let rewardDelta = (rewardPerToken() - userRewardPerTokenPaid(_staker))
103+ ((_balance * rewardDelta) + rewards(_staker))
104+ }
105+
106+
107+func updateReward (_staker,_balance) = {
108+ let newRewardPerTokenStored = rewardPerToken()
109+ let newLastUpdateTime = currentTimestampSec()
110+ let $t033133486 = if ((_staker != ""))
111+ then $Tuple2(earned(_staker, _balance), newRewardPerTokenStored)
112+ else $Tuple2(0, 0)
113+ let stakerEarned = $t033133486._1
114+ let stakerRewardPerTokenPaid = $t033133486._2
115+ $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
116+ }
117+
118+
119+@Callable(i)
120+func stake () = {
121+ let _staker = toString(i.caller)
122+ let _amount = i.payments[0].amount
123+ if ((i.payments[0].assetId != TSN))
124+ then throw("Invalid staking asset")
125+ else {
126+ let $t037963978 = updateReward(_staker, (balanceOf(_staker) + _amount))
127+ let newRewardPerTokenStored = $t037963978._1
128+ let newLastUpdateTime = $t037963978._2
129+ let stakerEarned = $t037963978._3
130+ let stakerRewardPerTokenPaid = $t037963978._4
131+ (((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
132+ }
133+ }
134+
135+
136+
137+@Callable(i)
138+func unStake (_amount) = {
139+ let _staker = toString(i.caller)
140+ if ((_amount > balanceOf(_staker)))
141+ then throw("Invalid balance")
142+ else {
143+ let $t043934575 = updateReward(_staker, (balanceOf(_staker) - _amount))
144+ let newRewardPerTokenStored = $t043934575._1
145+ let newLastUpdateTime = $t043934575._2
146+ let stakerEarned = $t043934575._3
147+ let stakerRewardPerTokenPaid = $t043934575._4
148+ ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(_amount))) ++ [ScriptTransfer(i.caller, _amount, TSN)])
149+ }
150+ }
151+
152+
153+
154+@Callable(i)
155+func withdrawRewards () = {
156+ let _staker = toString(i.caller)
157+ let $t049905142 = updateReward(_staker, balanceOf(_staker))
158+ let newRewardPerTokenStored = $t049905142._1
159+ let newLastUpdateTime = $t049905142._2
160+ let stakerEarned = $t049905142._3
161+ let stakerRewardPerTokenPaid = $t049905142._4
162+ if ((0 >= stakerEarned))
163+ then throw("No reward")
164+ else (((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ [ScriptTransfer(i.caller, stakerEarned, USDN)])
165+ }
166+
167+
168+
169+@Callable(i)
170+func addRewards () = if ((i.payments[0].assetId != USDN))
171+ then throw("Invaliid addRewards params")
172+ else {
173+ let _reward = i.payments[0].amount
174+ let newRewardPerTokenStored = updateReward(NO_ADDDRESS, NO_STAKER)._1
175+ let timestamp = currentTimestampSec()
176+ let newRewardRate = if ((timestamp > periodFinish()))
177+ then (_reward / DURATION)
178+ else {
179+ let remainingTime = (periodFinish() - timestamp)
180+ let leftover = (rewardRate() * remainingTime)
181+ ((_reward + leftover) / DURATION)
182+ }
183+ ((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(timestamp, (timestamp + DURATION)))
184+ }
185+
186+
187+
188+@Callable(i)
189+func view_reward (_staker) = {
190+ let stakerEarned = updateReward(_staker, balanceOf(_staker))._3
191+ throw(toString(stakerEarned))
192+ }
193+
194+
195+@Verifier(tx)
196+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
197+

github/deemru/w8io/169f3d6 
45.49 ms