tx · 8JWgkgjTarR7sDTBVBuVWKQacawNLwWL3bJQoNFfpj3w 3P8prjYwq9dxRqPiyYAjQpAnuei6eTAerSV: -0.01000000 Waves 2022.10.15 11:16 [3338665] smart account 3P8prjYwq9dxRqPiyYAjQpAnuei6eTAerSV > SELF 0.00000000 Waves
{ "type": 13, "id": "8JWgkgjTarR7sDTBVBuVWKQacawNLwWL3bJQoNFfpj3w", "fee": 1000000, "feeAssetId": null, "timestamp": 1665821790497, "version": 2, "chainId": 87, "sender": "3P8prjYwq9dxRqPiyYAjQpAnuei6eTAerSV", "senderPublicKey": "AMyLj8njybNRT5DAz3WKHgzDpgXocT1ojBUcFthRiH6i", "proofs": [ "2psqvraG4Gk7ofPm7cDEGsKrXX1tTt5iQkhffoiKthfdKKYXKFPBaR7VauoeFXmDRNN9RqMzccfpX3kRS1nHBaHH" ], "script": "base64:BgIXCAISAwoBCBIDCgEBEgQKAgEBEgMKAQEMAAliYXNlUHJpY2UAgIl6AAhpbmNyZWFzZQABABBpbmNyZWFzZURlY2ltYWxzAAMBD2R1Y2tDYXBhY2l0eUtleQEGZHVja0lkCQCsAgICD2FkZGVkX2NhcGFjaXR5XwUGZHVja0lkARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwECFHN0YXRpY19vcmFjbGVBZGRyZXNzAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIRc3RhdGljX2VnZ0Fzc2V0SWQBD2dldER1Y2tDYXBhY2l0eQEGZHVja0lkCQENdHJ5R2V0SW50ZWdlcgEJAQ9kdWNrQ2FwYWNpdHlLZXkBBQZkdWNrSWQBEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MEAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPQ0NPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpARdjYWxjdWxhdGVUb3RhbFByaWNlRWdncwEEZWdncwQHcG93UGFydAkAZQIJAGwGCQBkAgDoBwUIaW5jcmVhc2UFEGluY3JlYXNlRGVjaW1hbHMJAGQCBQRlZ2dzAAEAAAAIBQZIQUxGVVAAgMLXLwQFcHJpY2UJAGkCCQBpAgkAaAIFCWJhc2VQcmljZQUHcG93UGFydAUIaW5jcmVhc2UAoI0GCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIWUFJJQ0VfQ0FMQ1VMQVRJT05fUE9XXwkApAMBBQRlZ2dzBQdwb3dQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICElBSSUNFX0NBTENVTEFUSU9OXwkApAMBBQRlZ2dzBQVwcmljZQUDbmlsBQVwcmljZQFpARFjYWxjdWxhdGVEaWZmRWdncwIHb2xkRWdncwduZXdFZ2dzBAthbHJlYWR5UGFpZAkBBWFzSW50AQkA/AcEBQR0aGlzAhdjYWxjdWxhdGVUb3RhbFByaWNlRWdncwkAzAgCBQdvbGRFZ2dzBQNuaWwFA25pbAMJAAACBQthbHJlYWR5UGFpZAULYWxyZWFkeVBhaWQECnRvdGFsVG9QYXkJAQVhc0ludAEJAPwHBAUEdGhpcwIXY2FsY3VsYXRlVG90YWxQcmljZUVnZ3MJAMwIAgUHbmV3RWdncwUDbmlsBQNuaWwDCQAAAgUKdG90YWxUb1BheQUKdG90YWxUb1BheQQEZGlmZgkAZQIFCnRvdGFsVG9QYXkFC2FscmVhZHlQYWlkBAVkZWJ1ZwkAuQkCCQDMCAIJAKwCAgIIb2xkUGFpZD0JAKQDAQULYWxyZWFkeVBhaWQJAMwIAgkArAICAghuZXdQYWlkPQkApAMBBQp0b3RhbFRvUGF5BQNuaWwCATsJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCAhJERUJVR19DQUxDVUxBVElPTlMFBWRlYnVnBQNuaWwFBGRpZmYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERYWRkQ2FwYWNpdHlUb0R1Y2sBDWFkZGVkQ2FwYWNpdHkEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEC2R1Y2tBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGNhcGFjaXR5CQEPZ2V0RHVja0NhcGFjaXR5AQULZHVja0Fzc2V0SWQEDXRvdGFsQ2FwYWNpdHkJAGQCBQhjYXBhY2l0eQUNYWRkZWRDYXBhY2l0eQQEZGlmZgkBBWFzSW50AQkA/AcEBQR0aGlzAhFjYWxjdWxhdGVEaWZmRWdncwkAzAgCBQhjYXBhY2l0eQkAzAgCBQ10b3RhbENhcGFjaXR5BQNuaWwFA25pbAMJAAACBQRkaWZmBQRkaWZmBAZhbW91bnQIBQ1zZWNvbmRQYXltZW50BmFtb3VudAMJAQIhPQIIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgEJAKwCAgJBQ0JSOiBZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJANgEAQkBDWdldEVnZ0Fzc2V0SWQAAwkBAiE9AgUGYW1vdW50BQRkaWZmCQACAQkArAICAilDQlI6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQRkaWZmBAVkZWJ1ZwkAuQkCCQDMCAIJAKwCAgIMb2xkQ2FwYWNpdHk9CQCkAwEFCGNhcGFjaXR5CQDMCAIJAKwCAgIMbmV3Q2FwYWNpdHk9CQCkAwEFDXRvdGFsQ2FwYWNpdHkJAMwIAgkArAICAg1kaWZmQ2FwYWNpdHk9CQCkAwEFDWFkZGVkQ2FwYWNpdHkJAMwIAgkArAICAglkaWZmUGFpZD0JAKQDAQUEZGlmZgUDbmlsAgE7CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPZHVja0NhcGFjaXR5S2V5AQULZHVja0Fzc2V0SWQFDXRvdGFsQ2FwYWNpdHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAQ9kdWNrQ2FwYWNpdHlLZXkBBQtkdWNrQXNzZXRJZAIHX2RlYnVnXwkApAMBBQZoZWlnaHQFBWRlYnVnBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AVYxA1g==", "height": 3338665, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6G42vE9cxv8fDcpVx1H1yWnsueiQTL6G3v9ginVNiitu Next: 5yHQVx4KkxoPVhqj33Q7F7Bb4XqyUsSkTkaZCoaCgkgH Diff:
Old | New | Differences | |
---|---|---|---|
7 | 7 | ||
8 | 8 | let increaseDecimals = 3 | |
9 | 9 | ||
10 | + | func duckCapacityKey (duckId) = ("added_capacity_" + duckId) | |
11 | + | ||
12 | + | ||
13 | + | func tryGetStringExternal (address,key) = match getString(address, key) { | |
14 | + | case a: String => | |
15 | + | a | |
16 | + | case _ => | |
17 | + | "" | |
18 | + | } | |
19 | + | ||
20 | + | ||
21 | + | func tryGetString (key) = tryGetStringExternal(this, key) | |
22 | + | ||
23 | + | ||
24 | + | func tryGetInteger (key) = match getInteger(this, key) { | |
25 | + | case b: Int => | |
26 | + | b | |
27 | + | case _ => | |
28 | + | 0 | |
29 | + | } | |
30 | + | ||
31 | + | ||
32 | + | func asInt (value) = match value { | |
33 | + | case int: Int => | |
34 | + | int | |
35 | + | case _ => | |
36 | + | throw("wrong type, expected: Int") | |
37 | + | } | |
38 | + | ||
39 | + | ||
40 | + | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
41 | + | ||
42 | + | ||
43 | + | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
44 | + | ||
45 | + | ||
46 | + | func getDuckCapacity (duckId) = tryGetInteger(duckCapacityKey(duckId)) | |
47 | + | ||
48 | + | ||
49 | + | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
50 | + | ||
51 | + | ||
52 | + | @Callable(i) | |
53 | + | func configureOracle (oracle) = if ((i.caller != this)) | |
54 | + | then throw("CCO: admin only") | |
55 | + | else [StringEntry("static_oracleAddress", oracle)] | |
56 | + | ||
57 | + | ||
58 | + | ||
10 | 59 | @Callable(i) | |
11 | 60 | func calculateTotalPriceEggs (eggs) = { | |
12 | 61 | let powPart = (pow((1000 + increase), increaseDecimals, (eggs + 1), 0, 8, HALFUP) - 100000000) | |
13 | 62 | let price = (((basePrice * powPart) / increase) / 100000) | |
14 | - | $Tuple2([IntegerEntry(("PRICE_CALCULATION_POW" + toString(eggs)), powPart), IntegerEntry(("PRICE_CALCULATION_" + toString(eggs)), price)], price) | |
63 | + | $Tuple2([IntegerEntry(("PRICE_CALCULATION_POW_" + toString(eggs)), powPart), IntegerEntry(("PRICE_CALCULATION_" + toString(eggs)), price)], price) | |
64 | + | } | |
65 | + | ||
66 | + | ||
67 | + | ||
68 | + | @Callable(i) | |
69 | + | func calculateDiffEggs (oldEggs,newEggs) = { | |
70 | + | let alreadyPaid = asInt(invoke(this, "calculateTotalPriceEggs", [oldEggs], nil)) | |
71 | + | if ((alreadyPaid == alreadyPaid)) | |
72 | + | then { | |
73 | + | let totalToPay = asInt(invoke(this, "calculateTotalPriceEggs", [newEggs], nil)) | |
74 | + | if ((totalToPay == totalToPay)) | |
75 | + | then { | |
76 | + | let diff = (totalToPay - alreadyPaid) | |
77 | + | let debug = makeString([("oldPaid=" + toString(alreadyPaid)), ("newPaid=" + toString(totalToPay))], ";") | |
78 | + | $Tuple2([StringEntry("DEBUG_CALCULATIONS", debug)], diff) | |
79 | + | } | |
80 | + | else throw("Strict value is not equal to itself.") | |
81 | + | } | |
82 | + | else throw("Strict value is not equal to itself.") | |
83 | + | } | |
84 | + | ||
85 | + | ||
86 | + | ||
87 | + | @Callable(i) | |
88 | + | func addCapacityToDuck (addedCapacity) = { | |
89 | + | let firstPayment = value(i.payments[0]) | |
90 | + | let secondPayment = value(i.payments[1]) | |
91 | + | let duckAssetId = toBase58String(value(firstPayment.assetId)) | |
92 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckAssetId], nil)) | |
93 | + | if ((children == children)) | |
94 | + | then if ((firstPayment.amount != 1)) | |
95 | + | then throw("NFT is not attached") | |
96 | + | else { | |
97 | + | let capacity = getDuckCapacity(duckAssetId) | |
98 | + | let totalCapacity = (capacity + addedCapacity) | |
99 | + | let diff = asInt(invoke(this, "calculateDiffEggs", [capacity, totalCapacity], nil)) | |
100 | + | if ((diff == diff)) | |
101 | + | then { | |
102 | + | let amount = secondPayment.amount | |
103 | + | if ((secondPayment.assetId != getEggAssetId())) | |
104 | + | then throw(("CBR: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
105 | + | else if ((amount != diff)) | |
106 | + | then throw(("CBR: Please attach the exact asset amount" + toString(diff))) | |
107 | + | else { | |
108 | + | let debug = makeString([("oldCapacity=" + toString(capacity)), ("newCapacity=" + toString(totalCapacity)), ("diffCapacity=" + toString(addedCapacity)), ("diffPaid=" + toString(diff))], ";") | |
109 | + | [IntegerEntry(duckCapacityKey(duckAssetId), totalCapacity), StringEntry(((duckCapacityKey(duckAssetId) + "_debug_") + toString(height)), debug)] | |
110 | + | } | |
111 | + | } | |
112 | + | else throw("Strict value is not equal to itself.") | |
113 | + | } | |
114 | + | else throw("Strict value is not equal to itself.") | |
15 | 115 | } | |
16 | 116 | ||
17 | 117 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let basePrice = 2000000 | |
5 | 5 | ||
6 | 6 | let increase = 1 | |
7 | 7 | ||
8 | 8 | let increaseDecimals = 3 | |
9 | 9 | ||
10 | + | func duckCapacityKey (duckId) = ("added_capacity_" + duckId) | |
11 | + | ||
12 | + | ||
13 | + | func tryGetStringExternal (address,key) = match getString(address, key) { | |
14 | + | case a: String => | |
15 | + | a | |
16 | + | case _ => | |
17 | + | "" | |
18 | + | } | |
19 | + | ||
20 | + | ||
21 | + | func tryGetString (key) = tryGetStringExternal(this, key) | |
22 | + | ||
23 | + | ||
24 | + | func tryGetInteger (key) = match getInteger(this, key) { | |
25 | + | case b: Int => | |
26 | + | b | |
27 | + | case _ => | |
28 | + | 0 | |
29 | + | } | |
30 | + | ||
31 | + | ||
32 | + | func asInt (value) = match value { | |
33 | + | case int: Int => | |
34 | + | int | |
35 | + | case _ => | |
36 | + | throw("wrong type, expected: Int") | |
37 | + | } | |
38 | + | ||
39 | + | ||
40 | + | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
41 | + | ||
42 | + | ||
43 | + | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
44 | + | ||
45 | + | ||
46 | + | func getDuckCapacity (duckId) = tryGetInteger(duckCapacityKey(duckId)) | |
47 | + | ||
48 | + | ||
49 | + | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
50 | + | ||
51 | + | ||
52 | + | @Callable(i) | |
53 | + | func configureOracle (oracle) = if ((i.caller != this)) | |
54 | + | then throw("CCO: admin only") | |
55 | + | else [StringEntry("static_oracleAddress", oracle)] | |
56 | + | ||
57 | + | ||
58 | + | ||
10 | 59 | @Callable(i) | |
11 | 60 | func calculateTotalPriceEggs (eggs) = { | |
12 | 61 | let powPart = (pow((1000 + increase), increaseDecimals, (eggs + 1), 0, 8, HALFUP) - 100000000) | |
13 | 62 | let price = (((basePrice * powPart) / increase) / 100000) | |
14 | - | $Tuple2([IntegerEntry(("PRICE_CALCULATION_POW" + toString(eggs)), powPart), IntegerEntry(("PRICE_CALCULATION_" + toString(eggs)), price)], price) | |
63 | + | $Tuple2([IntegerEntry(("PRICE_CALCULATION_POW_" + toString(eggs)), powPart), IntegerEntry(("PRICE_CALCULATION_" + toString(eggs)), price)], price) | |
64 | + | } | |
65 | + | ||
66 | + | ||
67 | + | ||
68 | + | @Callable(i) | |
69 | + | func calculateDiffEggs (oldEggs,newEggs) = { | |
70 | + | let alreadyPaid = asInt(invoke(this, "calculateTotalPriceEggs", [oldEggs], nil)) | |
71 | + | if ((alreadyPaid == alreadyPaid)) | |
72 | + | then { | |
73 | + | let totalToPay = asInt(invoke(this, "calculateTotalPriceEggs", [newEggs], nil)) | |
74 | + | if ((totalToPay == totalToPay)) | |
75 | + | then { | |
76 | + | let diff = (totalToPay - alreadyPaid) | |
77 | + | let debug = makeString([("oldPaid=" + toString(alreadyPaid)), ("newPaid=" + toString(totalToPay))], ";") | |
78 | + | $Tuple2([StringEntry("DEBUG_CALCULATIONS", debug)], diff) | |
79 | + | } | |
80 | + | else throw("Strict value is not equal to itself.") | |
81 | + | } | |
82 | + | else throw("Strict value is not equal to itself.") | |
83 | + | } | |
84 | + | ||
85 | + | ||
86 | + | ||
87 | + | @Callable(i) | |
88 | + | func addCapacityToDuck (addedCapacity) = { | |
89 | + | let firstPayment = value(i.payments[0]) | |
90 | + | let secondPayment = value(i.payments[1]) | |
91 | + | let duckAssetId = toBase58String(value(firstPayment.assetId)) | |
92 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckAssetId], nil)) | |
93 | + | if ((children == children)) | |
94 | + | then if ((firstPayment.amount != 1)) | |
95 | + | then throw("NFT is not attached") | |
96 | + | else { | |
97 | + | let capacity = getDuckCapacity(duckAssetId) | |
98 | + | let totalCapacity = (capacity + addedCapacity) | |
99 | + | let diff = asInt(invoke(this, "calculateDiffEggs", [capacity, totalCapacity], nil)) | |
100 | + | if ((diff == diff)) | |
101 | + | then { | |
102 | + | let amount = secondPayment.amount | |
103 | + | if ((secondPayment.assetId != getEggAssetId())) | |
104 | + | then throw(("CBR: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
105 | + | else if ((amount != diff)) | |
106 | + | then throw(("CBR: Please attach the exact asset amount" + toString(diff))) | |
107 | + | else { | |
108 | + | let debug = makeString([("oldCapacity=" + toString(capacity)), ("newCapacity=" + toString(totalCapacity)), ("diffCapacity=" + toString(addedCapacity)), ("diffPaid=" + toString(diff))], ";") | |
109 | + | [IntegerEntry(duckCapacityKey(duckAssetId), totalCapacity), StringEntry(((duckCapacityKey(duckAssetId) + "_debug_") + toString(height)), debug)] | |
110 | + | } | |
111 | + | } | |
112 | + | else throw("Strict value is not equal to itself.") | |
113 | + | } | |
114 | + | else throw("Strict value is not equal to itself.") | |
15 | 115 | } | |
16 | 116 | ||
17 | 117 |
github/deemru/w8io/3ef1775 29.87 ms ◑