tx · ChFNu4pTY1Sa3K8cLSjnwRy8FYHgvHYxXjciEh1gSypr

3N1WbxZTdjLm3L8faJGiCTRk3kfaAofzd16:  -1.20000000 Waves

2022.11.15 17:42 [2318371] smart account 3N1WbxZTdjLm3L8faJGiCTRk3kfaAofzd16 > SELF 0.00000000 Waves

{ "type": 13, "id": "ChFNu4pTY1Sa3K8cLSjnwRy8FYHgvHYxXjciEh1gSypr", "fee": 120000000, "feeAssetId": null, "timestamp": 1668523362243, "version": 2, "chainId": 84, "sender": "3N1WbxZTdjLm3L8faJGiCTRk3kfaAofzd16", "senderPublicKey": "BrpLGAiTnNa5QohVytFPYdF7oZR7Gk1UZfA7c9Uxs9Fw", "proofs": [ "5mZ2ZuL4ZhQecgaDKpDPh7QdVketJjsQpU1TULngkojCuipzG68bmuT7gZyayPjqHp9oLc3hvX2aaZB9VtTZS5K3" ], "script": "base64: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", "height": 2318371, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: J3E1i4aZsafFdwPvvRsQPg946ketakYt2QPADCWxbDi4 Next: GPCRaLfmCssrDvqhoPNDt8ZoDeLkwsc1cHsezzwTr7on Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func keyManagerPublicKey () = getString("managerPublicKey")
4+let PRECISION = 1000000000000000000
5+
6+let DURATION = ((60 * 60) * 24)
7+
8+let DECIMALS = 100000000
9+
10+let k_lastCompoundTime = "k_lastCompoundTime"
11+
12+let k_periodFinish = "k_periodFinish"
13+
14+let k_lastRate = "k_lastRate"
15+
16+let k_growthRate = "k_growthRate"
17+
18+let k_balance = "k_balance"
19+
20+let k_leaseId = "k_leaseId"
21+
22+let k_initialized = "k_initialized"
23+
24+let k_adminPublicKey = "k_adminPublicKey"
25+
26+let k_adminAddress = "k_adminAddress"
27+
28+let k_minerAddress = "k_minerAddress"
29+
30+let k_sWavesAsset = "k_sWavesAssetId"
31+
32+func divd (_x,_y) = fraction(_x, DECIMALS, _y, HALFEVEN)
533
634
7-func managerPublicKeyOrUnit () = match keyManagerPublicKey() {
35+func muld (_x,_y) = fraction(_x, _y, DECIMALS, HALFEVEN)
36+
37+
38+func divp (_x,_y) = fraction(_x, PRECISION, _y, HALFEVEN)
39+
40+
41+func mulp (_x,_y) = fraction(_x, _y, PRECISION, HALFEVEN)
42+
43+
44+func abs (_x) = if ((_x > 0))
45+ then _x
46+ else -(_x)
47+
48+
49+func minv (_x,_y) = if ((_x > _y))
50+ then _y
51+ else _x
52+
53+
54+func toCompositeKey (_key,_address) = ((_key + "_") + _address)
55+
56+
57+func adminAddress () = addressFromString(getStringValue(this, k_adminAddress))
58+
59+
60+func adminPublicKey () = fromBase58String(getStringValue(this, k_adminPublicKey))
61+
62+
63+func minerAddress () = valueOrErrorMessage(addressFromString(getStringValue(this, k_minerAddress)), "Invalid miner address is not set")
64+
65+
66+func sWavesAsset () = fromBase58String(getStringValue(this, k_sWavesAsset))
67+
68+
69+func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
70+
71+
72+func int (k) = valueOrErrorMessage(getInteger(this, k), ("No value for " + k))
73+
74+
75+func int0 (k) = valueOrElse(getInteger(this, k), 0)
76+
77+
78+func lastCompoundTime () = int0(k_lastCompoundTime)
79+
80+
81+func growthRate () = int0(k_growthRate)
82+
83+
84+func balance () = int0(k_balance)
85+
86+
87+func lastRate () = int(k_lastRate)
88+
89+
90+func periodFinish () = int0(k_periodFinish)
91+
92+
93+func adminPublicKeyOrUnit () = match getString(this, k_adminPublicKey) {
894 case s: String =>
995 fromBase58String(s)
1096 case _: Unit =>
14100 }
15101
16102
17-func mustManager (i) = {
103+func mustAdmin (i) = {
18104 let pd = throw("permission denied")
19- match managerPublicKeyOrUnit() {
105+ match adminPublicKeyOrUnit() {
20106 case pk: ByteVector =>
21107 if ((i.callerPublicKey == pk))
22108 then true
31117 }
32118
33119
34-func mustNotInited () = match getBoolean("inited") {
35- case inited: Boolean =>
36- if ((inited == false))
37- then true
38- else throw("Already inited")
120+func currentTimestampSec () = (lastBlock.timestamp / 1000)
121+
122+
123+func dt () = minv(currentTimestampSec(), periodFinish())
124+
125+
126+func cancelLease () = match getBinary(k_leaseId) {
127+ case id: ByteVector =>
128+[LeaseCancel(id), DeleteEntry(k_leaseId)]
39129 case _: Unit =>
40- false
130+ nil
41131 case _ =>
42132 throw("Match error")
43133 }
44134
45135
136+func updateBalance (_amount) = [IntegerEntry(k_balance, _amount)]
137+
138+
139+func updateTime (_lastCompoundTime,_periodFinish) = [IntegerEntry(k_lastCompoundTime, _lastCompoundTime), IntegerEntry(k_periodFinish, _periodFinish)]
140+
141+
142+func updateRate (_rate,_growthRate) = [IntegerEntry(k_lastRate, _rate), IntegerEntry(k_growthRate, _growthRate)]
143+
144+
145+func updateLease (_amount) = if ((_amount > 0))
146+ then {
147+ let newLease = Lease(minerAddress(), _amount)
148+ let newLeaseId = calculateLeaseId(newLease)
149+[newLease, BinaryEntry(k_leaseId, newLeaseId)]
150+ }
151+ else nil
152+
153+
154+func lease (_amount) = if ((_amount == 0))
155+ then nil
156+ else {
157+ let newAmount = (balance() + _amount)
158+ ((cancelLease() ++ updateLease(newAmount)) ++ updateBalance(newAmount))
159+ }
160+
161+
162+func issueSWaves (_amount) = [Reissue(sWavesAsset(), _amount, true)]
163+
164+
165+func burnSWaves (_amount) = [Burn(sWavesAsset(), _amount)]
166+
167+
168+func sendSWaves (_recipient,_amount) = [ScriptTransfer(_recipient, _amount, sWavesAsset())]
169+
170+
171+func sendWaves (_recipient,_amount) = [ScriptTransfer(_recipient, _amount, unit)]
172+
173+
174+func sWavesQuantity () = match assetInfo(sWavesAsset()) {
175+ case asset: Asset =>
176+ asset.quantity
177+ case _ =>
178+ throw("Can't find asset")
179+}
180+
181+
182+func getExcessWaves () = wavesBalance(minerAddress()).regular
183+
184+
185+func withdraw () = {
186+ let result = invoke(minerAddress(), "withdraw", nil, nil)
187+ if ((result == result))
188+ then result
189+ else throw("Strict value is not equal to itself.")
190+ }
191+
192+
193+func currentRate () = (lastRate() + (growthRate() * dt()))
194+
195+
46196 @Callable(i)
47-func init (mainAddress) = {
48- let checks = [mustManager(i), mustNotInited()]
49- if ((checks == checks))
50- then [BooleanEntry("inited", true), StringEntry("mainAddress", mainAddress)]
197+func init (_minerAddress) = {
198+ let check = mustAdmin(i)
199+ if ((check == check))
200+ then if (initialized())
201+ then throw("Already initialized")
202+ else {
203+ let sWaves = Issue("sWaves", "", 0, 8, true, unit, 0)
204+ let sWavesAssetId = calculateAssetId(sWaves)
205+[BooleanEntry(k_initialized, true), StringEntry(k_sWavesAsset, toBase58String(sWavesAssetId)), StringEntry(k_minerAddress, _minerAddress), IntegerEntry(k_lastRate, PRECISION), sWaves]
206+ }
51207 else throw("Strict value is not equal to itself.")
52208 }
53209
54210
55211
56212 @Callable(i)
57-func withdraw () = {
58- let mainAddress = Address(fromBase58String(getStringValue("mainAddress")))
59- let regularBalance = wavesBalance(this).regular
60- if ((i.caller != mainAddress))
61- then throw("Only main contract can invoke this method")
62- else [ScriptTransfer(mainAddress, regularBalance, unit)]
213+func compound () = if ((size(i.payments) != 0))
214+ then throw("No payments allowed")
215+ else {
216+ let excessWaves = getExcessWaves()
217+ if ((excessWaves == excessWaves))
218+ then if (((1 * DECIMALS) > excessWaves))
219+ then nil
220+ else {
221+ let doWithdraw = withdraw()
222+ if ((doWithdraw == doWithdraw))
223+ then {
224+ let newRate = currentRate()
225+ let timestamp = currentTimestampSec()
226+ let newGrowthRate = if ((timestamp > periodFinish()))
227+ then (divp(excessWaves, DECIMALS) / DURATION)
228+ else {
229+ let remainingTime = (periodFinish() - timestamp)
230+ let leftover = (growthRate() * remainingTime)
231+ (divp((excessWaves + leftover), DECIMALS) / DURATION)
232+ }
233+ ((lease(excessWaves) ++ updateRate(newRate, newGrowthRate)) ++ updateTime(timestamp, (timestamp + DURATION)))
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
238+ }
239+
240+
241+
242+@Callable(i)
243+func stake () = {
244+ let doCompound = invoke(this, "compound", nil, nil)
245+ if ((doCompound == doCompound))
246+ then {
247+ let payment = i.payments[0]
248+ if ((payment.assetId != unit))
249+ then throw("Only WAVES supported")
250+ else if ((size(i.payments) != 1))
251+ then throw("Wrong payments amount")
252+ else {
253+ let rate = currentRate()
254+ let toReissue = divp(payment.amount, rate)
255+ ((lease(payment.amount) ++ issueSWaves(toReissue)) ++ sendSWaves(i.caller, toReissue))
256+ }
257+ }
258+ else throw("Strict value is not equal to itself.")
259+ }
260+
261+
262+
263+@Callable(i)
264+func unstake () = {
265+ let doCompound = invoke(this, "compound", nil, nil)
266+ if ((doCompound == doCompound))
267+ then {
268+ let payment = i.payments[0]
269+ if ((payment.assetId != sWavesAsset()))
270+ then throw("Only sWAVES supported")
271+ else if ((size(i.payments) != 1))
272+ then throw("Wrong payments amount")
273+ else {
274+ let rate = currentRate()
275+ let transferAmount = mulp(payment.amount, rate)
276+ ((lease(-(transferAmount)) ++ burnSWaves(payment.amount)) ++ sendWaves(i.caller, transferAmount))
277+ }
278+ }
279+ else throw("Strict value is not equal to itself.")
63280 }
64281
65282
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func keyManagerPublicKey () = getString("managerPublicKey")
4+let PRECISION = 1000000000000000000
5+
6+let DURATION = ((60 * 60) * 24)
7+
8+let DECIMALS = 100000000
9+
10+let k_lastCompoundTime = "k_lastCompoundTime"
11+
12+let k_periodFinish = "k_periodFinish"
13+
14+let k_lastRate = "k_lastRate"
15+
16+let k_growthRate = "k_growthRate"
17+
18+let k_balance = "k_balance"
19+
20+let k_leaseId = "k_leaseId"
21+
22+let k_initialized = "k_initialized"
23+
24+let k_adminPublicKey = "k_adminPublicKey"
25+
26+let k_adminAddress = "k_adminAddress"
27+
28+let k_minerAddress = "k_minerAddress"
29+
30+let k_sWavesAsset = "k_sWavesAssetId"
31+
32+func divd (_x,_y) = fraction(_x, DECIMALS, _y, HALFEVEN)
533
634
7-func managerPublicKeyOrUnit () = match keyManagerPublicKey() {
35+func muld (_x,_y) = fraction(_x, _y, DECIMALS, HALFEVEN)
36+
37+
38+func divp (_x,_y) = fraction(_x, PRECISION, _y, HALFEVEN)
39+
40+
41+func mulp (_x,_y) = fraction(_x, _y, PRECISION, HALFEVEN)
42+
43+
44+func abs (_x) = if ((_x > 0))
45+ then _x
46+ else -(_x)
47+
48+
49+func minv (_x,_y) = if ((_x > _y))
50+ then _y
51+ else _x
52+
53+
54+func toCompositeKey (_key,_address) = ((_key + "_") + _address)
55+
56+
57+func adminAddress () = addressFromString(getStringValue(this, k_adminAddress))
58+
59+
60+func adminPublicKey () = fromBase58String(getStringValue(this, k_adminPublicKey))
61+
62+
63+func minerAddress () = valueOrErrorMessage(addressFromString(getStringValue(this, k_minerAddress)), "Invalid miner address is not set")
64+
65+
66+func sWavesAsset () = fromBase58String(getStringValue(this, k_sWavesAsset))
67+
68+
69+func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
70+
71+
72+func int (k) = valueOrErrorMessage(getInteger(this, k), ("No value for " + k))
73+
74+
75+func int0 (k) = valueOrElse(getInteger(this, k), 0)
76+
77+
78+func lastCompoundTime () = int0(k_lastCompoundTime)
79+
80+
81+func growthRate () = int0(k_growthRate)
82+
83+
84+func balance () = int0(k_balance)
85+
86+
87+func lastRate () = int(k_lastRate)
88+
89+
90+func periodFinish () = int0(k_periodFinish)
91+
92+
93+func adminPublicKeyOrUnit () = match getString(this, k_adminPublicKey) {
894 case s: String =>
995 fromBase58String(s)
1096 case _: Unit =>
1197 unit
1298 case _ =>
1399 throw("Match error")
14100 }
15101
16102
17-func mustManager (i) = {
103+func mustAdmin (i) = {
18104 let pd = throw("permission denied")
19- match managerPublicKeyOrUnit() {
105+ match adminPublicKeyOrUnit() {
20106 case pk: ByteVector =>
21107 if ((i.callerPublicKey == pk))
22108 then true
23109 else pd
24110 case _: Unit =>
25111 if ((i.caller == this))
26112 then true
27113 else pd
28114 case _ =>
29115 throw("Match error")
30116 }
31117 }
32118
33119
34-func mustNotInited () = match getBoolean("inited") {
35- case inited: Boolean =>
36- if ((inited == false))
37- then true
38- else throw("Already inited")
120+func currentTimestampSec () = (lastBlock.timestamp / 1000)
121+
122+
123+func dt () = minv(currentTimestampSec(), periodFinish())
124+
125+
126+func cancelLease () = match getBinary(k_leaseId) {
127+ case id: ByteVector =>
128+[LeaseCancel(id), DeleteEntry(k_leaseId)]
39129 case _: Unit =>
40- false
130+ nil
41131 case _ =>
42132 throw("Match error")
43133 }
44134
45135
136+func updateBalance (_amount) = [IntegerEntry(k_balance, _amount)]
137+
138+
139+func updateTime (_lastCompoundTime,_periodFinish) = [IntegerEntry(k_lastCompoundTime, _lastCompoundTime), IntegerEntry(k_periodFinish, _periodFinish)]
140+
141+
142+func updateRate (_rate,_growthRate) = [IntegerEntry(k_lastRate, _rate), IntegerEntry(k_growthRate, _growthRate)]
143+
144+
145+func updateLease (_amount) = if ((_amount > 0))
146+ then {
147+ let newLease = Lease(minerAddress(), _amount)
148+ let newLeaseId = calculateLeaseId(newLease)
149+[newLease, BinaryEntry(k_leaseId, newLeaseId)]
150+ }
151+ else nil
152+
153+
154+func lease (_amount) = if ((_amount == 0))
155+ then nil
156+ else {
157+ let newAmount = (balance() + _amount)
158+ ((cancelLease() ++ updateLease(newAmount)) ++ updateBalance(newAmount))
159+ }
160+
161+
162+func issueSWaves (_amount) = [Reissue(sWavesAsset(), _amount, true)]
163+
164+
165+func burnSWaves (_amount) = [Burn(sWavesAsset(), _amount)]
166+
167+
168+func sendSWaves (_recipient,_amount) = [ScriptTransfer(_recipient, _amount, sWavesAsset())]
169+
170+
171+func sendWaves (_recipient,_amount) = [ScriptTransfer(_recipient, _amount, unit)]
172+
173+
174+func sWavesQuantity () = match assetInfo(sWavesAsset()) {
175+ case asset: Asset =>
176+ asset.quantity
177+ case _ =>
178+ throw("Can't find asset")
179+}
180+
181+
182+func getExcessWaves () = wavesBalance(minerAddress()).regular
183+
184+
185+func withdraw () = {
186+ let result = invoke(minerAddress(), "withdraw", nil, nil)
187+ if ((result == result))
188+ then result
189+ else throw("Strict value is not equal to itself.")
190+ }
191+
192+
193+func currentRate () = (lastRate() + (growthRate() * dt()))
194+
195+
46196 @Callable(i)
47-func init (mainAddress) = {
48- let checks = [mustManager(i), mustNotInited()]
49- if ((checks == checks))
50- then [BooleanEntry("inited", true), StringEntry("mainAddress", mainAddress)]
197+func init (_minerAddress) = {
198+ let check = mustAdmin(i)
199+ if ((check == check))
200+ then if (initialized())
201+ then throw("Already initialized")
202+ else {
203+ let sWaves = Issue("sWaves", "", 0, 8, true, unit, 0)
204+ let sWavesAssetId = calculateAssetId(sWaves)
205+[BooleanEntry(k_initialized, true), StringEntry(k_sWavesAsset, toBase58String(sWavesAssetId)), StringEntry(k_minerAddress, _minerAddress), IntegerEntry(k_lastRate, PRECISION), sWaves]
206+ }
51207 else throw("Strict value is not equal to itself.")
52208 }
53209
54210
55211
56212 @Callable(i)
57-func withdraw () = {
58- let mainAddress = Address(fromBase58String(getStringValue("mainAddress")))
59- let regularBalance = wavesBalance(this).regular
60- if ((i.caller != mainAddress))
61- then throw("Only main contract can invoke this method")
62- else [ScriptTransfer(mainAddress, regularBalance, unit)]
213+func compound () = if ((size(i.payments) != 0))
214+ then throw("No payments allowed")
215+ else {
216+ let excessWaves = getExcessWaves()
217+ if ((excessWaves == excessWaves))
218+ then if (((1 * DECIMALS) > excessWaves))
219+ then nil
220+ else {
221+ let doWithdraw = withdraw()
222+ if ((doWithdraw == doWithdraw))
223+ then {
224+ let newRate = currentRate()
225+ let timestamp = currentTimestampSec()
226+ let newGrowthRate = if ((timestamp > periodFinish()))
227+ then (divp(excessWaves, DECIMALS) / DURATION)
228+ else {
229+ let remainingTime = (periodFinish() - timestamp)
230+ let leftover = (growthRate() * remainingTime)
231+ (divp((excessWaves + leftover), DECIMALS) / DURATION)
232+ }
233+ ((lease(excessWaves) ++ updateRate(newRate, newGrowthRate)) ++ updateTime(timestamp, (timestamp + DURATION)))
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
238+ }
239+
240+
241+
242+@Callable(i)
243+func stake () = {
244+ let doCompound = invoke(this, "compound", nil, nil)
245+ if ((doCompound == doCompound))
246+ then {
247+ let payment = i.payments[0]
248+ if ((payment.assetId != unit))
249+ then throw("Only WAVES supported")
250+ else if ((size(i.payments) != 1))
251+ then throw("Wrong payments amount")
252+ else {
253+ let rate = currentRate()
254+ let toReissue = divp(payment.amount, rate)
255+ ((lease(payment.amount) ++ issueSWaves(toReissue)) ++ sendSWaves(i.caller, toReissue))
256+ }
257+ }
258+ else throw("Strict value is not equal to itself.")
259+ }
260+
261+
262+
263+@Callable(i)
264+func unstake () = {
265+ let doCompound = invoke(this, "compound", nil, nil)
266+ if ((doCompound == doCompound))
267+ then {
268+ let payment = i.payments[0]
269+ if ((payment.assetId != sWavesAsset()))
270+ then throw("Only sWAVES supported")
271+ else if ((size(i.payments) != 1))
272+ then throw("Wrong payments amount")
273+ else {
274+ let rate = currentRate()
275+ let transferAmount = mulp(payment.amount, rate)
276+ ((lease(-(transferAmount)) ++ burnSWaves(payment.amount)) ++ sendWaves(i.caller, transferAmount))
277+ }
278+ }
279+ else throw("Strict value is not equal to itself.")
63280 }
64281
65282
66283 @Verifier(tx)
67284 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
68285

github/deemru/w8io/026f985 
44.92 ms