tx · 5ufjCRb8mag4i6s7bRHKrZguwfyGD1SDYUYf2RLfgNvP 3NC5E3y11PtakmAUxN9Nfdvx7XjWsffcJrr: -0.05000000 Waves 2020.09.09 11:53 [1169571] smart account 3NC5E3y11PtakmAUxN9Nfdvx7XjWsffcJrr > SELF 0.00000000 Waves
{ "type": 13, "id": "5ufjCRb8mag4i6s7bRHKrZguwfyGD1SDYUYf2RLfgNvP", "fee": 5000000, "feeAssetId": null, "timestamp": 1599641673539, "version": 2, "chainId": 84, "sender": "3NC5E3y11PtakmAUxN9Nfdvx7XjWsffcJrr", "senderPublicKey": "DuSyT6XMpGpexrez81rru35TfpmHJcYQP1WJxT9wjcry", "proofs": [ "64jR4AyV47LDq6BEQLK3NH4VzoNFz3xfXgm7uWE2HxFw4Q8A8oML86ykaohEGn3Rz4uwctgbADjxjrNswymMRYfE" ], "script": "base64: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b25nc1RvdGFsS2V5CQABLAAAAAICAAAADGxvbmdzX3RvdGFsXwkAAaQAAAABBQAAAApsb25nVGFyZ2V0BAAAABtjdXJyZW50TG9uZ0Ftb3VudEZvckFkZHJlc3MJAQAAABJnZXREYXRhRW50cnlGb3JLZXkAAAABBQAAAA5sb25nQWRkcmVzc0tleQQAAAAMY3VycmVudExvbmdzCQEAAAASZ2V0RGF0YUVudHJ5Rm9yS2V5AAAAAQUAAAANbG9uZ3NUb3RhbEtleQQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAgAAAAECAAAAJk9ubHkgV2F2ZXMgcGF5bWVudHMgYWxsb3dlZCBjdXJyZW50bHkhAwkAAGcAAAACCQAAZAAAAAIFAAAABmhlaWdodAUAAAANUkVDT1ZFUllQSEFTRQUAAAAKbG9uZ1RhcmdldAkAAAIAAAABAgAAAFNSZWNvdmVyeSBwaGFzZSBhY3RpdmUuIFlvdSBjYW4gbm8gbG9uZ2VyIGdvIGxvbmcgdG93YXJkcyB0aGlzIGxvbmcgdGFyZ2V0IC8gaGVpZ2h0IQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAObG9uZ0FkZHJlc3NLZXkJAABkAAAAAgUAAAAbY3VycmVudExvbmdBbW91bnRGb3JBZGRyZXNzBQAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADWxvbmdzVG90YWxLZXkJAABkAAAAAgUAAAAMY3VycmVudExvbmdzBQAAAAZhbW91bnQFAAAAA25pbAAAAACCemgG", "height": 1169571, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3M46Ya3cDg9cHAK74GPjD4bFYQYmPMUXAk8dXMCFdAYF Next: 6GXZHfA8NZPnaFa5y2RYEZiTUwHuLPsUgrhYBaxeY9vG Diff:
Old | New | Differences | |
---|---|---|---|
11 | 11 | case _: Unit => | |
12 | 12 | 0 | |
13 | 13 | case _ => | |
14 | - | throw() | |
14 | + | throw("Match error") | |
15 | 15 | } | |
16 | + | ||
17 | + | ||
18 | + | func payoutCaller (target,caller,payout) = ScriptResult(WriteSet([DataEntry(((("long_" + toString(target)) + "_") + toString(caller)), 0), DataEntry(((("short_" + toString(target)) + "_") + toString(caller)), 0)]), TransferSet([ScriptTransfer(caller, payout, unit)])) | |
19 | + | ||
20 | + | ||
21 | + | @Callable(i) | |
22 | + | func withdraw (target) = if (((target + 1) > height)) | |
23 | + | then throw("End of predictions for this height not reached yet!") | |
24 | + | else { | |
25 | + | let priceAtTarget = getIntegerValue(addressFromStringValue(PRICEORACLE), ("price_" + toString(target))) | |
26 | + | if ((priceAtTarget == 0)) | |
27 | + | then throw("Could not determine price at target height!") | |
28 | + | else { | |
29 | + | let caller = i.caller | |
30 | + | let targetPrice = getIntegerValue(this, ("target_price_" + toString(target))) | |
31 | + | let totalLongs = getDataEntryForKey(("longs_total_" + toString(target))) | |
32 | + | let totalShorts = getDataEntryForKey(("shorts_total_" + toString(target))) | |
33 | + | if ((priceAtTarget > targetPrice)) | |
34 | + | then { | |
35 | + | let precept = getDataEntryForKey(((("long_" + toString(target)) + "_") + toString(caller))) | |
36 | + | let payout = ((precept / (totalLongs + totalShorts)) * (totalLongs + totalShorts)) | |
37 | + | payoutCaller(target, caller, payout) | |
38 | + | } | |
39 | + | else if ((targetPrice > priceAtTarget)) | |
40 | + | then { | |
41 | + | let precept = getDataEntryForKey(((("short_" + toString(target)) + "_") + toString(caller))) | |
42 | + | let payout = ((precept / (totalLongs + totalShorts)) * (totalLongs + totalShorts)) | |
43 | + | payoutCaller(target, caller, payout) | |
44 | + | } | |
45 | + | else { | |
46 | + | let preceptLong = getDataEntryForKey(((("long_" + toString(target)) + "_") + toString(caller))) | |
47 | + | let preceptShort = getDataEntryForKey(((("short_" + toString(target)) + "_") + toString(caller))) | |
48 | + | let payout = (((preceptLong / totalLongs) * totalLongs) + ((preceptShort / totalShorts) * totalShorts)) | |
49 | + | payoutCaller(target, caller, payout) | |
50 | + | } | |
51 | + | } | |
52 | + | } | |
53 | + | ||
16 | 54 | ||
17 | 55 | ||
18 | 56 | @Callable(i) | |
27 | 65 | ||
28 | 66 | @Callable(i) | |
29 | 67 | func short (shortTarget) = { | |
30 | - | let caller = toString(i.caller) | |
31 | - | let shortAddressKey = ((("short_" + toString(shortTarget)) + "_") + caller) | |
32 | - | let shortsTotalKey = ("shorts_total_" + toString(shortTarget)) | |
33 | - | let currentShortAmountForAddress = getDataEntryForKey(shortAddressKey) | |
34 | - | let currentShorts = getDataEntryForKey(shortsTotalKey) | |
35 | - | let payment = extract(i.payment) | |
36 | - | let amount = payment.amount | |
37 | - | if (isDefined(payment.assetId)) | |
38 | - | then throw("Only Waves payments allowed currently!") | |
39 | - | else if (((height + RECOVERYPHASE) >= shortTarget)) | |
40 | - | then throw("Recovery phase active. You can no longer go short towards this short target / height!") | |
41 | - | else WriteSet([DataEntry(shortAddressKey, (currentShortAmountForAddress + amount)), DataEntry(shortsTotalKey, (currentShorts + amount))]) | |
68 | + | let targetPrice = getDataEntryForKey(("target_price_" + toString(shortTarget))) | |
69 | + | if ((targetPrice == 0)) | |
70 | + | then throw("Target not initialized!") | |
71 | + | else { | |
72 | + | let caller = toString(i.caller) | |
73 | + | let shortAddressKey = ((("short_" + toString(shortTarget)) + "_") + caller) | |
74 | + | let shortsTotalKey = ("shorts_total_" + toString(shortTarget)) | |
75 | + | let currentShortAmountForAddress = getDataEntryForKey(shortAddressKey) | |
76 | + | let currentShorts = getDataEntryForKey(shortsTotalKey) | |
77 | + | let payment = extract(i.payment) | |
78 | + | let amount = payment.amount | |
79 | + | if (isDefined(payment.assetId)) | |
80 | + | then throw("Only Waves payments allowed currently!") | |
81 | + | else if (((height + RECOVERYPHASE) >= shortTarget)) | |
82 | + | then throw("Recovery phase active. You can no longer go short towards this short target / height!") | |
83 | + | else WriteSet([DataEntry(shortAddressKey, (currentShortAmountForAddress + amount)), DataEntry(shortsTotalKey, (currentShorts + amount))]) | |
84 | + | } | |
42 | 85 | } | |
43 | 86 | ||
44 | 87 | ||
45 | 88 | ||
46 | 89 | @Callable(i) | |
47 | 90 | func long (longTarget) = { | |
48 | - | let caller = toString(i.caller) | |
49 | - | let longAddressKey = ((("long_" + toString(longTarget)) + "_") + caller) | |
50 | - | let longsTotalKey = ("longs_total_" + toString(longTarget)) | |
51 | - | let currentLongAmountForAddress = getDataEntryForKey(longAddressKey) | |
52 | - | let currentLongs = getDataEntryForKey(longsTotalKey) | |
53 | - | let payment = extract(i.payment) | |
54 | - | let amount = payment.amount | |
55 | - | if (isDefined(payment.assetId)) | |
56 | - | then throw("Only Waves payments allowed currently!") | |
57 | - | else if (((height + RECOVERYPHASE) >= longTarget)) | |
58 | - | then throw("Recovery phase active. You can no longer go long towards this long target / height!") | |
59 | - | else WriteSet([DataEntry(longAddressKey, (currentLongAmountForAddress + amount)), DataEntry(longsTotalKey, (currentLongs + amount))]) | |
91 | + | let targetPrice = getDataEntryForKey(("target_price_" + toString(longTarget))) | |
92 | + | if ((targetPrice == 0)) | |
93 | + | then throw("Target not initialized!") | |
94 | + | else { | |
95 | + | let caller = toString(i.caller) | |
96 | + | let longAddressKey = ((("long_" + toString(longTarget)) + "_") + caller) | |
97 | + | let longsTotalKey = ("longs_total_" + toString(longTarget)) | |
98 | + | let currentLongAmountForAddress = getDataEntryForKey(longAddressKey) | |
99 | + | let currentLongs = getDataEntryForKey(longsTotalKey) | |
100 | + | let payment = extract(i.payment) | |
101 | + | let amount = payment.amount | |
102 | + | if (isDefined(payment.assetId)) | |
103 | + | then throw("Only Waves payments allowed currently!") | |
104 | + | else if (((height + RECOVERYPHASE) >= longTarget)) | |
105 | + | then throw("Recovery phase active. You can no longer go long towards this long target / height!") | |
106 | + | else WriteSet([DataEntry(longAddressKey, (currentLongAmountForAddress + amount)), DataEntry(longsTotalKey, (currentLongs + amount))]) | |
107 | + | } | |
60 | 108 | } | |
61 | 109 | ||
62 | 110 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let RECOVERYPHASE = 100 | |
5 | 5 | ||
6 | 6 | let PRICEORACLE = "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx" | |
7 | 7 | ||
8 | 8 | func getDataEntryForKey (key) = match getInteger(this, key) { | |
9 | 9 | case x: Int => | |
10 | 10 | x | |
11 | 11 | case _: Unit => | |
12 | 12 | 0 | |
13 | 13 | case _ => | |
14 | - | throw() | |
14 | + | throw("Match error") | |
15 | 15 | } | |
16 | + | ||
17 | + | ||
18 | + | func payoutCaller (target,caller,payout) = ScriptResult(WriteSet([DataEntry(((("long_" + toString(target)) + "_") + toString(caller)), 0), DataEntry(((("short_" + toString(target)) + "_") + toString(caller)), 0)]), TransferSet([ScriptTransfer(caller, payout, unit)])) | |
19 | + | ||
20 | + | ||
21 | + | @Callable(i) | |
22 | + | func withdraw (target) = if (((target + 1) > height)) | |
23 | + | then throw("End of predictions for this height not reached yet!") | |
24 | + | else { | |
25 | + | let priceAtTarget = getIntegerValue(addressFromStringValue(PRICEORACLE), ("price_" + toString(target))) | |
26 | + | if ((priceAtTarget == 0)) | |
27 | + | then throw("Could not determine price at target height!") | |
28 | + | else { | |
29 | + | let caller = i.caller | |
30 | + | let targetPrice = getIntegerValue(this, ("target_price_" + toString(target))) | |
31 | + | let totalLongs = getDataEntryForKey(("longs_total_" + toString(target))) | |
32 | + | let totalShorts = getDataEntryForKey(("shorts_total_" + toString(target))) | |
33 | + | if ((priceAtTarget > targetPrice)) | |
34 | + | then { | |
35 | + | let precept = getDataEntryForKey(((("long_" + toString(target)) + "_") + toString(caller))) | |
36 | + | let payout = ((precept / (totalLongs + totalShorts)) * (totalLongs + totalShorts)) | |
37 | + | payoutCaller(target, caller, payout) | |
38 | + | } | |
39 | + | else if ((targetPrice > priceAtTarget)) | |
40 | + | then { | |
41 | + | let precept = getDataEntryForKey(((("short_" + toString(target)) + "_") + toString(caller))) | |
42 | + | let payout = ((precept / (totalLongs + totalShorts)) * (totalLongs + totalShorts)) | |
43 | + | payoutCaller(target, caller, payout) | |
44 | + | } | |
45 | + | else { | |
46 | + | let preceptLong = getDataEntryForKey(((("long_" + toString(target)) + "_") + toString(caller))) | |
47 | + | let preceptShort = getDataEntryForKey(((("short_" + toString(target)) + "_") + toString(caller))) | |
48 | + | let payout = (((preceptLong / totalLongs) * totalLongs) + ((preceptShort / totalShorts) * totalShorts)) | |
49 | + | payoutCaller(target, caller, payout) | |
50 | + | } | |
51 | + | } | |
52 | + | } | |
53 | + | ||
16 | 54 | ||
17 | 55 | ||
18 | 56 | @Callable(i) | |
19 | 57 | func initiate (target) = { | |
20 | 58 | let currentPrice = getIntegerValue(addressFromStringValue(PRICEORACLE), "price") | |
21 | 59 | if (((height + RECOVERYPHASE) >= target)) | |
22 | 60 | then throw(("No new future instantiable for the given height: " + toString(target))) | |
23 | 61 | else WriteSet([DataEntry(("target_price_" + toString(target)), currentPrice), DataEntry(("shorts_total_" + toString(target)), 0), DataEntry(("longs_total_" + toString(target)), 0)]) | |
24 | 62 | } | |
25 | 63 | ||
26 | 64 | ||
27 | 65 | ||
28 | 66 | @Callable(i) | |
29 | 67 | func short (shortTarget) = { | |
30 | - | let caller = toString(i.caller) | |
31 | - | let shortAddressKey = ((("short_" + toString(shortTarget)) + "_") + caller) | |
32 | - | let shortsTotalKey = ("shorts_total_" + toString(shortTarget)) | |
33 | - | let currentShortAmountForAddress = getDataEntryForKey(shortAddressKey) | |
34 | - | let currentShorts = getDataEntryForKey(shortsTotalKey) | |
35 | - | let payment = extract(i.payment) | |
36 | - | let amount = payment.amount | |
37 | - | if (isDefined(payment.assetId)) | |
38 | - | then throw("Only Waves payments allowed currently!") | |
39 | - | else if (((height + RECOVERYPHASE) >= shortTarget)) | |
40 | - | then throw("Recovery phase active. You can no longer go short towards this short target / height!") | |
41 | - | else WriteSet([DataEntry(shortAddressKey, (currentShortAmountForAddress + amount)), DataEntry(shortsTotalKey, (currentShorts + amount))]) | |
68 | + | let targetPrice = getDataEntryForKey(("target_price_" + toString(shortTarget))) | |
69 | + | if ((targetPrice == 0)) | |
70 | + | then throw("Target not initialized!") | |
71 | + | else { | |
72 | + | let caller = toString(i.caller) | |
73 | + | let shortAddressKey = ((("short_" + toString(shortTarget)) + "_") + caller) | |
74 | + | let shortsTotalKey = ("shorts_total_" + toString(shortTarget)) | |
75 | + | let currentShortAmountForAddress = getDataEntryForKey(shortAddressKey) | |
76 | + | let currentShorts = getDataEntryForKey(shortsTotalKey) | |
77 | + | let payment = extract(i.payment) | |
78 | + | let amount = payment.amount | |
79 | + | if (isDefined(payment.assetId)) | |
80 | + | then throw("Only Waves payments allowed currently!") | |
81 | + | else if (((height + RECOVERYPHASE) >= shortTarget)) | |
82 | + | then throw("Recovery phase active. You can no longer go short towards this short target / height!") | |
83 | + | else WriteSet([DataEntry(shortAddressKey, (currentShortAmountForAddress + amount)), DataEntry(shortsTotalKey, (currentShorts + amount))]) | |
84 | + | } | |
42 | 85 | } | |
43 | 86 | ||
44 | 87 | ||
45 | 88 | ||
46 | 89 | @Callable(i) | |
47 | 90 | func long (longTarget) = { | |
48 | - | let caller = toString(i.caller) | |
49 | - | let longAddressKey = ((("long_" + toString(longTarget)) + "_") + caller) | |
50 | - | let longsTotalKey = ("longs_total_" + toString(longTarget)) | |
51 | - | let currentLongAmountForAddress = getDataEntryForKey(longAddressKey) | |
52 | - | let currentLongs = getDataEntryForKey(longsTotalKey) | |
53 | - | let payment = extract(i.payment) | |
54 | - | let amount = payment.amount | |
55 | - | if (isDefined(payment.assetId)) | |
56 | - | then throw("Only Waves payments allowed currently!") | |
57 | - | else if (((height + RECOVERYPHASE) >= longTarget)) | |
58 | - | then throw("Recovery phase active. You can no longer go long towards this long target / height!") | |
59 | - | else WriteSet([DataEntry(longAddressKey, (currentLongAmountForAddress + amount)), DataEntry(longsTotalKey, (currentLongs + amount))]) | |
91 | + | let targetPrice = getDataEntryForKey(("target_price_" + toString(longTarget))) | |
92 | + | if ((targetPrice == 0)) | |
93 | + | then throw("Target not initialized!") | |
94 | + | else { | |
95 | + | let caller = toString(i.caller) | |
96 | + | let longAddressKey = ((("long_" + toString(longTarget)) + "_") + caller) | |
97 | + | let longsTotalKey = ("longs_total_" + toString(longTarget)) | |
98 | + | let currentLongAmountForAddress = getDataEntryForKey(longAddressKey) | |
99 | + | let currentLongs = getDataEntryForKey(longsTotalKey) | |
100 | + | let payment = extract(i.payment) | |
101 | + | let amount = payment.amount | |
102 | + | if (isDefined(payment.assetId)) | |
103 | + | then throw("Only Waves payments allowed currently!") | |
104 | + | else if (((height + RECOVERYPHASE) >= longTarget)) | |
105 | + | then throw("Recovery phase active. You can no longer go long towards this long target / height!") | |
106 | + | else WriteSet([DataEntry(longAddressKey, (currentLongAmountForAddress + amount)), DataEntry(longsTotalKey, (currentLongs + amount))]) | |
107 | + | } | |
60 | 108 | } | |
61 | 109 | ||
62 | 110 |
github/deemru/w8io/169f3d6 32.30 ms ◑