tx · EAoPAcMdVCeHYBYsVc3fhBCYRLvGcHF7PUWjSvukAuQz 3P57bgJaKkzVZZ4KB3hL5s8CP91z5ykVrkS: -0.01400000 Waves 2021.06.14 17:12 [2634858] smart account 3P57bgJaKkzVZZ4KB3hL5s8CP91z5ykVrkS > SELF 0.00000000 Waves
{ "type": 13, "id": "EAoPAcMdVCeHYBYsVc3fhBCYRLvGcHF7PUWjSvukAuQz", "fee": 1400000, "feeAssetId": null, "timestamp": 1623679946809, "version": 2, "chainId": 87, "sender": "3P57bgJaKkzVZZ4KB3hL5s8CP91z5ykVrkS", "senderPublicKey": "Co7TMNmKiLjZf3t5dX7hbokpv2vHQYc5MvpfJVquVM1s", "proofs": [ "4KjiKXsKirS25yEqDuc8GW1yi6rMX4b1aiKvWStLBEaAgXRgjyTtbKvsT7azmEAFbYY1y1jC4PuhqqhJaHZTRrZ2" ], "script": "base64:AAIEAAAAAAAAAA0IAhIAEgASAwoBCBIAAAAACwAAAAALZWdnc0Fzc2V0SWQBAAAAIDwYu9vARYLHTe7NzGKFe40UZooJ37kdH4kGPL41PsJWAAAAAApwZXJjaFByaWNlAAAAAAAAAABkAAAAAAVzY2FsZQAAAAAAAAAnEAEAAAARZ2V0UmV3YXJkUGVyQmxvY2sAAAAAAAAAAAAAAAAHAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQAAAANrZXkEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgAAAAAAAAAAAAUAAAADdmFsAQAAABRnZXRBc3NldEZhcm1pbmdQb3dlcgAAAAEAAAAHYXNzZXRJZAAAAAAAAAAAZAEAAAAYZ2V0TGFzdEtub3duRmFybWluZ1Bvd2VyAAAAAQAAAAdhc3NldElkAAAAAAAAAABkAQAAAAxjYWxjSW50ZXJlc3QAAAADAAAAEHByZXZpb3VzSW50ZXJlc3QAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAAAABF0b3RhbEZhcm1pbmdQb3dlcgkAAGQAAAACBQAAABBwcmV2aW91c0ludGVyZXN0CQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAVzY2FsZQkBAAAAEWdldFJld2FyZFBlckJsb2NrAAAAAAkAAGUAAAACBQAAAAZoZWlnaHQFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAAAwkAAGYAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgAAAAAAAAAAAAQAAAAQcHJldmlvdXNJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAB10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAQAAAARdG90YWxGYXJtaW5nUG93ZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAASdG90YWxfZmFybWluZ1Bvd2VyCQEAAAAMY2FsY0ludGVyZXN0AAAAAwUAAAAQcHJldmlvdXNJbnRlcmVzdAUAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAUAAAARdG90YWxGYXJtaW5nUG93ZXIDCQAAZwAAAAIFAAAABmhlaWdodAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABF0b3RhbF9zdGFydEhlaWdodAAAAAAAAAAAAAkAAAIAAAABAgAAABxmYXJtaW5nIGlzIG5vdCBsYXVuY2hlZCwgeWV0AQAAABNjYWxjVXNlclJld2FyZERlbHRhAAAAAQAAAAdhZGRyZXNzBAAAABVsYXN0Q2hlY2tVc2VySW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABJfbGFzdENoZWNrSW50ZXJlc3QEAAAAEHVzZXJGYXJtaW5nUG93ZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAA1fZmFybWluZ1Bvd2VyBAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAACQAAaAAAAAIFAAAAEHVzZXJGYXJtaW5nUG93ZXIJAABlAAAAAgUAAAAPY3VycmVudEludGVyZXN0BQAAABVsYXN0Q2hlY2tVc2VySW50ZXJlc3QBAAAAE2dldENoZWNrRGF0YUNoYW5nZXMAAAADAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAAB2FkZHJlc3MAAAAPdXNlclJld2FyZERlbHRhCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAANX2Zhcm1pbmdQb3dlcgkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAANX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABZfbGFzdENoZWNrRmFybWVkQW1vdW50CQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABZfbGFzdENoZWNrRmFybWVkQW1vdW50BQAAAA91c2VyUmV3YXJkRGVsdGEFAAAAA25pbAAAAAQAAAABaQEAAAAEaW5pdAAAAAADCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAKYWRtaW4gb25seQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAARdG90YWxfc3RhcnRIZWlnaHQFAAAABmhlaWdodAUAAAADbmlsAAAAAWkBAAAACHN0YWtlTkZUAAAAAAQAAAAHYXNzZXRJZAkBAAAABXZhbHVlAAAAAQgJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAHYWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQEAAAAUZ2V0QXNzZXRGYXJtaW5nUG93ZXIAAAABBQAAAAdhc3NldElkBAAAAA91c2VyUmV3YXJkRGVsdGEJAQAAABNjYWxjVXNlclJld2FyZERlbHRhAAAAAQUAAAAHYWRkcmVzcwkBAAAAE2dldENoZWNrRGF0YUNoYW5nZXMAAAADBQAAABFhc3NldEZhcm1pbmdQb3dlcgUAAAAHYWRkcmVzcwUAAAAPdXNlclJld2FyZERlbHRhAAAAAWkBAAAACnVuc3Rha2VORlQAAAABAAAABWFzc2V0BAAAAAdhc3NldElkCQACWQAAAAEFAAAABWFzc2V0BAAAAAdhZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAabGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXIJAQAAABRnZXRBc3NldEZhcm1pbmdQb3dlcgAAAAEFAAAAB2Fzc2V0SWQEAAAAD3VzZXJSZXdhcmREZWx0YQkBAAAAE2NhbGNVc2VyUmV3YXJkRGVsdGEAAAABBQAAAAdhZGRyZXNzBAAAAAZyZXR1cm4JAQAAABNnZXRDaGVja0RhdGFDaGFuZ2VzAAAAAwkBAAAAAS0AAAABBQAAABpsYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgUAAAAHYWRkcmVzcwUAAAAPdXNlclJld2FyZERlbHRhCQAETgAAAAIFAAAABnJldHVybgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIAAAAAAAAAAGQFAAAAB2Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAtjbGFpbVJld2FyZAAAAAAEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgkBAAAAE2NhbGNVc2VyUmV3YXJkRGVsdGEAAAABBQAAAAdhZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAQX3dpdGhkcmF3bkFtb3VudAQAAAAGcmV3YXJkCQAAaQAAAAIJAABlAAAAAgUAAAAMZmFybWVkQW1vdW50BQAAAA93aXRoZHJhd25BbW91bnQFAAAABXNjYWxlAwkAAGcAAAACAAAAAAAAAAAABQAAAAZyZXdhcmQJAAACAAAAAQIAAAAceW91IGhhdmUgbm8gRUdHcyB0byB3aXRoZHJhdwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABBfd2l0aGRyYXduQW1vdW50BQAAAAxmYXJtZWRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZyZXdhcmQFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tlebkzJYM=", "height": 2634858, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3gknejiXS7mo1dwfz86S7UGuTAJgzWRk71xnj5dn9txF Next: none Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let eggsAssetId = base58'53bLXGQhnMxAoiWnza2SJQRp7hNQZVHnyrRziLmwdVjb' | |
5 | + | ||
6 | + | let perchPrice = 100 | |
7 | + | ||
4 | 8 | let scale = 10000 | |
5 | 9 | ||
6 | 10 | func getRewardPerBlock () = 7 | |
78 | 82 | } | |
79 | 83 | ||
80 | 84 | ||
85 | + | ||
86 | + | @Callable(i) | |
87 | + | func claimReward () = { | |
88 | + | let address = toString(i.caller) | |
89 | + | let farmedAmount = (calcUserRewardDelta(address) + tryGetInteger((("address_" + address) + "_lastCheckFarmedAmount"))) | |
90 | + | let withdrawnAmount = tryGetInteger((("address_" + address) + "_withdrawnAmount")) | |
91 | + | let reward = ((farmedAmount - withdrawnAmount) / scale) | |
92 | + | if ((0 >= reward)) | |
93 | + | then throw("you have no EGGs to withdraw") | |
94 | + | else [IntegerEntry((("address_" + address) + "_withdrawnAmount"), farmedAmount), ScriptTransfer(i.caller, reward, eggsAssetId)] | |
95 | + | } | |
96 | + | ||
97 | + | ||
81 | 98 | @Verifier(tx) | |
82 | 99 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
83 | 100 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let eggsAssetId = base58'53bLXGQhnMxAoiWnza2SJQRp7hNQZVHnyrRziLmwdVjb' | |
5 | + | ||
6 | + | let perchPrice = 100 | |
7 | + | ||
4 | 8 | let scale = 10000 | |
5 | 9 | ||
6 | 10 | func getRewardPerBlock () = 7 | |
7 | 11 | ||
8 | 12 | ||
9 | 13 | func tryGetInteger (key) = { | |
10 | 14 | let val = match getInteger(this, key) { | |
11 | 15 | case b: Int => | |
12 | 16 | b | |
13 | 17 | case _ => | |
14 | 18 | 0 | |
15 | 19 | } | |
16 | 20 | val | |
17 | 21 | } | |
18 | 22 | ||
19 | 23 | ||
20 | 24 | func getAssetFarmingPower (assetId) = 100 | |
21 | 25 | ||
22 | 26 | ||
23 | 27 | func getLastKnownFarmingPower (assetId) = 100 | |
24 | 28 | ||
25 | 29 | ||
26 | 30 | func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower)) | |
27 | 31 | ||
28 | 32 | ||
29 | 33 | func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0)) | |
30 | 34 | then { | |
31 | 35 | let previousInterest = tryGetInteger("total_lastCheckInterest") | |
32 | 36 | let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight") | |
33 | 37 | let totalFarmingPower = tryGetInteger("total_farmingPower") | |
34 | 38 | calcInterest(previousInterest, previousInterestHeight, totalFarmingPower) | |
35 | 39 | } | |
36 | 40 | else if ((height >= tryGetInteger("total_startHeight"))) | |
37 | 41 | then 0 | |
38 | 42 | else throw("farming is not launched, yet") | |
39 | 43 | ||
40 | 44 | ||
41 | 45 | func calcUserRewardDelta (address) = { | |
42 | 46 | let lastCheckUserInterest = tryGetInteger((("address_" + address) + "_lastCheckInterest")) | |
43 | 47 | let userFarmingPower = tryGetInteger((("address_" + address) + "_farmingPower")) | |
44 | 48 | let currentInterest = getCurrentInterest() | |
45 | 49 | (userFarmingPower * (currentInterest - lastCheckUserInterest)) | |
46 | 50 | } | |
47 | 51 | ||
48 | 52 | ||
49 | 53 | func getCheckDataChanges (assetFarmingPower,address,userRewardDelta) = [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((("address_" + address) + "_farmingPower"), (tryGetInteger((("address_" + address) + "_farmingPower")) + assetFarmingPower)), IntegerEntry((("address_" + address) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((("address_" + address) + "_lastCheckFarmedAmount"), (tryGetInteger((("address_" + address) + "_lastCheckFarmedAmount")) + userRewardDelta))] | |
50 | 54 | ||
51 | 55 | ||
52 | 56 | @Callable(i) | |
53 | 57 | func init () = if ((i.caller != this)) | |
54 | 58 | then throw("admin only") | |
55 | 59 | else [IntegerEntry("total_startHeight", height)] | |
56 | 60 | ||
57 | 61 | ||
58 | 62 | ||
59 | 63 | @Callable(i) | |
60 | 64 | func stakeNFT () = { | |
61 | 65 | let assetId = value(value(i.payments[0]).assetId) | |
62 | 66 | let address = toString(i.caller) | |
63 | 67 | let assetFarmingPower = getAssetFarmingPower(assetId) | |
64 | 68 | let userRewardDelta = calcUserRewardDelta(address) | |
65 | 69 | getCheckDataChanges(assetFarmingPower, address, userRewardDelta) | |
66 | 70 | } | |
67 | 71 | ||
68 | 72 | ||
69 | 73 | ||
70 | 74 | @Callable(i) | |
71 | 75 | func unstakeNFT (asset) = { | |
72 | 76 | let assetId = fromBase58String(asset) | |
73 | 77 | let address = toString(i.caller) | |
74 | 78 | let lastKnownAssetFarmingPower = getAssetFarmingPower(assetId) | |
75 | 79 | let userRewardDelta = calcUserRewardDelta(address) | |
76 | 80 | let return = getCheckDataChanges(-(lastKnownAssetFarmingPower), address, userRewardDelta) | |
77 | 81 | (return ++ [ScriptTransfer(i.caller, 100, assetId)]) | |
78 | 82 | } | |
79 | 83 | ||
80 | 84 | ||
85 | + | ||
86 | + | @Callable(i) | |
87 | + | func claimReward () = { | |
88 | + | let address = toString(i.caller) | |
89 | + | let farmedAmount = (calcUserRewardDelta(address) + tryGetInteger((("address_" + address) + "_lastCheckFarmedAmount"))) | |
90 | + | let withdrawnAmount = tryGetInteger((("address_" + address) + "_withdrawnAmount")) | |
91 | + | let reward = ((farmedAmount - withdrawnAmount) / scale) | |
92 | + | if ((0 >= reward)) | |
93 | + | then throw("you have no EGGs to withdraw") | |
94 | + | else [IntegerEntry((("address_" + address) + "_withdrawnAmount"), farmedAmount), ScriptTransfer(i.caller, reward, eggsAssetId)] | |
95 | + | } | |
96 | + | ||
97 | + | ||
81 | 98 | @Verifier(tx) | |
82 | 99 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
83 | 100 |
github/deemru/w8io/6500d08 45.76 ms ◑