tx · J2pfVtYh398qCRhyxLjYiZm48cWu39RCDWRDMiMuVrpj 3PHeFExuCuK2QkR64j83u2tVom4YJUUXYZA: -0.01000000 Waves 2023.01.19 19:13 [3477536] smart account 3PHeFExuCuK2QkR64j83u2tVom4YJUUXYZA > SELF 0.00000000 Waves
{ "type": 13, "id": "J2pfVtYh398qCRhyxLjYiZm48cWu39RCDWRDMiMuVrpj", "fee": 1000000, "feeAssetId": null, "timestamp": 1674144803198, "version": 2, "chainId": 87, "sender": "3PHeFExuCuK2QkR64j83u2tVom4YJUUXYZA", "senderPublicKey": "2HQLGX6a8xxw6QLPKVnKhR7WNTSNiw4XboN8pYoCfwzR", "proofs": [ "5vogWidMkrAvnyX5Gbkoj8CaGRX2ELhCb11yx3xrMZ8pxD8TEsMqiAZYuAWSefeoFwiNHxa9kXrr7EdwfobhBsn1" ], "script": "base64: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dmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAFpAQAAABRjbGFpbVRyZWFzdXJ5UmV3YXJkcwAAAAAEAAAACnd4QmFsYW5jZTAJAQAAAApnZXRCYWxhbmNlAAAAAQUAAAAEd3hJZAMJAAAAAAAAAgUAAAAKd3hCYWxhbmNlMAUAAAAKd3hCYWxhbmNlMAQAAAAEaW52MQkBAAAAB2NsYWltV1gAAAABAgAAACw5N3pIRnAxQzNjQjdxZnZ4OFh2NWYycldwOW5VU0c1VW5BYW1mUGNXNnR4ZgMJAAAAAAAAAgUAAAAEaW52MQUAAAAEaW52MQQAAAAEaW52MgkBAAAAB2NsYWltV1gAAAABAgAAACxFUGhkRWZtUWFOY0h5dkRtUkdobkxoZ2NKdEtaMmE0azNaQm1LV3RBRVd5SAMJAAAAAAAAAgUAAAAEaW52MgUAAAAEaW52MgQAAAAEaW52MwkBAAAAB2NsYWltV1gAAAABAgAAACxFTXNacHFjVDhOdU1ZWkNFUEh6dnJoUUNRS2hmWGpkZWVrWnZjV3BIc052aAMJAAAAAAAAAgUAAAAEaW52MwUAAAAEaW52MwQAAAAId3hFYXJuZWQJAABlAAAAAgkBAAAACmdldEJhbGFuY2UAAAABBQAAAAR3eElkBQAAAAp3eEJhbGFuY2UwAwkAAAAAAAACBQAAAAh3eEVhcm5lZAUAAAAId3hFYXJuZWQEAAAADmV4Y2hhbmdlUmVzdWx0CQEAAAAXZXhjaGFuZ2VBblNlbmRUb1N0YWtpbmcAAAADBQAAAAR3eElkBQAAAAdwbHV0b0lkBQAAAAh3eEVhcm5lZAMJAAAAAAAAAgUAAAAOZXhjaGFuZ2VSZXN1bHQFAAAADmV4Y2hhbmdlUmVzdWx0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAAPXN0YXRzX2NsYWltZWRBdF9BdHF2NTlFWXpqRkd1aXRLVm5NUms2SDhGdWtqb1Yza3RQb3JiRXlzMjVvbl8JAAGkAAAAAQUAAAAGaGVpZ2h0BQAAAAh3eEVhcm5lZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAPc3RhdHNfbGFzdENsYWltBQAAAAZoZWlnaHQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5M2IthQ==", "height": 3477536, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 35kZrpgjRGUm8SshvLQNPaf9htHcSpCznvBeg85YV6Vs Next: 3gjzDb6H3R6ErM3qderHEpPte9tbsSoghtQNGauYz6wz Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func tryGetInteger (key) = match getInteger(this, key) { | |
5 | - | case b: Int => | |
4 | + | let wxId = base58'Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on' | |
5 | + | ||
6 | + | let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | + | ||
8 | + | let plutoId = base58'Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5' | |
9 | + | ||
10 | + | let plutoStakingAddress = "3P7dGTVZp8VLDYy3XEaUQbiqfi9cMK1Ly5q" | |
11 | + | ||
12 | + | func tryGetString (key) = match getString(this, key) { | |
13 | + | case b: String => | |
6 | 14 | b | |
7 | 15 | case _ => | |
8 | - | | |
16 | + | "" | |
9 | 17 | } | |
10 | 18 | ||
11 | 19 | ||
12 | - | @Callable(i) | |
13 | - | func putWaves () = { | |
14 | - | let pmt = i.payments[0] | |
15 | - | if (if ((pmt.assetId != unit)) | |
20 | + | func getAssetString (assetId) = match assetId { | |
21 | + | case b: ByteVector => | |
22 | + | toBase58String(b) | |
23 | + | case _ => | |
24 | + | "WAVES" | |
25 | + | } | |
26 | + | ||
27 | + | ||
28 | + | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
29 | + | then unit | |
30 | + | else fromBase58String(assetIdStr) | |
31 | + | ||
32 | + | ||
33 | + | func getBalance (assetId) = match assetId { | |
34 | + | case x: Unit => | |
35 | + | wavesBalance(this).available | |
36 | + | case _ => | |
37 | + | assetBalance(this, value(assetId)) | |
38 | + | } | |
39 | + | ||
40 | + | ||
41 | + | func exchangeAnSendToStaking (asset0Id,asset1Id,amount0) = { | |
42 | + | let exchangeInvoke = invoke(Address(base58'3PLPCb3wF2H2gtzohoAjeWcGaMKEiJvtE5X'), "exchangeAndSendTo", [getAssetString(asset1Id), plutoStakingAddress], [AttachedPayment(asset0Id, amount0)]) | |
43 | + | if ((exchangeInvoke == exchangeInvoke)) | |
16 | 44 | then true | |
17 | - | else (0 >= pmt.amount)) | |
18 | - | then throw("please attach WAVES as a payment") | |
19 | - | else [IntegerEntry((toString(i.caller) + "_wavesPut"), (tryGetInteger((toString(i.caller) + "_wavesPut")) + pmt.amount))] | |
45 | + | else throw("Strict value is not equal to itself.") | |
20 | 46 | } | |
21 | 47 | ||
22 | 48 | ||
49 | + | func claimWX (lpId) = { | |
50 | + | let evaluation = split({ | |
51 | + | let @ = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "claimWxREADONLY", [lpId, toString(this)], nil) | |
52 | + | if ($isInstanceOf(@, "String")) | |
53 | + | then @ | |
54 | + | else throw("Couldn't cast Any to String") | |
55 | + | }, "__") | |
56 | + | if ((evaluation == evaluation)) | |
57 | + | then { | |
58 | + | let claimInv = if (((parseIntValue(evaluation[3]) - parseIntValue(evaluation[4])) > 0)) | |
59 | + | then invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "claimWx", [lpId], nil) | |
60 | + | else unit | |
61 | + | if ((claimInv == claimInv)) | |
62 | + | then true | |
63 | + | else throw("Strict value is not equal to itself.") | |
64 | + | } | |
65 | + | else throw("Strict value is not equal to itself.") | |
66 | + | } | |
67 | + | ||
23 | 68 | ||
24 | 69 | @Callable(i) | |
25 | - | func claimWaves (amount) = { | |
26 | - | let wavesPut = tryGetInteger((toString(i.caller) + "_wavesPut")) | |
27 | - | if ((wavesPut > amount)) | |
28 | - | then throw("you don't have that much WAVES available") | |
29 | - | else [IntegerEntry((toString(i.caller) + "_wavesPut"), (wavesPut - amount))] | |
70 | + | func claimTreasuryRewards () = { | |
71 | + | let wxBalance0 = getBalance(wxId) | |
72 | + | if ((wxBalance0 == wxBalance0)) | |
73 | + | then { | |
74 | + | let inv1 = claimWX("97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf") | |
75 | + | if ((inv1 == inv1)) | |
76 | + | then { | |
77 | + | let inv2 = claimWX("EPhdEfmQaNcHyvDmRGhnLhgcJtKZ2a4k3ZBmKWtAEWyH") | |
78 | + | if ((inv2 == inv2)) | |
79 | + | then { | |
80 | + | let inv3 = claimWX("EMsZpqcT8NuMYZCEPHzvrhQCQKhfXjdeekZvcWpHsNvh") | |
81 | + | if ((inv3 == inv3)) | |
82 | + | then { | |
83 | + | let wxEarned = (getBalance(wxId) - wxBalance0) | |
84 | + | if ((wxEarned == wxEarned)) | |
85 | + | then { | |
86 | + | let exchangeResult = exchangeAnSendToStaking(wxId, plutoId, wxEarned) | |
87 | + | if ((exchangeResult == exchangeResult)) | |
88 | + | then [IntegerEntry(("stats_claimedAt_Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on_" + toString(height)), wxEarned), IntegerEntry("stats_lastClaim", height)] | |
89 | + | else throw("Strict value is not equal to itself.") | |
90 | + | } | |
91 | + | else throw("Strict value is not equal to itself.") | |
92 | + | } | |
93 | + | else throw("Strict value is not equal to itself.") | |
94 | + | } | |
95 | + | else throw("Strict value is not equal to itself.") | |
96 | + | } | |
97 | + | else throw("Strict value is not equal to itself.") | |
98 | + | } | |
99 | + | else throw("Strict value is not equal to itself.") | |
30 | 100 | } | |
31 | 101 | ||
32 | 102 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func tryGetInteger (key) = match getInteger(this, key) { | |
5 | - | case b: Int => | |
4 | + | let wxId = base58'Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on' | |
5 | + | ||
6 | + | let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | + | ||
8 | + | let plutoId = base58'Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5' | |
9 | + | ||
10 | + | let plutoStakingAddress = "3P7dGTVZp8VLDYy3XEaUQbiqfi9cMK1Ly5q" | |
11 | + | ||
12 | + | func tryGetString (key) = match getString(this, key) { | |
13 | + | case b: String => | |
6 | 14 | b | |
7 | 15 | case _ => | |
8 | - | | |
16 | + | "" | |
9 | 17 | } | |
10 | 18 | ||
11 | 19 | ||
12 | - | @Callable(i) | |
13 | - | func putWaves () = { | |
14 | - | let pmt = i.payments[0] | |
15 | - | if (if ((pmt.assetId != unit)) | |
20 | + | func getAssetString (assetId) = match assetId { | |
21 | + | case b: ByteVector => | |
22 | + | toBase58String(b) | |
23 | + | case _ => | |
24 | + | "WAVES" | |
25 | + | } | |
26 | + | ||
27 | + | ||
28 | + | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
29 | + | then unit | |
30 | + | else fromBase58String(assetIdStr) | |
31 | + | ||
32 | + | ||
33 | + | func getBalance (assetId) = match assetId { | |
34 | + | case x: Unit => | |
35 | + | wavesBalance(this).available | |
36 | + | case _ => | |
37 | + | assetBalance(this, value(assetId)) | |
38 | + | } | |
39 | + | ||
40 | + | ||
41 | + | func exchangeAnSendToStaking (asset0Id,asset1Id,amount0) = { | |
42 | + | let exchangeInvoke = invoke(Address(base58'3PLPCb3wF2H2gtzohoAjeWcGaMKEiJvtE5X'), "exchangeAndSendTo", [getAssetString(asset1Id), plutoStakingAddress], [AttachedPayment(asset0Id, amount0)]) | |
43 | + | if ((exchangeInvoke == exchangeInvoke)) | |
16 | 44 | then true | |
17 | - | else (0 >= pmt.amount)) | |
18 | - | then throw("please attach WAVES as a payment") | |
19 | - | else [IntegerEntry((toString(i.caller) + "_wavesPut"), (tryGetInteger((toString(i.caller) + "_wavesPut")) + pmt.amount))] | |
45 | + | else throw("Strict value is not equal to itself.") | |
20 | 46 | } | |
21 | 47 | ||
22 | 48 | ||
49 | + | func claimWX (lpId) = { | |
50 | + | let evaluation = split({ | |
51 | + | let @ = invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "claimWxREADONLY", [lpId, toString(this)], nil) | |
52 | + | if ($isInstanceOf(@, "String")) | |
53 | + | then @ | |
54 | + | else throw("Couldn't cast Any to String") | |
55 | + | }, "__") | |
56 | + | if ((evaluation == evaluation)) | |
57 | + | then { | |
58 | + | let claimInv = if (((parseIntValue(evaluation[3]) - parseIntValue(evaluation[4])) > 0)) | |
59 | + | then invoke(Address(base58'3PPNhHYkkEy13gRWDCaruQyhNbX2GrjYSyV'), "claimWx", [lpId], nil) | |
60 | + | else unit | |
61 | + | if ((claimInv == claimInv)) | |
62 | + | then true | |
63 | + | else throw("Strict value is not equal to itself.") | |
64 | + | } | |
65 | + | else throw("Strict value is not equal to itself.") | |
66 | + | } | |
67 | + | ||
23 | 68 | ||
24 | 69 | @Callable(i) | |
25 | - | func claimWaves (amount) = { | |
26 | - | let wavesPut = tryGetInteger((toString(i.caller) + "_wavesPut")) | |
27 | - | if ((wavesPut > amount)) | |
28 | - | then throw("you don't have that much WAVES available") | |
29 | - | else [IntegerEntry((toString(i.caller) + "_wavesPut"), (wavesPut - amount))] | |
70 | + | func claimTreasuryRewards () = { | |
71 | + | let wxBalance0 = getBalance(wxId) | |
72 | + | if ((wxBalance0 == wxBalance0)) | |
73 | + | then { | |
74 | + | let inv1 = claimWX("97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf") | |
75 | + | if ((inv1 == inv1)) | |
76 | + | then { | |
77 | + | let inv2 = claimWX("EPhdEfmQaNcHyvDmRGhnLhgcJtKZ2a4k3ZBmKWtAEWyH") | |
78 | + | if ((inv2 == inv2)) | |
79 | + | then { | |
80 | + | let inv3 = claimWX("EMsZpqcT8NuMYZCEPHzvrhQCQKhfXjdeekZvcWpHsNvh") | |
81 | + | if ((inv3 == inv3)) | |
82 | + | then { | |
83 | + | let wxEarned = (getBalance(wxId) - wxBalance0) | |
84 | + | if ((wxEarned == wxEarned)) | |
85 | + | then { | |
86 | + | let exchangeResult = exchangeAnSendToStaking(wxId, plutoId, wxEarned) | |
87 | + | if ((exchangeResult == exchangeResult)) | |
88 | + | then [IntegerEntry(("stats_claimedAt_Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on_" + toString(height)), wxEarned), IntegerEntry("stats_lastClaim", height)] | |
89 | + | else throw("Strict value is not equal to itself.") | |
90 | + | } | |
91 | + | else throw("Strict value is not equal to itself.") | |
92 | + | } | |
93 | + | else throw("Strict value is not equal to itself.") | |
94 | + | } | |
95 | + | else throw("Strict value is not equal to itself.") | |
96 | + | } | |
97 | + | else throw("Strict value is not equal to itself.") | |
98 | + | } | |
99 | + | else throw("Strict value is not equal to itself.") | |
30 | 100 | } | |
31 | 101 | ||
32 | 102 | ||
33 | 103 | @Verifier(tx) | |
34 | 104 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
35 | 105 |
github/deemru/w8io/3ef1775 23.09 ms ◑