tx · 6ATv1GSBEwaG32a9MBsQCDWQCC1HmAtLjqMARpTfXxQ3

3N1q2ieDU25PkmLZxFZrdGxETB1vWeLQo4y:  -0.01000000 Waves

2022.04.20 11:59 [2016657] smart account 3N1q2ieDU25PkmLZxFZrdGxETB1vWeLQo4y > SELF 0.00000000 Waves

{ "type": 13, "id": "6ATv1GSBEwaG32a9MBsQCDWQCC1HmAtLjqMARpTfXxQ3", "fee": 1000000, "feeAssetId": null, "timestamp": 1650445280668, "version": 2, "chainId": 84, "sender": "3N1q2ieDU25PkmLZxFZrdGxETB1vWeLQo4y", "senderPublicKey": "EgxqmjPExKP8GAbJQALcx5po8T3xyXNAKUPuvben5unh", "proofs": [ "3yVfDH9Ah6mXfwerLWGkAAqQdUofBUYPRpNewwopbBgjteSSfzxQ4ACyq5VhP3aqxzorXJWRKeaUfDvCfRzxwhiV" ], "script": "base64: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cnlHZXRJbnRlZ2VyAAAAAQIAAAAgZ2xvYmFsX2xhc3RDaGVja19TQ09ORVhfaW50ZXJlc3QEAAAAEXRvdGFsU3Rha2VkQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAADWdsb2JhbF9zdGFrZWQEAAAADWludGVyZXN0RGVsdGEDCQAAZgAAAAIFAAAAEXRvdGFsU3Rha2VkQW1vdW50AAAAAAAAAAAACQAAawAAAAMFAAAABmFtb3VudAUAAAAFU2NhbGUFAAAAEXRvdGFsU3Rha2VkQW1vdW50AAAAAAAAAAAAAwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAANU2NvbmV4QXNzZXRJZAkAAAIAAAABAgAAABR3cm9uZyBhc3NldCBhdHRhY2hlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAWZ2xvYmFsX1NDT05FWF9lYXJuaW5ncwkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAFmdsb2JhbF9TQ09ORVhfZWFybmluZ3MFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAgZ2xvYmFsX2xhc3RDaGVja19TQ09ORVhfaW50ZXJlc3QJAABkAAAAAgUAAAAPY3VycmVudEludGVyZXN0BQAAAA1pbnRlcmVzdERlbHRhBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleau6GDc=", "height": 2016657, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9T7AzoNsvxmEAz51mhk7dtbKEVxkQ9NF45Sc8mR3etZb Next: 9uT1KHeGpZvju9J859MBUptrxCG3qZxUpYe5D2wwNDVH Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let certStatusRevoked = "REVOKED"
5-
6-let certStatusActive = "ACTIVE"
7-
84 let oracleKey = "oracleKey"
95
10-func getStr (key) = match getString(this, key) {
11- case b: String =>
6+let Scale = 1000000
7+
8+func tryGetInteger (key) = match getInteger(this, key) {
9+ case b: Int =>
1210 b
11+ case _ =>
12+ 0
13+}
14+
15+
16+func tryGetString (key) = match getString(this, key) {
17+ case a: String =>
18+ a
1319 case _ =>
1420 ""
1521 }
1622
1723
18-let oracle = getStr(oracleKey)
24+let oracle = tryGetString(oracleKey)
1925
2026 let oracleFee = value(addressFromString(oracle))
2127
22-let resellDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "resellDapp"), "resellDapp not found"))
28+let SconexAssetId = fromBase58String(getStringValue(oracleFee, "SconexAssetId"))
2329
24-let sconexDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "sconexDapp"), "sconexDapp not found"))
25-
26-let allowedDapps = [resellDapp, sconexDapp]
27-
28-func getStringByKey (key) = valueOrElse(getString(this, key), "")
29-
30-
31-func tryGetNftInfo (assetId) = {
32- let x = match assetInfo(assetId) {
33- case asset: Asset =>
34- asset.quantity
35- case _ =>
36- throw("Invalid NFT id")
37- }
38- x
39- }
40-
41-
42-func doesAddressOwnNft (assetId,address) = if ((assetBalance(Address(fromBase58String(address)), assetId) != 1))
43- then false
44- else true
45-
46-
47-func revokeOldCert (nftId) = {
48- let certId = getStringByKey(("cert_" + nftId))
49- if ((certId != ""))
50- then [StringEntry((("cert_" + certId) + "_status"), certStatusRevoked)]
51- else nil
30+func claimResult (address) = {
31+ let addressStr = toString(address)
32+ let currentInterest = tryGetInteger("global_lastCheck_SCONEX_interest")
33+ let lastCheckInterest = tryGetInteger((addressStr + "_lastCheck_SCONEX_interest"))
34+ let stakedAmount = tryGetInteger((addressStr + "_SCONEX_staked"))
35+ let reward = if ((lastCheckInterest > 0))
36+ then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
37+ else 0
38+[IntegerEntry((addressStr + "_lastCheck_SCONEX_interest"), currentInterest), IntegerEntry((addressStr + "_SCONEX_claimed"), (tryGetInteger((addressStr + "_SCONEX_claimed")) + reward)), ScriptTransfer(address, reward, SconexAssetId)]
5239 }
5340
5441
5542 @Callable(i)
56-func initDapp (dappKey) = if ((i.caller != this))
57- then throw("You cannot do this action")
58- else if ((oracle != ""))
59- then throw("oracle already set, you can't override!")
60- else [StringEntry(oracleKey, dappKey)]
43+func stake () = {
44+ let amount = i.payments[0].amount
45+ let addressStr = toString(i.caller)
46+ let totalStakedAmount = tryGetInteger("global_staked")
47+ if ((i.payments[0].assetId != SconexAssetId))
48+ then throw("wrong asset attached")
49+ else (claimResult(i.caller) ++ [IntegerEntry("global_staked", (totalStakedAmount + amount)), IntegerEntry((addressStr + "_SCONEX_staked"), (tryGetInteger((addressStr + "_SCONEX_staked")) + amount))])
50+ }
6151
6252
6353
6454 @Callable(i)
65-func createCert (nftOwner,nftId,artistAddress) = if (containsElement(allowedDapps, i.caller))
66- then {
67- let certId = toBase58String(i.transactionId)
68- let assetIdBytes = fromBase58String(nftId)
69- let assetInfoOutput = tryGetNftInfo(assetIdBytes)
70- if ((assetInfoOutput != 1))
71- then throw("This is not an NFT!")
72- else if (doesAddressOwnNft(assetIdBytes, nftOwner))
73- then {
74- let revokeData = revokeOldCert(nftId)
75- let createData = [StringEntry(("cert_" + nftId), certId), StringEntry((("cert_" + certId) + "_nftId"), nftId), StringEntry((("cert_" + certId) + "_owner"), nftOwner), StringEntry((("cert_" + certId) + "_artist"), artistAddress), StringEntry((("cert_" + certId) + "_status"), certStatusActive)]
76- (revokeData ++ createData)
77- }
78- else throw(("The NFT isn't owned by " + nftOwner))
79- }
80- else throw("This dapp can not create certs!")
55+func unStake (amount) = {
56+ let addressStr = toString(i.caller)
57+ let stakedAmount = tryGetInteger((addressStr + "_SCONEX_staked"))
58+ if ((amount > stakedAmount))
59+ then throw("you don't have tokens available")
60+ else (claimResult(i.caller) ++ [IntegerEntry((addressStr + "_SCONEX_staked"), (stakedAmount - amount)), IntegerEntry("global_staked", (tryGetInteger("global_staked") - amount)), ScriptTransfer(i.caller, amount, SconexAssetId)])
61+ }
8162
63+
64+
65+@Callable(i)
66+func claimReward () = claimResult(i.caller)
67+
68+
69+
70+@Callable(i)
71+func topUpReward () = {
72+ let amount = fraction(i.payments[0].amount, 9, 10)
73+ let currentInterest = tryGetInteger("global_lastCheck_SCONEX_interest")
74+ let totalStakedAmount = tryGetInteger("global_staked")
75+ let interestDelta = if ((totalStakedAmount > 0))
76+ then fraction(amount, Scale, totalStakedAmount)
77+ else 0
78+ if ((i.payments[0].assetId != SconexAssetId))
79+ then throw("wrong asset attached")
80+ else [IntegerEntry("global_SCONEX_earnings", (tryGetInteger("global_SCONEX_earnings") + amount)), IntegerEntry("global_lastCheck_SCONEX_interest", (currentInterest + interestDelta))]
81+ }
82+
83+
84+@Verifier(tx)
85+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
8286

github/deemru/w8io/c3f4982 
26.50 ms