2023.04.18 12:39 [3605379] smart account 3PNgw6Db2TGUQbjnV7ekve6q126xBC1e7eM > SELF 0.00000000 Waves

{ "type": 13, "id": "ESaNpPaG5AfzNky8nxZGoKHrskcSM8n31px5ndSczeuw", "fee": 900000, "feeAssetId": null, "timestamp": 1681810582571, "version": 2, "chainId": 87, "sender": "3PNgw6Db2TGUQbjnV7ekve6q126xBC1e7eM", "senderPublicKey": "ERDjJaWKWwVUSyXxLyG38P3wMqKt2Eutwy5q6iJj1uhP", "proofs": [ "2M82rqtFQNdzkPKkvZ8zVhXaWoVF7ns5j3e3mMiyLVi55J2E4yrvHrhkQ21Zbh5wSfq1me4ZwwsAQvrjNTiP2mjs", "4h7LQ2eypB65tDc9ZiFX87qzxq4e3jVLmPPQiP82oQcrMfgMhDwWt8i1CP5ENobkisxr2VrHWEXRHubQFk1tWxHm" ], "script": "base64:BgIVCAISBAoCAQgSCwoJERgYGAEBGAEIDwEQZ2V0U3RyaW5nT3JUaHJvdwIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgICDENhbid0IHJlYWQgJwUDa2V5Ag0nIGF0IGFkZHJlc3MgCQClCAEFB2FkZHJlc3MBE3BhcnNlQWRkcmVzc09yVGhyb3cBDG1heWJlQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFDG1heWJlQWRkcmVzcwkArAICCQCsAgICGkNhbid0IHBhcnNlIGFkZHJlc3MgZnJvbSAnBQxtYXliZUFkZHJlc3MCAScBGGtleV9sYXN0RmVlU3dhcFRpbWVzdGFtcAEHYXNzZXRJZAkArAICCQCsAgICBEZlZV8FB2Fzc2V0SWQCEl9sYXN0U3dhcFRpbWVzdGFtcAAMcHJveHlBZGRyZXNzCQETcGFyc2VBZGRyZXNzT3JUaHJvdwEJARBnZXRTdHJpbmdPclRocm93AgUEdGhpcwINcHJveHktYWRkcmVzcwEKZ2V0QXNzZXRJZAEFYXNzZXQDCQAAAgUFYXNzZXQCBVdBVkVTBQR1bml0CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUFYXNzZXQJAKwCAgIRQ2FuJ3QgZmluZCBhc3NldCAFBWFzc2V0AmlkAQ9nZXRBc3NldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQICQDvBwEFBHRoaXMJYXZhaWxhYmxlABJmZWVQcmlvcml0eUFzc2V0SWQJAQpnZXRBc3NldElkAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCEUZlZV9wcmlvcml0eUFzc2V0Ah1GZWUgcHJpb3JpdHkgYXNzZXQgaXMgbm90IHNldAATZmVlRXhjbHVkZWRBc3NldElkcwkAzQgCBAckbWF0Y2gwCQCdCAIFBHRoaXMCEkZlZV9leGNsdWRlZEFzc2V0cwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEC2V4Y2x1ZGVkU3RyBQckbWF0Y2gwCgEGYXBwZW5kAgNhY2MLbmV4dEFzc2V0SWQJAM0IAgUDYWNjCQEKZ2V0QXNzZXRJZAEFC25leHRBc3NldElkCgACJGwJALwJAgULZXhjbHVkZWRTdHICASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBmFwcGVuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgUDbmlsBRJmZWVQcmlvcml0eUFzc2V0SWQAFmZlZVByaW9yaXR5TWluUmVjZWl2ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIXRmVlX3ByaW9yaXR5TWluUmVjZWl2ZWQAAAAKZmVlTWFuYWdlcgQHJG1hdGNoMAkAnQgCBQR0aGlzAhRGZWVfbWFuYWdlclB1YmxpY0tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcED21heWJlRmVlTWFuYWdlcgUHJG1hdGNoMAkA2QQBBQ9tYXliZUZlZU1hbmFnZXIFBHVuaXQACnR4RmVlTGltaXQJAJoIAgUEdGhpcwIORmVlX3R4RmVlTGltaXQAD2ZlZVN3YXBJbnRlcnZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhBGZWVfc3dhcEludGVydmFsAAABFGdldFByaW9yaXR5QXNzZXRJbmZvAAMJAQEhAQkBCWlzRGVmaW5lZAEFEmZlZVByaW9yaXR5QXNzZXRJZAkAlgoEAgVXQVZFUwIFV0FWRVMAgMLXLwUWZmVlUHJpb3JpdHlNaW5SZWNlaXZlZAQHJG1hdGNoMAkA7AcBCQEFdmFsdWUBBRJmZWVQcmlvcml0eUFzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEEGZlZVByaW9yaXR5QXNzZXQFByRtYXRjaDAJAJYKBAkA2AQBCAUQZmVlUHJpb3JpdHlBc3NldAJpZAgFEGZlZVByaW9yaXR5QXNzZXQEbmFtZQkAbAYACgAACAUQZmVlUHJpb3JpdHlBc3NldAhkZWNpbWFscwAAAAAFBERPV04FFmZlZVByaW9yaXR5TWluUmVjZWl2ZWQJAAIBAhRVbmV4cGVjdGVkIGJlaGF2aW91cgEXZ2V0TGFzdEZlZVN3YXBUaW1lc3RhbXABB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBGGtleV9sYXN0RmVlU3dhcFRpbWVzdGFtcAEJANgEAQkBC3ZhbHVlT3JFbHNlAgUHYXNzZXRJZAEEE6vZMwAAARdzZXRMYXN0RmVlU3dhcFRpbWVzdGFtcAIHYXNzZXRJZAl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlfbGFzdEZlZVN3YXBUaW1lc3RhbXABCQDYBAEJAQt2YWx1ZU9yRWxzZQIFB2Fzc2V0SWQBBBOr2TMFCXRpbWVzdGFtcAUDbmlsAgNpbnYBE2NsYWltUmVmZXJyZXJSZXdhcmQCBmFtb3VudAdhc3NldElkBAVhc3NldAkBCmdldEFzc2V0SWQBBQdhc3NldElkAwkBAiE9AgUMcHJveHlBZGRyZXNzCAUDaW52BmNhbGxlcgkAAgECK29ubHkgc2VsZiBjYWxscyBvciBieSBjb2xsZWN0b3IgYXJlIGFsbG93ZWQDCQBnAgAABQZhbW91bnQJAAIBAhdJbmNvcnJlY3QgcmV3YXJkIGFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxwcm94eUFkZHJlc3MFBmFtb3VudAUFYXNzZXQFA25pbANpbnYBDFBSSVZBVEVfc3dhcAkJYW1vdW50c0luCWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2ULbWluUmVjZWl2ZWQHb3B0aW9ucwlwbXRBbW91bnQLcG10QXNzZXRTdHIECnBtdEFzc2V0SWQJAQpnZXRBc3NldElkAQULcG10QXNzZXRTdHIEA3BtdAMJAQ9jb250YWluc0VsZW1lbnQCBRNmZWVFeGNsdWRlZEFzc2V0SWRzBQpwbXRBc3NldElkCQACAQkArAICCQCsAgICB0Fzc2V0IGAFC3BtdEFzc2V0U3RyAh9gIGlzIGV4Y2x1ZGVkIGZyb20gUFJJVkFURV9zd2FwAwkAZwIAAAUJcG10QW1vdW50CQACAQIfUGF5bWVudCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAMJAQIhPQIIBQNpbnYGY2FsbGVyBQR0aGlzCQACAQIbT25seSBzZWxmIGNhbGxzIGFyZSBhbGxvd2VkAwkBCWlzRGVmaW5lZAEIBQNpbnYKZmVlQXNzZXRJZAkAAgECIU9ubHkgV0FWRVMgYWxsb3dlZCBmb3IgZmVlQXNzZXRJZAMDCQEJaXNEZWZpbmVkAQUKdHhGZWVMaW1pdAkAZgIIBQNpbnYDZmVlCQEFdmFsdWUBBQp0eEZlZUxpbWl0BwkAAgEJAKwCAgkArAICAg1NYXhpbXVtIGZlZSAoCQCkAwEJAQV2YWx1ZQEFCnR4RmVlTGltaXQCDSkgaXMgZXhjZWVkZWQDCQBmAgUPZmVlU3dhcEludGVydmFsCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJARdnZXRMYXN0RmVlU3dhcFRpbWVzdGFtcAEFCnBtdEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIhU3dhcCBpcyBvbmx5IHBvc3NpYmxlIG9uY2UgZXZlcnkgCQCkAwEJAGkCBQ9mZWVTd2FwSW50ZXJ2YWwAgN3bAQIGIGhvdXJzBA1iYWxhbmNlQmVmb3JlCQEPZ2V0QXNzZXRCYWxhbmNlAQUSZmVlUHJpb3JpdHlBc3NldElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEBHN3YXAJAPwHBAUMcHJveHlBZGRyZXNzAgRzd2FwCQDMCAIFCWFtb3VudHNJbgkAzAgCBQlhZGRyZXNzZXMJAMwIAgUPYXNzZXRzVG9SZWNlaXZlCQDMCAIFC2VzdFJlY2VpdmVkCQDMCAIFEXNsaXBwYWdlVG9sZXJhbmNlCQDMCAIFC21pblJlY2VpdmVkCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCBQNwbXQFA25pbAMJAAACBQRzd2FwBQRzd2FwBAxiYWxhbmNlQWZ0ZXIJAQ9nZXRBc3NldEJhbGFuY2UBBRJmZWVQcmlvcml0eUFzc2V0SWQDCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIECHJlY2VpdmVkCQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAZwIAAAUIcmVjZWl2ZWQJAAIBAipTd2FwIGlzIG9ubHkgYWxsb3dlZCB0byB0aGUgcHJpb3JpdHkgYXNzZXQDCQBmAgUWZmVlUHJpb3JpdHlNaW5SZWNlaXZlZAUIcmVjZWl2ZWQJAAIBCQCsAgICGVN3YXAgcmVzdWx0IGlzIGxlc3MgdGhhbiAJAKQDAQUWZmVlUHJpb3JpdHlNaW5SZWNlaXZlZAkBF3NldExhc3RGZWVTd2FwVGltZXN0YW1wAgUKcG10QXNzZXRJZAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAttYXliZU9yYWNsZQkApggBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCBk9yYWNsZQIABA5tYXliZUFkbWluS2V5cwMJAQlpc0RlZmluZWQBBQttYXliZU9yYWNsZQkAnQgCCQEFdmFsdWUBBQttYXliZU9yYWNsZQIJQWRtaW5LZXlzBQR1bml0BA9pc0ZlZVN3YXBJbnZva2UEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJ0eAUHJG1hdGNoMAMJAAACCAUCdHgEZEFwcAUEdGhpcwkAAAIIBQJ0eAhmdW5jdGlvbgIMUFJJVkFURV9zd2FwBwcDAwkBCWlzRGVmaW5lZAEFCmZlZU1hbmFnZXIFD2lzRmVlU3dhcEludm9rZQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQV2YWx1ZQEFCmZlZU1hbmFnZXIEByRtYXRjaDAFDm1heWJlQWRtaW5LZXlzAwkAAQIFByRtYXRjaDACBlN0cmluZwQMYWRtaW5LZXlzU3RyBQckbWF0Y2gwBAlhZG1pbktleXMECnN0cmluZ0tleXMJALUJAgUMYWRtaW5LZXlzU3RyAgEsCQDMCAIJANkEAQkAkQMCBQpzdHJpbmdLZXlzAAAJAMwIAgkA2QQBCQCRAwIFCnN0cmluZ0tleXMAAQkAzAgCCQDZBAEJAJEDAgUKc3RyaW5nS2V5cwACBQNuaWwKAQ92ZXJpZnlCeUFsbEtleXMBBXByb29mAwkA9AMDCAUCdHgJYm9keUJ5dGVzBQVwcm9vZgkAkQMCBQlhZG1pbktleXMAAAABAwkA9AMDCAUCdHgJYm9keUJ5dGVzBQVwcm9vZgkAkQMCBQlhZG1pbktleXMAAQAKAwkA9AMDCAUCdHgJYm9keUJ5dGVzBQVwcm9vZgkAkQMCBQlhZG1pbktleXMAAgBkAAAJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIAbgkAzAgCAGUJAMwIAgALBQNuaWwJAGQCCQEPdmVyaWZ5QnlBbGxLZXlzAQkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ92ZXJpZnlCeUFsbEtleXMBCQCRAwIIBQJ0eAZwcm9vZnMAAQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tled3qmAk=", "height": 3605379, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 47o22YuaJEETcXtfASAC7HiBpfcPxP1iKbhV5g6Z4ZPS Next: FdctyhtzZfeybU3znkeo7u9aAxgDpQqWjdBSwGtY7s5z Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
1717 else valueOrErrorMessage(assetInfo(fromBase58String(asset)), ("Can't find asset " + asset)).id
1818
1919
20-let feePriorityAssetId = match getString(this, "Fee_priorityAsset") {
21- case priorityAssetStr: String =>
22- fromBase58String(priorityAssetStr)
20+func getAssetBalance (assetId) = match assetId {
21+ case id: ByteVector =>
22+ assetBalance(this, id)
2323 case _ =>
24- throw("WAVES cannot be a priority asset")
24+ wavesBalance(this).available
2525 }
26+
27+
28+let feePriorityAssetId = getAssetId(valueOrErrorMessage(getString(this, "Fee_priorityAsset"), "Fee priority asset is not set"))
29+
30+let feeExcludedAssetIds = (match getString(this, "Fee_excludedAssets") {
31+ case excludedStr: String =>
32+ func append (acc,nextAssetId) = (acc :+ getAssetId(nextAssetId))
33+
34+ let $l = split_4C(excludedStr, ",")
35+ let $s = size($l)
36+ let $acc0 = nil
37+ func $f0_1 ($a,$i) = if (($i >= $s))
38+ then $a
39+ else append($a, $l[$i])
40+
41+ func $f0_2 ($a,$i) = if (($i >= $s))
42+ then $a
43+ else throw("List size exceeds 10")
44+
45+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
46+ case _ =>
47+ nil
48+} :+ feePriorityAssetId)
2649
2750 let feePriorityMinReceived = valueOrElse(getInteger(this, "Fee_priorityMinReceived"), 0)
2851
3760
3861 let feeSwapInterval = valueOrElse(getInteger(this, "Fee_swapInterval"), 0)
3962
40-func getPriorityAssetInfo () = match assetInfo(feePriorityAssetId) {
41- case feePriorityAsset: Asset =>
42- $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived)
43- case _ =>
44- throw("Unexpected behaviour")
45-}
63+func getPriorityAssetInfo () = if (!(isDefined(feePriorityAssetId)))
64+ then $Tuple4("WAVES", "WAVES", 100000000, feePriorityMinReceived)
65+ else match assetInfo(value(feePriorityAssetId)) {
66+ case feePriorityAsset: Asset =>
67+ $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived)
68+ case _ =>
69+ throw("Unexpected behaviour")
70+ }
4671
4772
48-func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(assetId))), 0)
73+func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(valueOrElse(assetId, base58'WAVES')))), 0)
4974
5075
51-func setLastFeeSwapTimestamp (assetId,timestamp) = [IntegerEntry(key_lastFeeSwapTimestamp(toBase58String(assetId)), timestamp)]
76+func setLastFeeSwapTimestamp (assetId,timestamp) = [IntegerEntry(key_lastFeeSwapTimestamp(toBase58String(valueOrElse(assetId, base58'WAVES'))), timestamp)]
5277
5378
5479 @Callable(inv)
6590
6691 @Callable(inv)
6792 func PRIVATE_swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options,pmtAmount,pmtAssetStr) = {
68- let pmtAssetId = fromBase58String(pmtAssetStr)
69- let pmt = if (if ((pmtAssetStr == "WAVES"))
70- then true
71- else (pmtAssetId == feePriorityAssetId))
72- then throw("Unable to swap WAVES or priority asset")
93+ let pmtAssetId = getAssetId(pmtAssetStr)
94+ let pmt = if (containsElement(feeExcludedAssetIds, pmtAssetId))
95+ then throw((("Asset `" + pmtAssetStr) + "` is excluded from PRIVATE_swap"))
7396 else if ((0 >= pmtAmount))
7497 then throw("Payment amount must be positive")
7598 else AttachedPayment(pmtAssetId, pmtAmount)
84107 else if ((feeSwapInterval > (lastBlock.timestamp - getLastFeeSwapTimestamp(pmtAssetId))))
85108 then throw((("Swap is only possible once every " + toString((feeSwapInterval / 3600000))) + " hours"))
86109 else {
87- let balanceBefore = assetBalance(this, feePriorityAssetId)
110+ let balanceBefore = getAssetBalance(feePriorityAssetId)
88111 if ((balanceBefore == balanceBefore))
89112 then {
90113 let swap = invoke(proxyAddress, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [pmt])
91114 if ((swap == swap))
92115 then {
93- let balanceAfter = assetBalance(this, feePriorityAssetId)
116+ let balanceAfter = getAssetBalance(feePriorityAssetId)
94117 if ((balanceAfter == balanceAfter))
95118 then {
96119 let received = (balanceAfter - balanceBefore)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
88
99
1010 func key_lastFeeSwapTimestamp (assetId) = (("Fee_" + assetId) + "_lastSwapTimestamp")
1111
1212
1313 let proxyAddress = parseAddressOrThrow(getStringOrThrow(this, "proxy-address"))
1414
1515 func getAssetId (asset) = if ((asset == "WAVES"))
1616 then unit
1717 else valueOrErrorMessage(assetInfo(fromBase58String(asset)), ("Can't find asset " + asset)).id
1818
1919
20-let feePriorityAssetId = match getString(this, "Fee_priorityAsset") {
21- case priorityAssetStr: String =>
22- fromBase58String(priorityAssetStr)
20+func getAssetBalance (assetId) = match assetId {
21+ case id: ByteVector =>
22+ assetBalance(this, id)
2323 case _ =>
24- throw("WAVES cannot be a priority asset")
24+ wavesBalance(this).available
2525 }
26+
27+
28+let feePriorityAssetId = getAssetId(valueOrErrorMessage(getString(this, "Fee_priorityAsset"), "Fee priority asset is not set"))
29+
30+let feeExcludedAssetIds = (match getString(this, "Fee_excludedAssets") {
31+ case excludedStr: String =>
32+ func append (acc,nextAssetId) = (acc :+ getAssetId(nextAssetId))
33+
34+ let $l = split_4C(excludedStr, ",")
35+ let $s = size($l)
36+ let $acc0 = nil
37+ func $f0_1 ($a,$i) = if (($i >= $s))
38+ then $a
39+ else append($a, $l[$i])
40+
41+ func $f0_2 ($a,$i) = if (($i >= $s))
42+ then $a
43+ else throw("List size exceeds 10")
44+
45+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
46+ case _ =>
47+ nil
48+} :+ feePriorityAssetId)
2649
2750 let feePriorityMinReceived = valueOrElse(getInteger(this, "Fee_priorityMinReceived"), 0)
2851
2952 let feeManager = match getString(this, "Fee_managerPublicKey") {
3053 case maybeFeeManager: String =>
3154 fromBase58String(maybeFeeManager)
3255 case _ =>
3356 unit
3457 }
3558
3659 let txFeeLimit = getInteger(this, "Fee_txFeeLimit")
3760
3861 let feeSwapInterval = valueOrElse(getInteger(this, "Fee_swapInterval"), 0)
3962
40-func getPriorityAssetInfo () = match assetInfo(feePriorityAssetId) {
41- case feePriorityAsset: Asset =>
42- $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived)
43- case _ =>
44- throw("Unexpected behaviour")
45-}
63+func getPriorityAssetInfo () = if (!(isDefined(feePriorityAssetId)))
64+ then $Tuple4("WAVES", "WAVES", 100000000, feePriorityMinReceived)
65+ else match assetInfo(value(feePriorityAssetId)) {
66+ case feePriorityAsset: Asset =>
67+ $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived)
68+ case _ =>
69+ throw("Unexpected behaviour")
70+ }
4671
4772
48-func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(assetId))), 0)
73+func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(valueOrElse(assetId, base58'WAVES')))), 0)
4974
5075
51-func setLastFeeSwapTimestamp (assetId,timestamp) = [IntegerEntry(key_lastFeeSwapTimestamp(toBase58String(assetId)), timestamp)]
76+func setLastFeeSwapTimestamp (assetId,timestamp) = [IntegerEntry(key_lastFeeSwapTimestamp(toBase58String(valueOrElse(assetId, base58'WAVES'))), timestamp)]
5277
5378
5479 @Callable(inv)
5580 func claimReferrerReward (amount,assetId) = {
5681 let asset = getAssetId(assetId)
5782 if ((proxyAddress != inv.caller))
5883 then throw("only self calls or by collector are allowed")
5984 else if ((0 >= amount))
6085 then throw("Incorrect reward amount")
6186 else [ScriptTransfer(proxyAddress, amount, asset)]
6287 }
6388
6489
6590
6691 @Callable(inv)
6792 func PRIVATE_swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options,pmtAmount,pmtAssetStr) = {
68- let pmtAssetId = fromBase58String(pmtAssetStr)
69- let pmt = if (if ((pmtAssetStr == "WAVES"))
70- then true
71- else (pmtAssetId == feePriorityAssetId))
72- then throw("Unable to swap WAVES or priority asset")
93+ let pmtAssetId = getAssetId(pmtAssetStr)
94+ let pmt = if (containsElement(feeExcludedAssetIds, pmtAssetId))
95+ then throw((("Asset `" + pmtAssetStr) + "` is excluded from PRIVATE_swap"))
7396 else if ((0 >= pmtAmount))
7497 then throw("Payment amount must be positive")
7598 else AttachedPayment(pmtAssetId, pmtAmount)
7699 if ((inv.caller != this))
77100 then throw("Only self calls are allowed")
78101 else if (isDefined(inv.feeAssetId))
79102 then throw("Only WAVES allowed for feeAssetId")
80103 else if (if (isDefined(txFeeLimit))
81104 then (inv.fee > value(txFeeLimit))
82105 else false)
83106 then throw((("Maximum fee (" + toString(value(txFeeLimit))) + ") is exceeded"))
84107 else if ((feeSwapInterval > (lastBlock.timestamp - getLastFeeSwapTimestamp(pmtAssetId))))
85108 then throw((("Swap is only possible once every " + toString((feeSwapInterval / 3600000))) + " hours"))
86109 else {
87- let balanceBefore = assetBalance(this, feePriorityAssetId)
110+ let balanceBefore = getAssetBalance(feePriorityAssetId)
88111 if ((balanceBefore == balanceBefore))
89112 then {
90113 let swap = invoke(proxyAddress, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [pmt])
91114 if ((swap == swap))
92115 then {
93- let balanceAfter = assetBalance(this, feePriorityAssetId)
116+ let balanceAfter = getAssetBalance(feePriorityAssetId)
94117 if ((balanceAfter == balanceAfter))
95118 then {
96119 let received = (balanceAfter - balanceBefore)
97120 if ((0 >= received))
98121 then throw("Swap is only allowed to the priority asset")
99122 else if ((feePriorityMinReceived > received))
100123 then throw(("Swap result is less than " + toString(feePriorityMinReceived)))
101124 else setLastFeeSwapTimestamp(pmtAssetId, lastBlock.timestamp)
102125 }
103126 else throw("Strict value is not equal to itself.")
104127 }
105128 else throw("Strict value is not equal to itself.")
106129 }
107130 else throw("Strict value is not equal to itself.")
108131 }
109132 }
110133
111134
112135 @Verifier(tx)
113136 func verify () = {
114137 let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
115138 let maybeAdminKeys = if (isDefined(maybeOracle))
116139 then getString(value(maybeOracle), "AdminKeys")
117140 else unit
118141 let isFeeSwapInvoke = match tx {
119142 case tx: InvokeScriptTransaction =>
120143 if ((tx.dApp == this))
121144 then (tx.function == "PRIVATE_swap")
122145 else false
123146 case _ =>
124147 false
125148 }
126149 if (if (isDefined(feeManager))
127150 then isFeeSwapInvoke
128151 else false)
129152 then sigVerify(tx.bodyBytes, tx.proofs[0], value(feeManager))
130153 else match maybeAdminKeys {
131154 case adminKeysStr: String =>
132155 let adminKeys = {
133156 let stringKeys = split(adminKeysStr, ",")
134157 [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
135158 }
136159 func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
137160 then 1
138161 else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
139162 then 10
140163 else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
141164 then 100
142165 else 0
143166
144167 containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
145168 case _ =>
146169 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
147170 }
148171 }
149172

github/deemru/w8io/786bc32 
37.18 ms