tx · APqF3hD769g33XH55FjJ3HYynspPAC1JoQMVZimCGwLM

3MwMR1ZFfy712trHVLisizYmvRQwsg8z9Bn:  -0.01400000 Waves

2020.03.27 16:50 [927921] smart account 3MwMR1ZFfy712trHVLisizYmvRQwsg8z9Bn > SELF 0.00000000 Waves

{ "type": 13, "id": "APqF3hD769g33XH55FjJ3HYynspPAC1JoQMVZimCGwLM", "fee": 1400000, "feeAssetId": null, "timestamp": 1585317079374, "version": 1, "sender": "3MwMR1ZFfy712trHVLisizYmvRQwsg8z9Bn", "senderPublicKey": "97T1f7qUWzkowGZkQrhKdK7mb6NMiCypcdgw9AJkb7Lx", "proofs": [ "5Y9xHdAH4uQ2gG17EuUAZrSZ8Ad6adggp7PTbX4YWKRg4djVcsiXWv2yyXm7kq9e6XUT59SB7n7JfQAuye13vvDo" ], "script": "base64:AAIDAAAAAAAAABUIARIAEgASBAoCCAESABIDCgEIEgAAAABTAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBwEAAAAVZ2V0TnVtYmVyRnJvbU9wdGlvbmFsAAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAMU0VORFRYRVhQSVJFAAAAAAAAAAAeAAAAAA9MSVNUU1BMSVRTWU1CT0wCAAAAAV8AAAAADkxJU1REQVRBU1lNQk9MAgAAAAErAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAAAVQQVVMSQAAAAAAAA9CQAAAAAANREVGSUNJVE9GRlNFVAAAAAAAAAAABQAAAAASTmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEkF1Y3Rpb25Db250cmFjdEtleQIAAAAQYXVjdGlvbl9jb250cmFjdAAAAAAWTGlxdWlkYXRpb25Db250cmFjdEtleQIAAAAUbGlxdWlkYXRpb25fY29udHJhY3QAAAAADlJQRENvbnRyYWN0S2V5AgAAAAxycGRfY29udHJhY3QAAAAAEUNvbnRvbENvbnRyYWN0S2V5AgAAABBjb250cm9sX2NvbnRyYWN0AAAAABtCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWxLZXkCAAAAG2JhbGFuY2Vfd2F2ZXNfbG9ja19pbnRlcnZhbAAAAAAeQmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsS2V5AgAAAB5iYWxhbmNlX25ldXRyaW5vX2xvY2tfaW50ZXJ2YWwAAAAAFU1pbldhdmVzU3dhcEFtb3VudEtleQIAAAAVbWluX3dhdmVzX3N3YXBfYW1vdW50AAAAABhNaW5OZXV0cmlub1N3YXBBbW91bnRLZXkCAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAAAAAAbTm9kZU9yYWNsZVByb3ZpZGVyUHViS2V5S2V5AgAAABRub2RlX29yYWNsZV9wcm92aWRlcgAAAAAWU3BvbnNvcmVkRmVlTG93ZXJCb3VuZAAAAAAAAAAAMgAAAAAWU3BvbnNvcmVkRmVlVXBwZXJCb3VuZAAAAAAAAAAAZAAAAAAOTUlOVFJBTlNGRVJGRUUAAAAAAAABhqAAAAAAD2N1cnJlbnRDb25maWdJZAIAAAARY3VycmVudF9jb25maWdfaWQBAAAADmdldEZlZVByaWNlS2V5AAAAAQAAAAJpZAkAASwAAAACAgAAAApwcmljZV9mZWVfBQAAAAJpZAEAAAAMZ2V0TWluRmVlS2V5AAAAAQAAAAJpZAkAASwAAAACAgAAAAttaW5mZWVfZmVlXwUAAAACaWQBAAAAEmdldENvbmZpZ1N0YXR1c0tleQAAAAEAAAACaWQJAAEsAAAAAgIAAAASZmVlX2NvbmZpZ19zdGF0dXNfBQAAAAJpZAAAAAANUlBEQmFsYW5jZUtleQIAAAALcnBkX2JhbGFuY2UBAAAAGGdldFJQRENvbnRyYWN0QmFsYW5jZUtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIFAAAADVJQREJhbGFuY2VLZXkCAAAAAV8JAAJYAAAAAQUAAAAHYXNzZXRJZAAAAAAIUHJpY2VLZXkCAAAABXByaWNlAAAAAA1QcmljZUluZGV4S2V5AgAAAAtwcmljZV9pbmRleAAAAAAMSXNCbG9ja2VkS2V5AgAAAAppc19ibG9ja2VkAQAAABJnZXRQcmljZUhpc3RvcnlLZXkAAAABAAAABWJsb2NrCQABLAAAAAIJAAEsAAAAAgUAAAAIUHJpY2VLZXkCAAAAAV8JAAGkAAAAAQUAAAAFYmxvY2sBAAAAGGdldEhlaWdodFByaWNlQnlJbmRleEtleQAAAAEAAAAFaW5kZXgJAAEsAAAAAgkAASwAAAACBQAAAA1QcmljZUluZGV4S2V5AgAAAAFfCQABpAAAAAEFAAAABWluZGV4AAAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAhuZXV0cmlubwEAAAAgZ2V0UlBEU25hcHNob3RDb250cmFjdEJhbGFuY2VLZXkAAAACAAAABWNvdW50AAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAANUlBEQmFsYW5jZUtleQIAAAABXwkAAlgAAAABBQAAAAdhc3NldElkAgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAAB1nZXRDYW5jZWxMZWFzZVR4UmVzZXJ2ZUZlZUtleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAAG2NhbmNlbF9sZWFzZV90eF9yZXNlcnZlX2ZlZQIAAAABXwUAAAAEaGFzaAEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQAAAAVvd25lcgkAASwAAAACCQABLAAAAAIFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQIAAAABXwUAAAAFb3duZXIBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEAAAAFb3duZXIJAAEsAAAAAgkAASwAAAACBQAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkCAAAAAV8FAAAABW93bmVyAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABAAAABW93bmVyCQABLAAAAAICAAAAFWJhbGFuY2VfdW5sb2NrX2Jsb2NrXwUAAAAFb3duZXIBAAAAD2dldFJQRFByb2ZpdEtleQAAAAEAAAAFY291bnQJAAEsAAAAAgkAASwAAAACAgAAAApycGRfcHJvZml0AgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQAAAAAAAAAAGQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAABmFtb3VudAUAAAAFcHJpY2UBAAAAFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QAAAABAAAACWpzb25BcnJheQkABLUAAAACBQAAAAlqc29uQXJyYXkCAAAAASwAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkAAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQUAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEkF1Y3Rpb25Db250cmFjdEtleQAAAAALcnBkQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADlJQRENvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEUNvbnRvbENvbnRyYWN0S2V5AAAAAApwcmljZUluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAA1QcmljZUluZGV4S2V5AAAAAAlpc0Jsb2NrZWQJAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAxJc0Jsb2NrZWRLZXkAAAAAGG5vZGVPcmFjbGVQcm92aWRlclB1YktleQkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABtOb2RlT3JhY2xlUHJvdmlkZXJQdWJLZXlLZXkAAAAAGGJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAbQmFsYW5jZVdhdmVzTG9ja0ludGVydmFsS2V5AAAAABtiYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWwJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAHkJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbEtleQAAAAASbWluV2F2ZXNTd2FwQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkAAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5AAAAAAtib25kQXNzZXRJZAkAAlkAAAABAgAAACw2blNwVnlOSDd5TTY5ZWc0NDZ3clFSOTRpcGJiY21aTVUxRU5Qd2FuQzk3ZwAAAAAVZGVwcmVjYXRlZEJvbmRBc3NldElkCQACWQAAAAECAAAALDk3NWFrWkJmbk1qNTEzVTdNWmFIS3pRcm1zRXg1YUUzd2RXS1RySEJoYmpGAAAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAR0aGlzAAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAAB3Jlc2VydmUJAABlAAAAAgkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEndhdmVzTG9ja2VkQmFsYW5jZQAAAAAObmV1dHJpbm9TdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAdleHRyYWN0AAAAAQkAA+wAAAABBQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAIcXVhbnRpdHkJAAPrAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkCQAD6wAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAAAAAAdzdXJwbHVzCQAAZQAAAAIJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlBQAAAA5uZXV0cmlub1N1cHBseQAAAAAHZGVmaWNpdAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UBAAAAG2NoZWNrSXNWYWxpZE1pblNwb25zb3JlZEZlZQAAAAEAAAACdHgEAAAAAmNwAAAAAAAAAABaBAAAAA9yZWFsTmV1dHJpbm9GZWUJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAOTUlOVFJBTlNGRVJGRUUFAAAAAmNwBAAAAAptdWx0aXBsaWVyAAAAAAAAAAAKBAAAAA1tZWRpdW1QZXJjZW50CQAAZAAAAAIJAABrAAAAAwUAAAAWU3BvbnNvcmVkRmVlTG93ZXJCb3VuZAUAAAAKbXVsdGlwbGllcgAAAAAAAAAAAQkAAGsAAAADCQAAZQAAAAIFAAAAFlNwb25zb3JlZEZlZVVwcGVyQm91bmQFAAAAFlNwb25zb3JlZEZlZUxvd2VyQm91bmQFAAAACm11bHRpcGxpZXIAAAAAAAAAAAIEAAAACGV4YWN0RmVlCQAAZAAAAAIFAAAAD3JlYWxOZXV0cmlub0ZlZQkAAGsAAAADBQAAAA9yZWFsTmV1dHJpbm9GZWUFAAAADW1lZGl1bVBlcmNlbnQJAABrAAAAAwAAAAAAAAAAZAUAAAAKbXVsdGlwbGllcgAAAAAAAAAAAQQAAAAHY29ycmVjdAkAAaQAAAABCQEAAAAVZ2V0TnVtYmVyRnJvbU9wdGlvbmFsAAAAAQgFAAAAAnR4AAAAFG1pblNwb25zb3JlZEFzc2V0RmVlBAAAAAVleGFjdAkAAaQAAAABBQAAAAhleGFjdEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADUNvcnJlY3QgZmVlOiAFAAAAB2NvcnJlY3QCAAAACTsgRXhhY3Q6IAUAAAAFZXhhY3QCAAAAETsgUmVhbCBVU0ROIGZlZTogCQABpAAAAAEFAAAAD3JlYWxOZXV0cmlub0ZlZQIAAAASOyBNZWRpdW0gcGVyY2VudDogCQABpAAAAAEFAAAADW1lZGl1bVBlcmNlbnQBAAAAFWdldFJQRENvbnRyYWN0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAC3JwZENvbnRyYWN0CQEAAAAYZ2V0UlBEQ29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAPZ2V0UHJpY2VIaXN0b3J5AAAAAQAAAAVibG9jawkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEmdldFByaWNlSGlzdG9yeUtleQAAAAEFAAAABWJsb2NrAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABAAAABWluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAAYZ2V0SGVpZ2h0UHJpY2VCeUluZGV4S2V5AAAAAQUAAAAFaW5kZXgBAAAAGmdldENhbmNlbExlYXNlVHhSZXNlcnZlRmVlAAAAAQAAAARoYXNoCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAdZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWVLZXkAAAABBQAAAARoYXNoAQAAABVnZXRXYXZlc0xvY2tlZEJhbGFuY2UAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAFb3duZXIBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEAAAAFb3duZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAVvd25lcgEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQAAAAVvd25lcgkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldEJhbGFuY2VVbmxvY2tCbG9ja0tleQAAAAEFAAAABW93bmVyAQAAAAxnZXRSUERQcm9maXQAAAABAAAABWNvdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAPZ2V0UlBEUHJvZml0S2V5AAAAAQUAAAAFY291bnQAAAAGAAAAAWkBAAAAE3N3YXBXYXZlc1RvTmV1dHJpbm8AAAAABAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAEm1pbldhdmVzU3dhcEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAQFRoZSBzcGVjaWZpZWQgV2F2ZXMgYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgbWluaW11bSBvZiAJAAGkAAAAAQUAAAASbWluV2F2ZXNTd2FwQW1vdW50AgAAAAogd2F2ZWxldHMuAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAAClPbmx5IFdhdmVzIHRva2VuIGlzIGFsbG93ZWQgZm9yIHN3YXBwaW5nLgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFpjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmF3YWl0IAkAAaQAAAABCQAAZQAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQCAAAAByBibG9ja3MDAwkBAAAAAiE9AAAAAgkBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAGCQEAAAACIT0AAAACCQEAAAAVZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAACJwbGVhc2Ugd2l0aGRyYXcgbG9ja2VkIGZ1bmRzIGZpcnN0CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAAYYmFsYW5jZVdhdmVzTG9ja0ludGVydmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAABkAAAAAgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCAUAAAADcG10AAAABmFtb3VudAUAAAADbmlsAAAAAWkBAAAAE3N3YXBOZXV0cmlub1RvV2F2ZXMAAAAABAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAQ1RoZSBzcGVjaWZpZWQgTmV1dHJpbm8gYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgbWluaW11bSBvZiAJAAGkAAAAAQUAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50AgAAABAgTmV1dHJpbm8gY2VudHMuAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAYVRoZSBjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTi4gUGxlYXNlIHdhaXQgZm9yIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcy4DCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAADpPbmx5IGFwcHJvcHJpYXRlIE5ldXRyaW5vIHRva2VucyBhcmUgYWxsb3dlZCBmb3Igc3dhcHBpbmcuAwkAAGYAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZhd2FpdCAJAAGkAAAAAQkAAGUAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0AgAAAAcgYmxvY2tzAwMJAQAAAAIhPQAAAAIJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAABgkBAAAAAiE9AAAAAgkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAicGxlYXNlIHdpdGhkcmF3IGxvY2tlZCBmdW5kcyBmaXJzdAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAHYWNjb3VudAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAG2JhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgFAAAAA3BtdAAAAAZhbW91bnQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAHYWNjb3VudAAAAAVpbmRleAQAAAAMdW5sb2NrSGVpZ2h0CQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAQAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQEAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50BAAAAAtpbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEFAAAABWluZGV4BAAAAA9wcmV2SW5kZXhIZWlnaHQJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABCQAAZQAAAAIFAAAABWluZGV4AAAAAAAAAAABBAAAAAxwcmljZUJ5SW5kZXgJAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABBQAAAAtpbmRleEhlaWdodAQAAAAObmV1dHJpbm9BbW91bnQJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQUAAAAMcHJpY2VCeUluZGV4BAAAAAt3YXZlc0Ftb3VudAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAABl1c2VyTmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAAAxwcmljZUJ5SW5kZXgDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAARcGxlYXNlIHdhaXQgZm9yOiAJAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAACUgYmxvY2sgaGVpZ2h0IHRvIHdpdGhkcmF3IFdBVkVTIGZ1bmRzAwMDCQAAZgAAAAIFAAAABWluZGV4BQAAAApwcmljZUluZGV4BgkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAAC2luZGV4SGVpZ2h0BgMJAQAAAAIhPQAAAAIFAAAAD3ByZXZJbmRleEhlaWdodAAAAAAAAAAAAAkAAGcAAAACBQAAAA9wcmV2SW5kZXhIZWlnaHQFAAAADHVubG9ja0hlaWdodAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAjaW52YWxpZCBwcmljZSBoaXN0b3J5IGluZGV4OiBpbmRleD0JAAGkAAAAAQUAAAAFaW5kZXgCAAAADCBwcmljZUluZGV4PQkAAaQAAAABBQAAAApwcmljZUluZGV4AgAAAA0gaW5kZXhIZWlnaHQ9CQABpAAAAAEFAAAAC2luZGV4SGVpZ2h0AgAAAA4gdW5sb2NrSGVpZ2h0PQkAAaQAAAABBQAAAAx1bmxvY2tIZWlnaHQCAAAAESBwcmV2SW5kZXhIZWlnaHQ9CQABpAAAAAEFAAAAD3ByZXZJbmRleEhlaWdodAMDCQAAZwAAAAIAAAAAAAAAAAAFAAAADm5ldXRyaW5vQW1vdW50CQAAZwAAAAIAAAAAAAAAAAAFAAAAC3dhdmVzQW1vdW50BwkAAAIAAAABAgAAABNiYWxhbmNlIGVxdWFscyB6ZXJvCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGGdldFdhdmVzTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAABlAAAAAgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlBQAAABZ1c2VyV2F2ZXNMb2NrZWRCYWxhbmNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkJAABlAAAAAgUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAABl1c2VyTmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhY2NvdW50BQAAAAt3YXZlc0Ftb3VudAUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQFAAAADm5ldXRyaW5vQW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAABF0cmFuc2ZlclRvQXVjdGlvbgAAAAAEAAAAEWRlZmljaXRCb25kQW1vdW50CQAAZQAAAAIFAAAAB2RlZmljaXQJAAPrAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAC2JvbmRBc3NldElkBAAAAAptaW5EZWZpY2l0CQAAawAAAAMFAAAADm5ldXRyaW5vU3VwcGx5BQAAAA1ERUZJQ0lUT0ZGU0VUAAAAAAAAAABkBAAAABZzdXJwbHVzV2l0aExpcXVpZGF0aW9uCQAAZQAAAAIFAAAAB3N1cnBsdXMJAAPrAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwMJAABmAAAAAgUAAAARZGVmaWNpdEJvbmRBbW91bnQFAAAACm1pbkRlZmljaXQJAABmAAAAAgUAAAARZGVmaWNpdEJvbmRBbW91bnQAAAAAAAAAAAAHCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAPYXVjdGlvbkNvbnRyYWN0BQAAABFkZWZpY2l0Qm9uZEFtb3VudAUAAAALYm9uZEFzc2V0SWQFAAAAA25pbAMJAABnAAAAAgUAAAAWc3VycGx1c1dpdGhMaXF1aWRhdGlvbgkAAGgAAAACAAAAAAAAAAABBQAAAAVQQVVMSQkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QFAAAAFnN1cnBsdXNXaXRoTGlxdWlkYXRpb24FAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAvYm9uZCB3ZXJlIGdlbmVyYXRlZCBvciBkbyBub3QgbmVlZCBpdC4gRGVmaWNpdDoJAAGkAAAAAQUAAAARZGVmaWNpdEJvbmRBbW91bnQCAAAAAXwJAAGkAAAAAQUAAAAKbWluRGVmaWNpdAIAAAAKLiBTdXJwbHVzOgkAAaQAAAABBQAAABZzdXJwbHVzV2l0aExpcXVpZGF0aW9uAgAAAAF8CQABpAAAAAEFAAAAB3N1cnBsdXMAAAABaQEAAAAIdHJhbnNmZXIAAAABAAAAB2FjY291bnQEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50CQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWNjb3VudAgFAAAAA3BtdAAAAAZhbW91bnQIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAADbmlsAAAAAWkBAAAAF21pZ3JhdGlvblVTRE5CMk5TQlRTd2FwAAAAAAQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQEAAAAB2FjY291bnQIBQAAAAFpAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAAFWRlcHJlY2F0ZWRCb25kQXNzZXRJZAgFAAAAA3BtdAAAAAdhc3NldElkCQAAAgAAAAECAAAAJ2Vycm9yOiBhdHRlbXB0IHRvIHN3YXAgbm90IFVTRE5CIHRva2VucwkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdhY2NvdW50CQAAaAAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAVQQVVMSQUAAAALYm9uZEFzc2V0SWQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAAmlkCQACWAAAAAEIBQAAAAJ0eAAAAAJpZAQAAAAHJG1hdGNoMAUAAAACdHgDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABZMZWFzZUNhbmNlbFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABBMZWFzZVRyYW5zYWN0aW9uBAAAAAlsZWFzaW5nVHgFAAAAByRtYXRjaDAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAABhub2RlT3JhY2xlUHJvdmlkZXJQdWJLZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFVNwb25zb3JGZWVUcmFuc2FjdGlvbgQAAAAJc3BvbnNvclR4BQAAAAckbWF0Y2gwCQEAAAAbY2hlY2tJc1ZhbGlkTWluU3BvbnNvcmVkRmVlAAAAAQUAAAAJc3BvbnNvclR4Bq7UXUo=", "chainId": 84, "height": 927921, "spentComplexity": 0 } View: original | compacted Prev: GfCJSsZRRGw1BWZS81wAWRJuLsas5Hak43NzebKzXwsH Next: 9YnL9kgdro8bUWoqvhukvCMwxMAPzPZUcWMwKXAPN8c6 Diff:
OldNewDifferences
210210 func checkIsValidMinSponsoredFee (tx) = {
211211 let cp = 90
212212 let realNeutrinoFee = convertWavesToNeutrino(MINTRANSFERFEE, cp)
213- let mediumPercent = (SponsoredFeeLowerBound + fraction((SponsoredFeeUpperBound - SponsoredFeeLowerBound), 1, 2))
214- let exactFee = (realNeutrinoFee + fraction(realNeutrinoFee, mediumPercent, 100))
213+ let multiplier = 10
214+ let mediumPercent = (fraction(SponsoredFeeLowerBound, multiplier, 1) + fraction((SponsoredFeeUpperBound - SponsoredFeeLowerBound), multiplier, 2))
215+ let exactFee = (realNeutrinoFee + fraction(realNeutrinoFee, mediumPercent, fraction(100, multiplier, 1)))
215216 let correct = toString(getNumberFromOptional(tx.minSponsoredAssetFee))
216217 let exact = toString(exactFee)
217218 throw(((((((("Correct fee: " + correct) + "; Exact: ") + exact) + "; Real USDN fee: ") + toString(realNeutrinoFee)) + "; Medium percent: ") + toString(mediumPercent)))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = match getInteger(this, key) {
55 case a: Int =>
66 a
77 case _ =>
88 0
99 }
1010
1111
1212 func getStringByKey (key) = match getString(this, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getBoolByKey (key) = match getBoolean(this, key) {
2121 case a: Boolean =>
2222 a
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 func getStringByAddressAndKey (address,key) = match getString(addressFromStringValue(address), key) {
3737 case a: String =>
3838 a
3939 case _ =>
4040 ""
4141 }
4242
4343
4444 func getBoolByAddressAndKey (address,key) = match getBoolean(addressFromStringValue(address), key) {
4545 case a: Boolean =>
4646 a
4747 case _ =>
4848 false
4949 }
5050
5151
5252 func getNumberFromOptional (value) = match value {
5353 case a: Int =>
5454 a
5555 case _ =>
5656 0
5757 }
5858
5959
6060 let SENDTXEXPIRE = 30
6161
6262 let LISTSPLITSYMBOL = "_"
6363
6464 let LISTDATASYMBOL = "+"
6565
6666 let WAVELET = 100000000
6767
6868 let PAULI = 1000000
6969
7070 let DEFICITOFFSET = 5
7171
7272 let NeutrinoAssetIdKey = "neutrino_asset_id"
7373
7474 let BondAssetIdKey = "bond_asset_id"
7575
7676 let AuctionContractKey = "auction_contract"
7777
7878 let LiquidationContractKey = "liquidation_contract"
7979
8080 let RPDContractKey = "rpd_contract"
8181
8282 let ContolContractKey = "control_contract"
8383
8484 let BalanceWavesLockIntervalKey = "balance_waves_lock_interval"
8585
8686 let BalanceNeutrinoLockIntervalKey = "balance_neutrino_lock_interval"
8787
8888 let MinWavesSwapAmountKey = "min_waves_swap_amount"
8989
9090 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9191
9292 let NodeOracleProviderPubKeyKey = "node_oracle_provider"
9393
9494 let SponsoredFeeLowerBound = 50
9595
9696 let SponsoredFeeUpperBound = 100
9797
9898 let MINTRANSFERFEE = 100000
9999
100100 let currentConfigId = "current_config_id"
101101
102102 func getFeePriceKey (id) = ("price_fee_" + id)
103103
104104
105105 func getMinFeeKey (id) = ("minfee_fee_" + id)
106106
107107
108108 func getConfigStatusKey (id) = ("fee_config_status_" + id)
109109
110110
111111 let RPDBalanceKey = "rpd_balance"
112112
113113 func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
114114
115115
116116 let PriceKey = "price"
117117
118118 let PriceIndexKey = "price_index"
119119
120120 let IsBlockedKey = "is_blocked"
121121
122122 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
123123
124124
125125 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
126126
127127
128128 let BalanceLockedkKey = "balance_lock_"
129129
130130 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
131131
132132 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
133133
134134 func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
135135
136136
137137 func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
138138
139139
140140 func getWavesLockedBalanceKey (owner) = ((WavesLockedBalanceKey + "_") + owner)
141141
142142
143143 func getNeutrinoLockedBalanceKey (owner) = ((NeutrinoLockedBalanceKey + "_") + owner)
144144
145145
146146 func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
147147
148148
149149 func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
150150
151151
152152 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
153153
154154
155155 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
156156
157157
158158 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
159159
160160
161161 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
162162
163163
164164 let liquidationContract = getStringByKey(LiquidationContractKey)
165165
166166 let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
167167
168168 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
169169
170170 let auctionContract = getStringByKey(AuctionContractKey)
171171
172172 let rpdContract = getStringByKey(RPDContractKey)
173173
174174 let controlContract = getStringByKey(ContolContractKey)
175175
176176 let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
177177
178178 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
179179
180180 let nodeOracleProviderPubKey = fromBase58String(getStringByKey(NodeOracleProviderPubKeyKey))
181181
182182 let balanceWavesLockInterval = getNumberByKey(BalanceWavesLockIntervalKey)
183183
184184 let balanceNeutrinoLockInterval = getNumberByKey(BalanceNeutrinoLockIntervalKey)
185185
186186 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
187187
188188 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
189189
190190 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
191191
192192 let deprecatedBondAssetId = fromBase58String("975akZBfnMj513U7MZaHKzQrmsEx5aE3wdWKTrHBhbjF")
193193
194194 let neutrinoContract = this
195195
196196 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
197197
198198 let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
199199
200200 let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
201201
202202 let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
203203
204204 let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
205205
206206 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
207207
208208 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
209209
210210 func checkIsValidMinSponsoredFee (tx) = {
211211 let cp = 90
212212 let realNeutrinoFee = convertWavesToNeutrino(MINTRANSFERFEE, cp)
213- let mediumPercent = (SponsoredFeeLowerBound + fraction((SponsoredFeeUpperBound - SponsoredFeeLowerBound), 1, 2))
214- let exactFee = (realNeutrinoFee + fraction(realNeutrinoFee, mediumPercent, 100))
213+ let multiplier = 10
214+ let mediumPercent = (fraction(SponsoredFeeLowerBound, multiplier, 1) + fraction((SponsoredFeeUpperBound - SponsoredFeeLowerBound), multiplier, 2))
215+ let exactFee = (realNeutrinoFee + fraction(realNeutrinoFee, mediumPercent, fraction(100, multiplier, 1)))
215216 let correct = toString(getNumberFromOptional(tx.minSponsoredAssetFee))
216217 let exact = toString(exactFee)
217218 throw(((((((("Correct fee: " + correct) + "; Exact: ") + exact) + "; Real USDN fee: ") + toString(realNeutrinoFee)) + "; Medium percent: ") + toString(mediumPercent)))
218219 }
219220
220221
221222 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
222223
223224
224225 func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
225226
226227
227228 func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
228229
229230
230231 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
231232
232233
233234 func getWavesLockedBalance (owner) = getNumberByKey(getWavesLockedBalanceKey(owner))
234235
235236
236237 func getNeutrinoLockedBalance (owner) = getNumberByKey(getNeutrinoLockedBalanceKey(owner))
237238
238239
239240 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
240241
241242
242243 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
243244
244245
245246 @Callable(i)
246247 func swapWavesToNeutrino () = {
247248 let pmt = extract(i.payment)
248249 let account = toString(i.caller)
249250 if ((minWavesSwapAmount > pmt.amount))
250251 then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
251252 else if (isDefined(pmt.assetId))
252253 then throw("Only Waves token is allowed for swapping.")
253254 else if (isBlocked)
254255 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
255256 else if ((getUnlockBalanceBlock(account) > height))
256257 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
257258 else if (if ((getNeutrinoLockedBalance(account) != 0))
258259 then true
259260 else (getWavesLockedBalance(account) != 0))
260261 then throw("please withdraw locked funds first")
261262 else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceWavesLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
262263 }
263264
264265
265266
266267 @Callable(i)
267268 func swapNeutrinoToWaves () = {
268269 let pmt = extract(i.payment)
269270 let account = toString(i.caller)
270271 if ((minNeutrinoSwapAmount > pmt.amount))
271272 then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
272273 else if (isBlocked)
273274 then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
274275 else if ((pmt.assetId != neutrinoAssetId))
275276 then throw("Only appropriate Neutrino tokens are allowed for swapping.")
276277 else if ((getUnlockBalanceBlock(account) > height))
277278 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
278279 else if (if ((getNeutrinoLockedBalance(account) != 0))
279280 then true
280281 else (getWavesLockedBalance(account) != 0))
281282 then throw("please withdraw locked funds first")
282283 else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceNeutrinoLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
283284 }
284285
285286
286287
287288 @Callable(i)
288289 func withdraw (account,index) = {
289290 let unlockHeight = getUnlockBalanceBlock(account)
290291 let userWavesLockedBalance = getWavesLockedBalance(account)
291292 let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
292293 let indexHeight = getHeightPriceByIndex(index)
293294 let prevIndexHeight = getHeightPriceByIndex((index - 1))
294295 let priceByIndex = getPriceHistory(indexHeight)
295296 let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
296297 let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
297298 if (isBlocked)
298299 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
299300 else if ((unlockHeight > height))
300301 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
301302 else if (if (if ((index > priceIndex))
302303 then true
303304 else (unlockHeight > indexHeight))
304305 then true
305306 else if ((prevIndexHeight != 0))
306307 then (prevIndexHeight >= unlockHeight)
307308 else false)
308309 then throw(((((((((("invalid price history index: index=" + toString(index)) + " priceIndex=") + toString(priceIndex)) + " indexHeight=") + toString(indexHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIndexHeight=") + toString(prevIndexHeight)))
309310 else if (if ((0 >= neutrinoAmount))
310311 then (0 >= wavesAmount)
311312 else false)
312313 then throw("balance equals zero")
313314 else ScriptResult(WriteSet([DataEntry(getWavesLockedBalanceKey(account), 0), DataEntry(getNeutrinoLockedBalanceKey(account), 0), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance))]), TransferSet([ScriptTransfer(addressFromStringValue(account), wavesAmount, unit), ScriptTransfer(addressFromStringValue(account), neutrinoAmount, neutrinoAssetId)]))
314315 }
315316
316317
317318
318319 @Callable(i)
319320 func transferToAuction () = {
320321 let deficitBondAmount = (deficit - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
321322 let minDeficit = fraction(neutrinoSupply, DEFICITOFFSET, 100)
322323 let surplusWithLiquidation = (surplus - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
323324 if (isBlocked)
324325 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
325326 else if (if ((deficitBondAmount > minDeficit))
326327 then (deficitBondAmount > 0)
327328 else false)
328329 then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
329330 else if ((surplusWithLiquidation >= (1 * PAULI)))
330331 then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), surplusWithLiquidation, neutrinoAssetId)])
331332 else throw(((((((("bond were generated or do not need it. Deficit:" + toString(deficitBondAmount)) + "|") + toString(minDeficit)) + ". Surplus:") + toString(surplusWithLiquidation)) + "|") + toString(surplus)))
332333 }
333334
334335
335336
336337 @Callable(i)
337338 func transfer (account) = {
338339 let pmt = extract(i.payment)
339340 TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)])
340341 }
341342
342343
343344
344345 @Callable(i)
345346 func migrationUSDNB2NSBTSwap () = {
346347 let pmt = extract(i.payment)
347348 let account = i.caller
348349 if ((deprecatedBondAssetId != pmt.assetId))
349350 then throw("error: attempt to swap not USDNB tokens")
350351 else TransferSet([ScriptTransfer(account, (pmt.amount * PAULI), bondAssetId)])
351352 }
352353
353354
354355 @Verifier(tx)
355356 func verify () = {
356357 let id = toBase58String(tx.id)
357358 match tx {
358359 case leasingTx: LeaseCancelTransaction|LeaseTransaction =>
359360 sigVerify(tx.bodyBytes, tx.proofs[0], nodeOracleProviderPubKey)
360361 case sponsorTx: SponsorFeeTransaction =>
361362 checkIsValidMinSponsoredFee(sponsorTx)
362363 case _ =>
363364 true
364365 }
365366 }
366367

github/deemru/w8io/3ef1775 
75.05 ms