tx · C3wwimAiH4FDwpKSrAdK8hLK9Q5wdwNjPw3jTuht68Yw

3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB:  -0.01000000 Waves

2023.01.28 07:32 [2424339] smart account 3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB > SELF 0.00000000 Waves

{ "type": 13, "id": "C3wwimAiH4FDwpKSrAdK8hLK9Q5wdwNjPw3jTuht68Yw", "fee": 1000000, "feeAssetId": null, "timestamp": 1674880315316, "version": 2, "chainId": 84, "sender": "3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB", "senderPublicKey": "Gd5NihbWQoWuTnSvq25TuV2BYZG4U1e9KDqZn9zBPix7", "proofs": [ "3y87L6GU7Wqb57d4BHLieN3pmLydanG4ZeqXZ5AXWU5QwXKQwiFiWdQRSAtydeLfzVNPHKZ1op4Tt3yJ3QBuHVUx" ], "script": "base64:BgIgCAISBAoCCAgSBwoFCAgICAgSBAoCCAgSABIFCgMIAQQVAAdWRVJTSU9OAgUxLjEuOQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAPc3RvcmFnZVZlcmlmaWVyCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfb3JhY2xlX2FkZHJlc3MABGJhbmsJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZmVlX3JlY2VpdmVyX2FkZHJlc3MADWFjY2VwdGVkVG9rZW4JAQ5nZXRTdHJpbmdCeUtleQECFmNvbmZfYWNjZXB0ZWRfdG9rZW5faWQABnVzZG5JRAkBDmdldFN0cmluZ0J5S2V5AQIMY29uZl91c2RuX2lkAAVjaHJpcwkBDmdldFN0cmluZ0J5S2V5AQISY29uZl9hZG1pbl9hZGRyZXNzABNzaWduX2FydF91c2Vyc19kYXBwCQEOZ2V0U3RyaW5nQnlLZXkBAiBjb25mX3NpZ25fYXJ0X3VzZXJzX2RhcHBfYWRkcmVzcwAUc3RvcmFnZUZlZU11bHRpcGxpZXIAAQEKY2hlY2tFbnRyeQIGcHJlZml4BHV1aWQEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICBQZwcmVmaXgFBHV1aWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FAQ9jaGVja0VudHJ5RW1haWwCBHV1aWQGZG9tYWluBAckbWF0Y2gwCQCdCAIFBHRoaXMJAKwCAgkArAICBQR1dWlkAgFABQZkb21haW4DCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgROT05FAQljaGVja1VVSUQBBHV1aWQEByRtYXRjaDAJAJ0IAgUEdGhpcwUEdXVpZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECBE5PTkUBEmNoZWNrSWZXaGl0ZUxpc3RlZAENY2FsbGVyQWRkcmVzcwQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgICEWFkZHJfV0hJVEVMSVNURURfBQ1jYWxsZXJBZGRyZXNzAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQhpc0FkcmVzcwEEYWRkcgMDAwkAAAIJALECAQUEYWRkcgAjCQAAAgkArwICBQRhZGRyAAICAjNQBwYJAAACCQCvAgIFBGFkZHIAAgICM04GCQAAAgkArwICBQRhZGRyAAICAjNNAQxjb3VudFBhcnRpZXMCC2FjY3VtdWxhdG9yBGFkZHIDCQBmAgkAsQIBBQRhZGRyAAAJAGQCBQthY2N1bXVsYXRvcgABCQBkAgULYWNjdW11bGF0b3IAAAEUY2hlY2tJZlBlbmRpbmdUb1NpZ24BA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAAAIFAWECB1BFTkRJTkcGBwcBDmdldFZhbHVlU3RyaW5nAQRqc29uCQCvAgIJALACAgUEanNvbgABCQEFdmFsdWUBCQCzCQIJALACAgUEanNvbgABAgEiAQhnZXRWYWx1ZQIEanNvbgNrZXkECGtleUluZGV4CQEFdmFsdWUBCQCzCQIFBGpzb24JAKwCAgkArAICAgEiBQNrZXkCAiI6BARkYXRhCQCwAgIFBGpzb24JAGQCCQBkAgUIa2V5SW5kZXgJALECAQUDa2V5AAMECWpzb25WYWx1ZQkBDmdldFZhbHVlU3RyaW5nAQUEZGF0YQUJanNvblZhbHVlARJnZXRKc29uQmVmb3JlVmFsdWUCBGpzb24Da2V5BAhrZXlJbmRleAkBBXZhbHVlAQkAswkCBQRqc29uCQCsAgIJAKwCAgIBIgUDa2V5AgIiOgQEZGF0YQkArwICBQRqc29uCQBkAgkAZAIFCGtleUluZGV4CQCxAgEFA2tleQADBQRkYXRhARFnZXRKc29uQWZ0ZXJWYWx1ZQIEanNvbgNrZXkECGtleUluZGV4CQEFdmFsdWUBCQCzCQIFBGpzb24JAKwCAgkArAICAgEiBQNrZXkCAiI6BARkYXRhCQCyAgIFBGpzb24JAGUCCQCxAgEFBGpzb24JAGQCCQBkAgkAZAIJAGQCBQhrZXlJbmRleAkAsQIBBQNrZXkAAwAAAAIFBGRhdGEBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAUGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzBmludm9rZQERZmlsZUNlcnRpZmljYXRpb24FBGhhc2gFdGl0bGUEdXVpZARpcGZzDHNpZ25lclB1YktleQQCaWQJAQV2YWx1ZQEIBQZpbnZva2UNdHJhbnNhY3Rpb25JZAQKZW50cnlFeGlzdAkBCmNoZWNrRW50cnkCBQRoYXNoBQR1dWlkBAl1dWlkRXhpc3QJAQljaGVja1VVSUQBBQR1dWlkBAxjYWxsZXJJc0RhcHAJAAACBQR0aGlzCAUGaW52b2tlBmNhbGxlcgQNY2FsbGVyQWRkcmVzcwMFDGNhbGxlcklzRGFwcAkApQgBCQCnCAEJANkEAQUMc2lnbmVyUHViS2V5CQDYBAEICAUGaW52b2tlBmNhbGxlcgVieXRlcwQWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQkBEmNoZWNrSWZXaGl0ZUxpc3RlZAEFDWNhbGxlckFkZHJlc3MDCQECIT0CBQplbnRyeUV4aXN0AgROT05FCQACAQIYVGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0AwkBAiE9AgUJdXVpZEV4aXN0AgROT05FCQACAQIXVGhpcyB1dWlkIGFscmVhZHkgZXhpc3QDCQECIT0CCQCxAgEFBHV1aWQAJAkAAgECHVV1aWQgc2hvdWxkIGJlIDM2IGNoYXJhY3RlcnMuAwkBAiE9AgkAsQIBBQRoYXNoAEAJAAIBAh1IYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzLgMJAGYCCQCxAgEFBXRpdGxlAGQJAAIBAiZUaXRsZSBpcyB0b28gbG9uZywgMTAwIGNoYXJhY3RlcnMgbWF4LgMDAwkBCGNvbnRhaW5zAgUEaGFzaAIBIgYJAQhjb250YWlucwIFBXRpdGxlAgEiBgkBCGNvbnRhaW5zAgUEaXBmcwIBIgkAAgECDE5vICIgYWxsb3dlZAQEZGF0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCXsiaGFzaCI6IgUEaGFzaAIOIiwidGltZXN0YW1wIjoJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXACCiwidGl0bGUiOiIFBXRpdGxlAgoiLCJpcGZzIjoiBQRpcGZzAgIifQMJAGYCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAECmNyZWRpdENvc3QDCQECIT0CCQCxAgEFBGlwZnMAAAkAZAIAAQUUc3RvcmFnZUZlZU11bHRpcGxpZXIAAQMJAGYCAAAJAGUCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtBQpjcmVkaXRDb3N0CQACAQIRTm90IGVub3VnaCBjcmVkaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgUEdXVpZAkA2AQBBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBGhhc2gFBHV1aWQJANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQV0aXRsZQUEdXVpZAkA2AQBBQJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhFhZGRyX1dISVRFTElTVEVEXwUNY2FsbGVyQWRkcmVzcwkAZQIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0FCmNyZWRpdENvc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18JANgEAQUCaWQCAV8FDWNhbGxlckFkZHJlc3MFBGRhdGEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNY2FsbGVyQWRkcmVzcwAACQDZBAEFDWFjY2VwdGVkVG9rZW4FA25pbAMJAQEhAQUMY2FsbGVySXNEYXBwBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQZpbnZva2UIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQEDnBheW1lbnRBc3NldElkAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAiBXYXZlcyBpcyBub3QgYWNjZXB0ZWQgYXMgcGF5bWVudAQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9zdG9yYWdlVmVyaWZpZXIJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEJAQV2YWx1ZQEFDnBheW1lbnRBc3NldElkBAdmZWVDb3N0AwkBAiE9AgkAsQIBBQRpcGZzAAAJAGQCBQxjdXJyZW50UHJpY2UJAGgCBRRzdG9yYWdlRmVlTXVsdGlwbGllcgUMY3VycmVudFByaWNlBQxjdXJyZW50UHJpY2UDCQECIT0CCQDZBAEFDWFjY2VwdGVkVG9rZW4FDnBheW1lbnRBc3NldElkCQACAQIoVGhpcyB0b2tlbiBpcyBub3QgYWNjZXB0ZWQgYXQgdGhlIG1vbWVudAMDCQECIT0CBQZhbW91bnQFB2ZlZUNvc3QJAGcCAAAFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0HCQACAQISVGhlIHByaWNlIGlzIHdyb25nCQDMCAIJAQtTdHJpbmdFbnRyeQIFBHV1aWQJANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQRoYXNoBQR1dWlkCQDYBAEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFdGl0bGUFBHV1aWQJANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18JANgEAQUCaWQCAV8FDWNhbGxlckFkZHJlc3MFBGRhdGEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYmFuawUHZmVlQ29zdAgFB3BheW1lbnQHYXNzZXRJZAUDbmlsCQACAQIeWW91IGFyZSBub3QgYWxsb3dlZCB0byBkbyB0aGF0Bmludm9rZQETcmV2b2tlQ2VydGlmaWNhdGlvbgIPY2VydGlmaWNhdGlvbklkDHNpZ25lclB1YktleQQCaWQJAQV2YWx1ZQEIBQZpbnZva2UNdHJhbnNhY3Rpb25JZAQMY2FsbGVySXNEYXBwCQAAAgUEdGhpcwgFBmludm9rZQZjYWxsZXIEDWNhbGxlckFkZHJlc3MDBQxjYWxsZXJJc0RhcHAJAKUIAQkApwgBCQDZBAEFDHNpZ25lclB1YktleQkA2AQBCAgFBmludm9rZQZjYWxsZXIFYnl0ZXMECmVudHJ5RXhpc3QEByRtYXRjaDAJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FD2NlcnRpZmljYXRpb25JZAIBXwUNY2FsbGVyQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECBE5PTkUECWlzUmV2b2tlZAQHJG1hdGNoMAkAnQgCBQR0aGlzCQCsAgICClNUQVRVU19GQ18FD2NlcnRpZmljYXRpb25JZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECBE5PTkUEFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JARJjaGVja0lmV2hpdGVMaXN0ZWQBBQ1jYWxsZXJBZGRyZXNzBAduZXdKc29uCQCsAgIJAKwCAgkArAICCQCzAgIFCmVudHJ5RXhpc3QAAQITLCJzdGF0dXMiOiJSRVZPS0VEXwkA2AQBBQJpZAICIn0DCQECIT0CBQlpc1Jldm9rZWQCBE5PTkUJAAIBAi1UaGlzIGNlcnRpZmljYXRpb24gaGF2ZSBhbHJlYWR5IGJlZW4gcmV2b2tlZC4DCQAAAgUKZW50cnlFeGlzdAIETk9ORQkAAgECM1lvdSBjYW5ub3QgY2hhbmdlIHRoZSBzdGF0dXMgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uLgMJAGYCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIRYWRkcl9XSElURUxJU1RFRF8FDWNhbGxlckFkZHJlc3MJAGUCBRZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgpTVEFUVVNfRkNfBQ9jZXJ0aWZpY2F0aW9uSWQJAKwCAgIIUkVWT0tFRF8JANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FD2NlcnRpZmljYXRpb25JZAIBXwUNY2FsbGVyQWRkcmVzcwUHbmV3SnNvbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyZXNzAAAJANkEAQUNYWNjZXB0ZWRUb2tlbgUDbmlsAwkBASEBBQxjYWxsZXJJc0RhcHAEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFBmludm9rZQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAQOcGF5bWVudEFzc2V0SWQDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECIFdhdmVzIGlzIG5vdCBhY2NlcHRlZCBhcyBwYXltZW50BAxjdXJyZW50UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3N0b3JhZ2VWZXJpZmllcgkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQkBBXZhbHVlAQUOcGF5bWVudEFzc2V0SWQDCQECIT0CCQDZBAEFDWFjY2VwdGVkVG9rZW4FDnBheW1lbnRBc3NldElkCQACAQIoVGhpcyB0b2tlbiBpcyBub3QgYWNjZXB0ZWQgYXQgdGhlIG1vbWVudAMDCQECIT0CBQZhbW91bnQFDGN1cnJlbnRQcmljZQkAZwIAAAUWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQcJAAIBAhJUaGUgcHJpY2UgaXMgd3JvbmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgpTVEFUVVNfRkNfBQ9jZXJ0aWZpY2F0aW9uSWQJAKwCAgIIUkVWT0tFRF8JANgEAQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgIIZGF0YV9mY18FD2NlcnRpZmljYXRpb25JZAIBXwUNY2FsbGVyQWRkcmVzcwUHbmV3SnNvbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECHllvdSBhcmUgbm90IGFsbG93ZWQgdG8gZG8gdGhhdAZpbnZva2UBD3VzZG5TaWduQ3JlZGl0cwAEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFBmludm9rZQhwYXltZW50cwAABA1jYWxsZXJBZGRyZXNzCQDYBAEICAUGaW52b2tlBmNhbGxlcgVieXRlcwQHdG9rZW5JZAkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQED251bWJlck9mQ3JlZGl0cwkAaQIJAGgCBQZhbW91bnQAAgDAhD0EFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JARJjaGVja0lmV2hpdGVMaXN0ZWQBBQ1jYWxsZXJBZGRyZXNzAwkBAiE9AgkA2AQBBQd0b2tlbklkBQZ1c2RuSUQJAAIBAhpPbmx5IFVTRE4gY2FuIGJlIGV4Y2hhbmdlZAMDCQECIT0CCQBqAgUGYW1vdW50AMCEPQAACQECIT0CCQBqAgUGYW1vdW50AMCEPQCgwh4HCQACAQkArAICCQCsAgIJAKwCAgIwWW91IGNhbiBvbmx5IGV4Y2hhbmdlIG11bHRpcGxlIG9mIDAuNSwgeW91IHNlbnQ6CQCzAgIJAKQDAQUGYW1vdW50AAYCAS4JALICAgkApAMBBQZhbW91bnQABgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhFhZGRyX1dISVRFTElTVEVEXwUNY2FsbGVyQWRkcmVzcwkAZAIFFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0FD251bWJlck9mQ3JlZGl0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRiYW5rBQZhbW91bnQFB3Rva2VuSWQFA25pbAFpARt3aGl0ZWxpc3RGcmVlQ2VydGlmaWNhdGlvbnMDB2FkZHJlc3MGYW1vdW50EmFkZFRvQ3VycmVudEFtb3VudAQGY2FsbGVyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5BAJpZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgUTc2lnbl9hcnRfdXNlcnNfZGFwcAUDbmlsBQZjYWxsZXIEDWN1cnJlbnRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICAhFhZGRyX1dISVRFTElTVEVEXwUHYWRkcmVzcwAABAluZXdBbW91bnQDBRJhZGRUb0N1cnJlbnRBbW91bnQJAGQCBQ1jdXJyZW50QW1vdW50BQZhbW91bnQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhFhZGRyX1dISVRFTElTVEVEXwUHYWRkcmVzcwUJbmV3QW1vdW50BQNuaWwJAAIBAidZb3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHdoaXRlbGlzdCB0eHMBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwMDCQAAAggFA2ludghmdW5jdGlvbgIRZmlsZUNlcnRpZmljYXRpb24JAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAhNyZXZva2VDZXJ0aWZpY2F0aW9uCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAEJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXml82NV", "height": 2424339, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BL7MExiVzrNT1qQJr7noKatPqpJjgeC4nKpyK5DPh7Mr Next: DSwxhVbBnNBu8WsXLtzNjuJzbN4YvW9dX3AgPVEgMr68 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "1.1.9"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
57
68
1416
1517 let chris = getStringByKey("conf_admin_address")
1618
17-let VERSION = "1.1.9"
19+let sign_art_users_dapp = getStringByKey("conf_sign_art_users_dapp_address")
1820
1921 let storageFeeMultiplier = 1
2022
252254 func whitelistFreeCertifications (address,amount,addToCurrentAmount) = {
253255 let caller = toString(addressFromPublicKey(i.callerPublicKey))
254256 let id = toBase58String(i.transactionId)
255- if (containsElement([chris], caller))
257+ if (containsElement([chris, sign_art_users_dapp], caller))
256258 then {
257259 let currentAmount = valueOrElse(getInteger(this, ("addr_WHITELISTED_" + address)), 0)
258260 let newAmount = if (addToCurrentAmount)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "1.1.9"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
57
68
79 let storageVerifier = value(addressFromString(getStringByKey("conf_oracle_address")))
810
911 let bank = getStringByKey("conf_fee_receiver_address")
1012
1113 let acceptedToken = getStringByKey("conf_accepted_token_id")
1214
1315 let usdnID = getStringByKey("conf_usdn_id")
1416
1517 let chris = getStringByKey("conf_admin_address")
1618
17-let VERSION = "1.1.9"
19+let sign_art_users_dapp = getStringByKey("conf_sign_art_users_dapp_address")
1820
1921 let storageFeeMultiplier = 1
2022
2123 func checkEntry (prefix,uuid) = match getString(this, (prefix + uuid)) {
2224 case a: String =>
2325 a
2426 case _ =>
2527 "NONE"
2628 }
2729
2830
2931 func checkEntryEmail (uuid,domain) = match getString(this, ((uuid + "@") + domain)) {
3032 case a: String =>
3133 a
3234 case _ =>
3335 "NONE"
3436 }
3537
3638
3739 func checkUUID (uuid) = match getString(this, uuid) {
3840 case a: String =>
3941 a
4042 case _ =>
4143 "NONE"
4244 }
4345
4446
4547 func checkIfWhiteListed (callerAddress) = match getInteger(this, ("addr_WHITELISTED_" + callerAddress)) {
4648 case a: Int =>
4749 a
4850 case _ =>
4951 0
5052 }
5153
5254
5355 func isAdress (addr) = if (if (if ((size(addr) == 35))
5456 then (take(addr, 2) == "3P")
5557 else false)
5658 then true
5759 else (take(addr, 2) == "3N"))
5860 then true
5961 else (take(addr, 2) == "3M")
6062
6163
6264 func countParties (accumulator,addr) = if ((size(addr) > 0))
6365 then (accumulator + 1)
6466 else (accumulator + 0)
6567
6668
6769 func checkIfPendingToSign (key) = match getString(this, key) {
6870 case a: String =>
6971 if ((a == "PENDING"))
7072 then true
7173 else false
7274 case _ =>
7375 false
7476 }
7577
7678
7779 func getValueString (json) = take(drop(json, 1), value(indexOf(drop(json, 1), "\"")))
7880
7981
8082 func getValue (json,key) = {
8183 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
8284 let data = drop(json, ((keyIndex + size(key)) + 3))
8385 let jsonValue = getValueString(data)
8486 jsonValue
8587 }
8688
8789
8890 func getJsonBeforeValue (json,key) = {
8991 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
9092 let data = take(json, ((keyIndex + size(key)) + 3))
9193 data
9294 }
9395
9496
9597 func getJsonAfterValue (json,key) = {
9698 let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
9799 let data = takeRight(json, (size(json) - ((((keyIndex + size(key)) + 3) + 0) + 2)))
98100 data
99101 }
100102
101103
102104 func asString (bv) = match bv {
103105 case bv0: String =>
104106 bv0
105107 case _ =>
106108 throw("Sponsored Public Key String expected")
107109 }
108110
109111
110112 @Callable(invoke)
111113 func setConf (key,val) = {
112114 let caller = toString(invoke.caller)
113115 if (containsElement([chris, toString(this)], caller))
114116 then if (contains(key, "conf_"))
115117 then [StringEntry(key, val)]
116118 else throw("Entries starting with conf_ only")
117119 else throw("You are not allowed to change this")
118120 }
119121
120122
121123
122124 @Callable(invoke)
123125 func fileCertification (hash,title,uuid,ipfs,signerPubKey) = {
124126 let id = value(invoke.transactionId)
125127 let entryExist = checkEntry(hash, uuid)
126128 let uuidExist = checkUUID(uuid)
127129 let callerIsDapp = (this == invoke.caller)
128130 let callerAddress = if (callerIsDapp)
129131 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
130132 else toBase58String(invoke.caller.bytes)
131133 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
132134 if ((entryExist != "NONE"))
133135 then throw("This entry already exist")
134136 else if ((uuidExist != "NONE"))
135137 then throw("This uuid already exist")
136138 else if ((size(uuid) != 36))
137139 then throw("Uuid should be 36 characters.")
138140 else if ((size(hash) != 64))
139141 then throw("Hash should be 64 characters.")
140142 else if ((size(title) > 100))
141143 then throw("Title is too long, 100 characters max.")
142144 else if (if (if (contains(hash, "\""))
143145 then true
144146 else contains(title, "\""))
145147 then true
146148 else contains(ipfs, "\""))
147149 then throw("No \" allowed")
148150 else {
149151 let data = (((((((("{\"hash\":\"" + hash) + "\",\"timestamp\":") + toString(lastBlock.timestamp)) + ",\"title\":\"") + title) + "\",\"ipfs\":\"") + ipfs) + "\"}")
150152 if ((callerIsWhiteListedNum > 0))
151153 then {
152154 let creditCost = if ((size(ipfs) != 0))
153155 then (1 + storageFeeMultiplier)
154156 else 1
155157 if ((0 > (callerIsWhiteListedNum - creditCost)))
156158 then throw("Not enough credit")
157159 else [StringEntry(uuid, toBase58String(id)), StringEntry((hash + uuid), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - creditCost)), StringEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(callerAddress), 0, fromBase58String(acceptedToken))]
158160 }
159161 else if (!(callerIsDapp))
160162 then {
161163 let payment = value(invoke.payments[0])
162164 let amount = value(payment.amount)
163165 let paymentAssetId = if (isDefined(payment.assetId))
164166 then value(payment.assetId)
165167 else throw("Waves is not accepted as payment")
166168 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
167169 let feeCost = if ((size(ipfs) != 0))
168170 then (currentPrice + (storageFeeMultiplier * currentPrice))
169171 else currentPrice
170172 if ((fromBase58String(acceptedToken) != paymentAssetId))
171173 then throw("This token is not accepted at the moment")
172174 else if (if ((amount != feeCost))
173175 then (0 >= callerIsWhiteListedNum)
174176 else false)
175177 then throw("The price is wrong")
176178 else [StringEntry(uuid, toBase58String(id)), StringEntry((hash + uuid), toBase58String(id)), StringEntry((title + uuid), toBase58String(id)), StringEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data), ScriptTransfer(addressFromStringValue(bank), feeCost, payment.assetId)]
177179 }
178180 else throw("You are not allowed to do that")
179181 }
180182 }
181183
182184
183185
184186 @Callable(invoke)
185187 func revokeCertification (certificationId,signerPubKey) = {
186188 let id = value(invoke.transactionId)
187189 let callerIsDapp = (this == invoke.caller)
188190 let callerAddress = if (callerIsDapp)
189191 then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
190192 else toBase58String(invoke.caller.bytes)
191193 let entryExist = match getString(this, ((("data_fc_" + certificationId) + "_") + callerAddress)) {
192194 case a: String =>
193195 a
194196 case _ =>
195197 "NONE"
196198 }
197199 let isRevoked = match getString(this, ("STATUS_FC_" + certificationId)) {
198200 case a: String =>
199201 a
200202 case _ =>
201203 "NONE"
202204 }
203205 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
204206 let newJson = (((dropRight(entryExist, 1) + ",\"status\":\"REVOKED_") + toBase58String(id)) + "\"}")
205207 if ((isRevoked != "NONE"))
206208 then throw("This certification have already been revoked.")
207209 else if ((entryExist == "NONE"))
208210 then throw("You cannot change the status of this certification.")
209211 else if ((callerIsWhiteListedNum > 0))
210212 then [IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), StringEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), StringEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson), ScriptTransfer(addressFromStringValue(callerAddress), 0, fromBase58String(acceptedToken))]
211213 else if (!(callerIsDapp))
212214 then {
213215 let payment = value(invoke.payments[0])
214216 let amount = value(payment.amount)
215217 let paymentAssetId = if (isDefined(payment.assetId))
216218 then value(payment.assetId)
217219 else throw("Waves is not accepted as payment")
218220 let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(value(paymentAssetId))))
219221 if ((fromBase58String(acceptedToken) != paymentAssetId))
220222 then throw("This token is not accepted at the moment")
221223 else if (if ((amount != currentPrice))
222224 then (0 >= callerIsWhiteListedNum)
223225 else false)
224226 then throw("The price is wrong")
225227 else [StringEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), StringEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson), ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]
226228 }
227229 else throw("You are not allowed to do that")
228230 }
229231
230232
231233
232234 @Callable(invoke)
233235 func usdnSignCredits () = {
234236 let payment = value(invoke.payments[0])
235237 let callerAddress = toBase58String(invoke.caller.bytes)
236238 let tokenId = value(payment.assetId)
237239 let amount = value(payment.amount)
238240 let numberOfCredits = ((amount * 2) / 1000000)
239241 let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
240242 if ((toBase58String(tokenId) != usdnID))
241243 then throw("Only USDN can be exchanged")
242244 else if (if (((amount % 1000000) != 0))
243245 then ((amount % 1000000) != 500000)
244246 else false)
245247 then throw(((("You can only exchange multiple of 0.5, you sent:" + dropRight(toString(amount), 6)) + ".") + takeRight(toString(amount), 6)))
246248 else [IntegerEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum + numberOfCredits)), ScriptTransfer(addressFromStringValue(bank), amount, tokenId)]
247249 }
248250
249251
250252
251253 @Callable(i)
252254 func whitelistFreeCertifications (address,amount,addToCurrentAmount) = {
253255 let caller = toString(addressFromPublicKey(i.callerPublicKey))
254256 let id = toBase58String(i.transactionId)
255- if (containsElement([chris], caller))
257+ if (containsElement([chris, sign_art_users_dapp], caller))
256258 then {
257259 let currentAmount = valueOrElse(getInteger(this, ("addr_WHITELISTED_" + address)), 0)
258260 let newAmount = if (addToCurrentAmount)
259261 then (currentAmount + amount)
260262 else amount
261263 [IntegerEntry(("addr_WHITELISTED_" + address), newAmount)]
262264 }
263265 else throw("You are not authorized to whitelist txs")
264266 }
265267
266268
267269 @Verifier(tx)
268270 func verifier () = match tx {
269271 case inv: InvokeScriptTransaction =>
270272 if (if (if (if ((inv.function == "fileCertification"))
271273 then (inv.dApp == this)
272274 else false)
273275 then (inv.fee == 500000)
274276 else false)
275277 then (inv.feeAssetId == unit)
276278 else false)
277279 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
278280 else if (if (if (if ((inv.function == "revokeCertification"))
279281 then (inv.dApp == this)
280282 else false)
281283 then (inv.fee == 500000)
282284 else false)
283285 then (inv.feeAssetId == unit)
284286 else false)
285287 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[1])))
286288 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
287289 case _ =>
288290 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
289291 }
290292

github/deemru/w8io/6500d08 
64.00 ms