tx · 4TrBmd5tZyny5ywkKMbKzoqf8buadp49FeEJTKmsgE4h

3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo:  -0.01400000 Waves

2019.11.22 20:19 [1807052] smart account 3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo > SELF 0.00000000 Waves

{ "type": 13, "id": "4TrBmd5tZyny5ywkKMbKzoqf8buadp49FeEJTKmsgE4h", "fee": 1400000, "feeAssetId": null, "timestamp": 1574443192029, "version": 1, "sender": "3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo", "senderPublicKey": "BRnVwSVctnV8pge5vRpsJdWnkjWEJspFb6QvrmZvu3Ht", "proofs": [ "2J5QzybJzN6tq47XTeQevcKMpyd1XUqGhMVrgdEGPYU3G1K7oLD7qhVepmi7BULCmKNtrZd9dWNbD76YWzw6M5Ga" ], "script": "base64:AAIDAAAAAAAAABMIARIAEgASBAoCCAESABIDCgEIAAAASgEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAxnZXRCb29sQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEHAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcAAAAADFNFTkRUWEVYUElSRQAAAAAAAAAAHgAAAAAPTElTVFNQTElUU1lNQk9MAgAAAAFfAAAAAA5MSVNUREFUQVNZTUJPTAIAAAABKwAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAPQkAAAAAADURFRklDSVRPRkZTRVQAAAAAAAAAAAoAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJBdWN0aW9uQ29udHJhY3RLZXkCAAAAEGF1Y3Rpb25fY29udHJhY3QAAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkCAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AAAAAA5SUERDb250cmFjdEtleQIAAAAMcnBkX2NvbnRyYWN0AAAAABFDb250b2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAAbQmFsYW5jZVdhdmVzTG9ja0ludGVydmFsS2V5AgAAABtiYWxhbmNlX3dhdmVzX2xvY2tfaW50ZXJ2YWwAAAAAHkJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbEtleQIAAAAeYmFsYW5jZV9uZXV0cmlub19sb2NrX2ludGVydmFsAAAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkCAAAAFW1pbl93YXZlc19zd2FwX2Ftb3VudAAAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5AgAAABhtaW5fbmV1dHJpbm9fc3dhcF9hbW91bnQAAAAAFU5vZGVPcmFjbGVQcm92aWRlcktleQIAAAAUbm9kZV9vcmFjbGVfcHJvdmlkZXIAAAAADVJQREJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAQAAABhnZXRSUERDb250cmFjdEJhbGFuY2VLZXkAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAA1SUERCYWxhbmNlS2V5AgAAAAFfCQACWAAAAAEFAAAAB2Fzc2V0SWQAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAANUHJpY2VJbmRleEtleQIAAAALcHJpY2VfaW5kZXgAAAAADElzQmxvY2tlZEtleQIAAAAKaXNfYmxvY2tlZAEAAAASZ2V0UHJpY2VIaXN0b3J5S2V5AAAAAQAAAAVibG9jawkAASwAAAACCQABLAAAAAIFAAAACFByaWNlS2V5AgAAAAFfCQABpAAAAAEFAAAABWJsb2NrAQAAABhnZXRIZWlnaHRQcmljZUJ5SW5kZXhLZXkAAAABAAAABWluZGV4CQABLAAAAAIJAAEsAAAAAgUAAAANUHJpY2VJbmRleEtleQIAAAABXwkAAaQAAAABBQAAAAVpbmRleAAAAAAQQmFsYW5jZUxvY2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEEJhbGFuY2VMb2NlZGtLZXkCAAAABXdhdmVzAAAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkJAAEsAAAAAgUAAAAQQmFsYW5jZUxvY2Vka0tleQIAAAAIbmV1dHJpbm8BAAAAIGdldFJQRFNuYXBzaG90Q29udHJhY3RCYWxhbmNlS2V5AAAAAgAAAAVjb3VudAAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADVJQREJhbGFuY2VLZXkCAAAAAV8JAAJYAAAAAQUAAAAHYXNzZXRJZAIAAAABXwkAAaQAAAABBQAAAAVjb3VudAEAAAAdZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWVLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAABtjYW5jZWxfbGVhc2VfdHhfcmVzZXJ2ZV9mZWUCAAAAAV8FAAAABGhhc2gBAAAAGGdldFdhdmVzTG9ja2VkQmFsYW5jZUtleQAAAAEAAAAFb3duZXIJAAEsAAAAAgkAASwAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkCAAAAAV8FAAAABW93bmVyAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABAAAABW93bmVyCQABLAAAAAIJAAEsAAAAAgUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AgAAAAFfBQAAAAVvd25lcgEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQAAAAVvd25lcgkAASwAAAACAgAAABViYWxhbmNlX3VubG9ja19ibG9ja18FAAAABW93bmVyAQAAAA9nZXRSUERQcm9maXRLZXkAAAABAAAABWNvdW50CQABLAAAAAIJAAEsAAAAAgIAAAAKcnBkX3Byb2ZpdAIAAAABXwkAAaQAAAABBQAAAAVjb3VudAEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAaQAAAAIJAABoAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAABmFtb3VudAAAAAAAAAAAZAUAAAAFcHJpY2UFAAAAB1dBVkVMRVQFAAAABVBBVUxJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABpAAAAAgkAAGgAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEAAAAGYW1vdW50CQAAaQAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEAAAAGYW1vdW50CQAAaAAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkAAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQUAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEkF1Y3Rpb25Db250cmFjdEtleQAAAAALcnBkQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADlJQRENvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEUNvbnRvbENvbnRyYWN0S2V5AAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAAApwcmljZUluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAA1QcmljZUluZGV4S2V5AAAAAAlpc0Jsb2NrZWQJAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAxJc0Jsb2NrZWRLZXkAAAAAEm5vZGVPcmFjbGVQcm92aWRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAVTm9kZU9yYWNsZVByb3ZpZGVyS2V5AAAAABhiYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAG0JhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbEtleQAAAAAbYmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAAB5CYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWxLZXkAAAAAEm1pbldhdmVzU3dhcEFtb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAVTWluV2F2ZXNTd2FwQW1vdW50S2V5AAAAABVtaW5OZXV0cmlub1N3YXBBbW91bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAGE1pbk5ldXRyaW5vU3dhcEFtb3VudEtleQAAAAAHcmVzZXJ2ZQkAAGUAAAACCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAtib25kQXNzZXRJZAkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA5Cb25kQXNzZXRJZEtleQAAAAAKYm9uZFN1cHBseQkAAGUAAAACCAkBAAAAB2V4dHJhY3QAAAABCQAD7AAAAAEFAAAAC2JvbmRBc3NldElkAAAACHF1YW50aXR5CQAD6wAAAAIFAAAABHRoaXMFAAAAC2JvbmRBc3NldElkAAAAAA5uZXV0cmlub1N1cHBseQkAAGQAAAACCQAAZQAAAAIICQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD6wAAAAIFAAAABHRoaXMFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAdzdXJwbHVzCQAAZQAAAAIJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlBQAAAA5uZXV0cmlub1N1cHBseQAAAAAHZGVmaWNpdAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UBAAAAFWdldFJQRENvbnRyYWN0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAC3JwZENvbnRyYWN0CQEAAAAYZ2V0UlBEQ29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAPZ2V0UHJpY2VIaXN0b3J5AAAAAQAAAAVibG9jawkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEmdldFByaWNlSGlzdG9yeUtleQAAAAEFAAAABWJsb2NrAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABAAAABWluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAAYZ2V0SGVpZ2h0UHJpY2VCeUluZGV4S2V5AAAAAQUAAAAFaW5kZXgBAAAAGmdldENhbmNlbExlYXNlVHhSZXNlcnZlRmVlAAAAAQAAAARoYXNoCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAdZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWVLZXkAAAABBQAAAARoYXNoAQAAABVnZXRXYXZlc0xvY2tlZEJhbGFuY2UAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAFb3duZXIBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEAAAAFb3duZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAVvd25lcgEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQAAAAVvd25lcgkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldEJhbGFuY2VVbmxvY2tCbG9ja0tleQAAAAEFAAAABW93bmVyAQAAAAxnZXRSUERQcm9maXQAAAABAAAABWNvdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAPZ2V0UlBEUHJvZml0S2V5AAAAAQUAAAAFY291bnQAAAAFAAAAAWkBAAAAE3N3YXBXYXZlc1RvTmV1dHJpbm8AAAAABAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAEm1pbldhdmVzU3dhcEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAQFRoZSBzcGVjaWZpZWQgV2F2ZXMgYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgbWluaW11bSBvZiAJAAGkAAAAAQUAAAASbWluV2F2ZXNTd2FwQW1vdW50AgAAAAogd2F2ZWxldHMuAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAAClPbmx5IFdhdmVzIHRva2VuIGlzIGFsbG93ZWQgZm9yIHN3YXBwaW5nLgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFpjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmF3YWl0IAkAAaQAAAABCQAAZQAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQCAAAAByBibG9ja3MDAwkBAAAAAiE9AAAAAgkBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAGCQEAAAACIT0AAAACCQEAAAAVZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAACJwbGVhc2Ugd2l0aGRyYXcgbG9ja2VkIGZ1bmRzIGZpcnN0CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAAYYmFsYW5jZVdhdmVzTG9ja0ludGVydmFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAABkAAAAAgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCAUAAAADcG10AAAABmFtb3VudAUAAAADbmlsAAAAAWkBAAAAE3N3YXBOZXV0cmlub1RvV2F2ZXMAAAAABAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAQ1RoZSBzcGVjaWZpZWQgTmV1dHJpbm8gYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgbWluaW11bSBvZiAJAAGkAAAAAQUAAAAVbWluTmV1dHJpbm9Td2FwQW1vdW50AgAAABAgTmV1dHJpbm8gY2VudHMuAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAYVRoZSBjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTi4gUGxlYXNlIHdhaXQgZm9yIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcy4DCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAADpPbmx5IGFwcHJvcHJpYXRlIE5ldXRyaW5vIHRva2VucyBhcmUgYWxsb3dlZCBmb3Igc3dhcHBpbmcuAwkAAGYAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZhd2FpdCAJAAGkAAAAAQkAAGUAAAACCQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0AgAAAAcgYmxvY2tzAwMJAQAAAAIhPQAAAAIJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAABgkBAAAAAiE9AAAAAgkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAicGxlYXNlIHdpdGhkcmF3IGxvY2tlZCBmdW5kcyBmaXJzdAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAHYWNjb3VudAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAG2JhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgFAAAAA3BtdAAAAAZhbW91bnQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAHYWNjb3VudAAAAAVpbmRleAQAAAAMdW5sb2NrSGVpZ2h0CQEAAAAVZ2V0VW5sb2NrQmFsYW5jZUJsb2NrAAAAAQUAAAAHYWNjb3VudAQAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQkBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQEAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAABhnZXROZXV0cmlub0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50BAAAAAtpbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEFAAAABWluZGV4BAAAAA9wcmV2SW5kZXhIZWlnaHQJAQAAABVnZXRIZWlnaHRQcmljZUJ5SW5kZXgAAAABCQAAZQAAAAIFAAAABWluZGV4AAAAAAAAAAABBAAAAAxwcmljZUJ5SW5kZXgJAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABBQAAAAtpbmRleEhlaWdodAQAAAAObmV1dHJpbm9BbW91bnQJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAWdXNlcldhdmVzTG9ja2VkQmFsYW5jZQUAAAAMcHJpY2VCeUluZGV4BAAAAAt3YXZlc0Ftb3VudAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAABl1c2VyTmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAAAxwcmljZUJ5SW5kZXgDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAARcGxlYXNlIHdhaXQgZm9yOiAJAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAACUgYmxvY2sgaGVpZ2h0IHRvIHdpdGhkcmF3IFdBVkVTIGZ1bmRzAwMDCQAAZgAAAAIFAAAABWluZGV4BQAAAApwcmljZUluZGV4BgkAAGYAAAACBQAAAAx1bmxvY2tIZWlnaHQFAAAAC2luZGV4SGVpZ2h0BgMJAQAAAAIhPQAAAAIFAAAAD3ByZXZJbmRleEhlaWdodAAAAAAAAAAAAAkAAGcAAAACBQAAAA9wcmV2SW5kZXhIZWlnaHQFAAAADHVubG9ja0hlaWdodAcJAAACAAAAAQIAAAAbaW52YWxpZCBwcmljZSBoaXN0b3J5IGluZGV4AwMJAABnAAAAAgAAAAAAAAAAAAUAAAAObmV1dHJpbm9BbW91bnQJAABnAAAAAgAAAAAAAAAAAAUAAAALd2F2ZXNBbW91bnQHCQAAAgAAAAECAAAAE2JhbGFuY2UgZXF1YWxzIHplcm8JAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UFAAAAFnVzZXJXYXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UFAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQFAAAAC3dhdmVzQW1vdW50BQAAAAR1bml0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWNjb3VudAUAAAAObmV1dHJpbm9BbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAAEXRyYW5zZmVyVG9BdWN0aW9uAAAAAAQAAAARZGVmaWNpdEJvbmRBbW91bnQJAABlAAAAAgkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEFAAAAB2RlZmljaXQJAAPrAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAC2JvbmRBc3NldElkBAAAAAtzdXJwbHVzQm9uZAkAAGUAAAACCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQUAAAAHc3VycGx1cwkAA+sAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAD2F1Y3Rpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMDCQAAZwAAAAIFAAAAEWRlZmljaXRCb25kQW1vdW50CQAAaQAAAAIJAABoAAAAAgkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEFAAAADm5ldXRyaW5vU3VwcGx5BQAAAA1ERUZJQ0lUT0ZGU0VUAAAAAAAAAABkCQAAZgAAAAIFAAAAEWRlZmljaXRCb25kQW1vdW50AAAAAAAAAAAABwkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAD2F1Y3Rpb25Db250cmFjdAUAAAARZGVmaWNpdEJvbmRBbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwDCQAAZgAAAAIFAAAAC3N1cnBsdXNCb25kAAAAAAAAAAAACQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAATbGlxdWlkYXRpb25Db250cmFjdAkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEFAAAAC3N1cnBsdXNCb25kBQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAvYm9uZCB3ZXJlIGdlbmVyYXRlZCBvciBkbyBub3QgbmVlZCBpdC4gRGVmaWNpdDoJAAGkAAAAAQUAAAARZGVmaWNpdEJvbmRBbW91bnQCAAAAAXwJAAGkAAAAAQkAAGkAAAACCQAAaAAAAAIFAAAADm5ldXRyaW5vU3VwcGx5BQAAAA1ERUZJQ0lUT0ZGU0VUAAAAAAAAAABkAgAAAAouIFN1cnBsdXM6CQABpAAAAAEFAAAAC3N1cnBsdXNCb25kAAAAAWkBAAAACHRyYW5zZmVyAAAAAQAAAAdhY2NvdW50BAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQIBQAAAANwbXQAAAAGYW1vdW50CAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAAmlkCQACWAAAAAEIBQAAAAJ0eAAAAAJpZAQAAAAHJG1hdGNoMAUAAAACdHgDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABZMZWFzZUNhbmNlbFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABBMZWFzZVRyYW5zYWN0aW9uBAAAAAlsZWFzaW5nVHgFAAAAByRtYXRjaDADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQkAAAAAAAACCQEAAAARYWRkcmVzc0Zyb21TdHJpbmcAAAABBQAAABJub2RlT3JhY2xlUHJvdmlkZXIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkHCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleXpnN6I=", "chainId": 87, "height": 1807052, "spentComplexity": 0 } View: original | compacted Prev: 8mD5fFf3sZ58QNXZXKatW8bBoBjHcjt9aZLQHGueMK8z Next: 4jfLk7cbm1N1Lo6q9WPr6k7B96JuGSHDsCk9vKFUaTkk Diff:
OldNewDifferences
5757
5858 let WAVELET = 100000000
5959
60-let PAULI = 100
61-
62-let CRYTICALSHARE = 20
63-
64-let LEASINGSHARE = 90
65-
66-let LEASINTXCOUNT = 10
60+let PAULI = 1000000
6761
6862 let DEFICITOFFSET = 10
69-
70-let WAVESASSETID = "waves"
71-
72-let CANCELED = "canceled"
73-
74-let NEW = "new"
7563
7664 let NeutrinoAssetIdKey = "neutrino_asset_id"
7765
7866 let BondAssetIdKey = "bond_asset_id"
79-
80-let ReserveContractKey = "reserve_contract"
8167
8268 let AuctionContractKey = "auction_contract"
8369
8773
8874 let ContolContractKey = "control_contract"
8975
90-let BalanceLockIntervalKey = "balance_lock_interval"
76+let BalanceWavesLockIntervalKey = "balance_waves_lock_interval"
77+
78+let BalanceNeutrinoLockIntervalKey = "balance_neutrino_lock_interval"
9179
9280 let MinWavesSwapAmountKey = "min_waves_swap_amount"
9381
9482 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9583
96-let NodeAddressKey = "node_address"
97-
98-let NodeOracleProviderKey = "oracle_node_provider"
99-
100-let LeasingIntervalKey = "leasing_interval"
84+let NodeOracleProviderKey = "node_oracle_provider"
10185
10286 let RPDBalanceKey = "rpd_balance"
10387
11094
11195 let IsBlockedKey = "is_blocked"
11296
113-let LeasingExpireBlockKey = "leasing_expire_block"
114-
115-let LeasingTxCountKey = "leasing_index"
116-
117-let LeasingAmountKey = "leasing_amount"
118-
11997 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
12098
12199
122100 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
123101
124-
125-let RPDSyncIndexKey = "rpd_sync_index"
126102
127103 let BalanceLocedkKey = "balance_lock_"
128104
146122
147123
148124 func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
149-
150-
151-func getLeaseTxStatusKey (hash) = (("lease_tx_status" + "_") + hash)
152-
153-
154-func getLeaseTxAmountByHashKey (hash) = ((LeasingAmountKey + "_") + hash)
155-
156-
157-func getLeaseTxBytesByHashKey (hash) = (("lease_tx" + "_") + hash)
158-
159-
160-func getLeaseTxExpireSendBlockKey (hash) = (("leasing_expire_send" + "_") + hash)
161125
162126
163127 func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
185149
186150 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
187151
188-let reserveContract = getStringByKey(ReserveContractKey)
189-
190152 let auctionContract = getStringByKey(AuctionContractKey)
191153
192154 let rpdContract = getStringByKey(RPDContractKey)
199161
200162 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
201163
202-let leasingTxCount = getNumberByKey(LeasingTxCountKey)
203-
204-let leasingInterval = getNumberByKey(LeasingIntervalKey)
205-
206-let leasingExpireBlock = getNumberByKey(LeasingExpireBlockKey)
207-
208-let leasingAmount = getNumberByKey(LeasingAmountKey)
209-
210-let nodeAddress = getStringByKey(NodeAddressKey)
211-
212164 let nodeOracleProvider = getStringByKey(NodeOracleProviderKey)
213165
214-let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
166+let balanceWavesLockInterval = getNumberByKey(BalanceWavesLockIntervalKey)
215167
216-let balanceLockInterval = getNumberByKey(BalanceLockIntervalKey)
168+let balanceNeutrinoLockInterval = getNumberByKey(BalanceNeutrinoLockIntervalKey)
217169
218170 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
219171
220172 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
221173
222174 let reserve = (wavesBalance(this) - wavesLockedBalance)
223-
224-let reserveWithoutLeasing = (reserve - leasingAmount)
225175
226176 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
227177
257207 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
258208
259209
260-func getLeaseTxStatus (hash) = getStringByKey(getLeaseTxStatusKey(hash))
261-
262-
263-func getLeaseTxAmountByHash (hash) = getNumberByKey(getLeaseTxAmountByHashKey(hash))
264-
265-
266-func getLeaseTxBytesByHash (hash) = getStringByKey(getLeaseTxBytesByHashKey(hash))
267-
268-
269-func getLeaseTxExpireSendBlock (hash) = getNumberByKey(getLeaseTxExpireSendBlockKey(hash))
270-
271-
272210 @Callable(i)
273211 func swapWavesToNeutrino () = {
274212 let pmt = extract(i.payment)
275213 let account = toString(i.caller)
276214 if ((minWavesSwapAmount > pmt.amount))
277- then throw((("an amount is less than min available amount: " + toString(minWavesSwapAmount)) + " wavelets"))
215+ then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
278216 else if (isDefined(pmt.assetId))
279- then throw("can use waves only")
217+ then throw("Only Waves token is allowed for swapping.")
280218 else if (isBlocked)
281219 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
282220 else if ((getUnlockBalanceBlock(account) > height))
285223 then true
286224 else (getWavesLockedBalance(account) != 0))
287225 then throw("please withdraw locked funds first")
288- else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
226+ else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceWavesLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
289227 }
290228
291229
295233 let pmt = extract(i.payment)
296234 let account = toString(i.caller)
297235 if ((minNeutrinoSwapAmount > pmt.amount))
298- then throw((("an amount is less than min available amount: " + toString(minNeutrinoSwapAmount)) + " neutrino cents"))
236+ then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
299237 else if (isBlocked)
300- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
238+ then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
301239 else if ((pmt.assetId != neutrinoAssetId))
302- then throw("can use appropriate neutrino tokens only")
240+ then throw("Only appropriate Neutrino tokens are allowed for swapping.")
303241 else if ((getUnlockBalanceBlock(account) > height))
304242 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
305243 else if (if ((getNeutrinoLockedBalance(account) != 0))
306244 then true
307245 else (getWavesLockedBalance(account) != 0))
308246 then throw("please withdraw locked funds first")
309- else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getWavesLockedBalanceKey(account), (height + balanceLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
247+ else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceNeutrinoLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
310248 }
311249
312250
317255 let userWavesLockedBalance = getWavesLockedBalance(account)
318256 let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
319257 let indexHeight = getHeightPriceByIndex(index)
320- let nextIndexHeight = getHeightPriceByIndex((index + 1))
258+ let prevIndexHeight = getHeightPriceByIndex((index - 1))
321259 let priceByIndex = getPriceHistory(indexHeight)
322260 let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
323261 let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
327265 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
328266 else if (if (if ((index > priceIndex))
329267 then true
330- else (indexHeight > unlockHeight))
268+ else (unlockHeight > indexHeight))
331269 then true
332- else if ((nextIndexHeight != 0))
333- then (unlockHeight >= nextIndexHeight)
270+ else if ((prevIndexHeight != 0))
271+ then (prevIndexHeight >= unlockHeight)
334272 else false)
335273 then throw("invalid price history index")
336274 else if (if ((0 >= neutrinoAmount))
348286 let surplusBond = (convertNeutrinoToBond(surplus) - assetBalance(addressFromStringValue(auctionContract), neutrinoAssetId))
349287 if (isBlocked)
350288 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
351- else if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
289+ else if (if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
290+ then (deficitBondAmount > 0)
291+ else false)
352292 then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
353293 else if ((surplusBond > 0))
354294 then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), convertBondToNeutrino(surplusBond), neutrinoAssetId)])
361301 func transfer (account) = {
362302 let pmt = extract(i.payment)
363303 TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)])
364- }
365-
366-
367-
368-@Callable(i)
369-func nodeReward () = {
370- let pmt = value(i.payment)
371- if ((i.caller != addressFromStringValue(nodeAddress)))
372- then throw("only node account is able to transfer staking rewards from main account")
373- else if (isDefined(pmt.assetId))
374- then throw("waves tokens only allowed")
375- else {
376- let amount = convertWavesToNeutrino(pmt.amount, currentPrice)
377- let newRpdSyncIndex = (rpdSyncIndex + 1)
378- ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
379- }
380304 }
381305
382306
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 let SENDTXEXPIRE = 30
5353
5454 let LISTSPLITSYMBOL = "_"
5555
5656 let LISTDATASYMBOL = "+"
5757
5858 let WAVELET = 100000000
5959
60-let PAULI = 100
61-
62-let CRYTICALSHARE = 20
63-
64-let LEASINGSHARE = 90
65-
66-let LEASINTXCOUNT = 10
60+let PAULI = 1000000
6761
6862 let DEFICITOFFSET = 10
69-
70-let WAVESASSETID = "waves"
71-
72-let CANCELED = "canceled"
73-
74-let NEW = "new"
7563
7664 let NeutrinoAssetIdKey = "neutrino_asset_id"
7765
7866 let BondAssetIdKey = "bond_asset_id"
79-
80-let ReserveContractKey = "reserve_contract"
8167
8268 let AuctionContractKey = "auction_contract"
8369
8470 let LiquidationContractKey = "liquidation_contract"
8571
8672 let RPDContractKey = "rpd_contract"
8773
8874 let ContolContractKey = "control_contract"
8975
90-let BalanceLockIntervalKey = "balance_lock_interval"
76+let BalanceWavesLockIntervalKey = "balance_waves_lock_interval"
77+
78+let BalanceNeutrinoLockIntervalKey = "balance_neutrino_lock_interval"
9179
9280 let MinWavesSwapAmountKey = "min_waves_swap_amount"
9381
9482 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
9583
96-let NodeAddressKey = "node_address"
97-
98-let NodeOracleProviderKey = "oracle_node_provider"
99-
100-let LeasingIntervalKey = "leasing_interval"
84+let NodeOracleProviderKey = "node_oracle_provider"
10185
10286 let RPDBalanceKey = "rpd_balance"
10387
10488 func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
10589
10690
10791 let PriceKey = "price"
10892
10993 let PriceIndexKey = "price_index"
11094
11195 let IsBlockedKey = "is_blocked"
11296
113-let LeasingExpireBlockKey = "leasing_expire_block"
114-
115-let LeasingTxCountKey = "leasing_index"
116-
117-let LeasingAmountKey = "leasing_amount"
118-
11997 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
12098
12199
122100 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
123101
124-
125-let RPDSyncIndexKey = "rpd_sync_index"
126102
127103 let BalanceLocedkKey = "balance_lock_"
128104
129105 let WavesLockedBalanceKey = (BalanceLocedkKey + "waves")
130106
131107 let NeutrinoLockedBalanceKey = (BalanceLocedkKey + "neutrino")
132108
133109 func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
134110
135111
136112 func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
137113
138114
139115 func getWavesLockedBalanceKey (owner) = ((WavesLockedBalanceKey + "_") + owner)
140116
141117
142118 func getNeutrinoLockedBalanceKey (owner) = ((NeutrinoLockedBalanceKey + "_") + owner)
143119
144120
145121 func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
146122
147123
148124 func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
149-
150-
151-func getLeaseTxStatusKey (hash) = (("lease_tx_status" + "_") + hash)
152-
153-
154-func getLeaseTxAmountByHashKey (hash) = ((LeasingAmountKey + "_") + hash)
155-
156-
157-func getLeaseTxBytesByHashKey (hash) = (("lease_tx" + "_") + hash)
158-
159-
160-func getLeaseTxExpireSendBlockKey (hash) = (("leasing_expire_send" + "_") + hash)
161125
162126
163127 func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
164128
165129
166130 func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
167131
168132
169133 func convertNeutrinoToBond (amount) = (amount / PAULI)
170134
171135
172136 func convertBondToNeutrino (amount) = (amount * PAULI)
173137
174138
175139 func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
176140
177141
178142 let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
179143
180144 let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
181145
182146 let liquidationContract = getStringByKey(LiquidationContractKey)
183147
184148 let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
185149
186150 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
187151
188-let reserveContract = getStringByKey(ReserveContractKey)
189-
190152 let auctionContract = getStringByKey(AuctionContractKey)
191153
192154 let rpdContract = getStringByKey(RPDContractKey)
193155
194156 let controlContract = getStringByKey(ContolContractKey)
195157
196158 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
197159
198160 let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
199161
200162 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
201163
202-let leasingTxCount = getNumberByKey(LeasingTxCountKey)
203-
204-let leasingInterval = getNumberByKey(LeasingIntervalKey)
205-
206-let leasingExpireBlock = getNumberByKey(LeasingExpireBlockKey)
207-
208-let leasingAmount = getNumberByKey(LeasingAmountKey)
209-
210-let nodeAddress = getStringByKey(NodeAddressKey)
211-
212164 let nodeOracleProvider = getStringByKey(NodeOracleProviderKey)
213165
214-let rpdSyncIndex = getNumberByKey(RPDSyncIndexKey)
166+let balanceWavesLockInterval = getNumberByKey(BalanceWavesLockIntervalKey)
215167
216-let balanceLockInterval = getNumberByKey(BalanceLockIntervalKey)
168+let balanceNeutrinoLockInterval = getNumberByKey(BalanceNeutrinoLockIntervalKey)
217169
218170 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
219171
220172 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
221173
222174 let reserve = (wavesBalance(this) - wavesLockedBalance)
223-
224-let reserveWithoutLeasing = (reserve - leasingAmount)
225175
226176 let bondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
227177
228178 let bondSupply = (extract(assetInfo(bondAssetId)).quantity - assetBalance(this, bondAssetId))
229179
230180 let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(this, neutrinoAssetId)) + neutrinoLockedBalance)
231181
232182 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
233183
234184 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
235185
236186 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
237187
238188
239189 func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
240190
241191
242192 func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
243193
244194
245195 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
246196
247197
248198 func getWavesLockedBalance (owner) = getNumberByKey(getWavesLockedBalanceKey(owner))
249199
250200
251201 func getNeutrinoLockedBalance (owner) = getNumberByKey(getNeutrinoLockedBalanceKey(owner))
252202
253203
254204 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
255205
256206
257207 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
258208
259209
260-func getLeaseTxStatus (hash) = getStringByKey(getLeaseTxStatusKey(hash))
261-
262-
263-func getLeaseTxAmountByHash (hash) = getNumberByKey(getLeaseTxAmountByHashKey(hash))
264-
265-
266-func getLeaseTxBytesByHash (hash) = getStringByKey(getLeaseTxBytesByHashKey(hash))
267-
268-
269-func getLeaseTxExpireSendBlock (hash) = getNumberByKey(getLeaseTxExpireSendBlockKey(hash))
270-
271-
272210 @Callable(i)
273211 func swapWavesToNeutrino () = {
274212 let pmt = extract(i.payment)
275213 let account = toString(i.caller)
276214 if ((minWavesSwapAmount > pmt.amount))
277- then throw((("an amount is less than min available amount: " + toString(minWavesSwapAmount)) + " wavelets"))
215+ then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
278216 else if (isDefined(pmt.assetId))
279- then throw("can use waves only")
217+ then throw("Only Waves token is allowed for swapping.")
280218 else if (isBlocked)
281219 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
282220 else if ((getUnlockBalanceBlock(account) > height))
283221 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
284222 else if (if ((getNeutrinoLockedBalance(account) != 0))
285223 then true
286224 else (getWavesLockedBalance(account) != 0))
287225 then throw("please withdraw locked funds first")
288- else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
226+ else WriteSet([DataEntry(getWavesLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceWavesLockInterval)), DataEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))])
289227 }
290228
291229
292230
293231 @Callable(i)
294232 func swapNeutrinoToWaves () = {
295233 let pmt = extract(i.payment)
296234 let account = toString(i.caller)
297235 if ((minNeutrinoSwapAmount > pmt.amount))
298- then throw((("an amount is less than min available amount: " + toString(minNeutrinoSwapAmount)) + " neutrino cents"))
236+ then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
299237 else if (isBlocked)
300- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
238+ then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
301239 else if ((pmt.assetId != neutrinoAssetId))
302- then throw("can use appropriate neutrino tokens only")
240+ then throw("Only appropriate Neutrino tokens are allowed for swapping.")
303241 else if ((getUnlockBalanceBlock(account) > height))
304242 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
305243 else if (if ((getNeutrinoLockedBalance(account) != 0))
306244 then true
307245 else (getWavesLockedBalance(account) != 0))
308246 then throw("please withdraw locked funds first")
309- else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getWavesLockedBalanceKey(account), (height + balanceLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
247+ else WriteSet([DataEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), DataEntry(getBalanceUnlockBlockKey(account), (height + balanceNeutrinoLockInterval)), DataEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))])
310248 }
311249
312250
313251
314252 @Callable(i)
315253 func withdraw (account,index) = {
316254 let unlockHeight = getUnlockBalanceBlock(account)
317255 let userWavesLockedBalance = getWavesLockedBalance(account)
318256 let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
319257 let indexHeight = getHeightPriceByIndex(index)
320- let nextIndexHeight = getHeightPriceByIndex((index + 1))
258+ let prevIndexHeight = getHeightPriceByIndex((index - 1))
321259 let priceByIndex = getPriceHistory(indexHeight)
322260 let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
323261 let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
324262 if (isBlocked)
325263 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
326264 else if ((unlockHeight > height))
327265 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
328266 else if (if (if ((index > priceIndex))
329267 then true
330- else (indexHeight > unlockHeight))
268+ else (unlockHeight > indexHeight))
331269 then true
332- else if ((nextIndexHeight != 0))
333- then (unlockHeight >= nextIndexHeight)
270+ else if ((prevIndexHeight != 0))
271+ then (prevIndexHeight >= unlockHeight)
334272 else false)
335273 then throw("invalid price history index")
336274 else if (if ((0 >= neutrinoAmount))
337275 then (0 >= wavesAmount)
338276 else false)
339277 then throw("balance equals zero")
340278 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)]))
341279 }
342280
343281
344282
345283 @Callable(i)
346284 func transferToAuction () = {
347285 let deficitBondAmount = (convertNeutrinoToBond(deficit) - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
348286 let surplusBond = (convertNeutrinoToBond(surplus) - assetBalance(addressFromStringValue(auctionContract), neutrinoAssetId))
349287 if (isBlocked)
350288 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
351- else if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
289+ else if (if ((deficitBondAmount >= ((convertNeutrinoToBond(neutrinoSupply) * DEFICITOFFSET) / 100)))
290+ then (deficitBondAmount > 0)
291+ else false)
352292 then TransferSet([ScriptTransfer(addressFromStringValue(auctionContract), deficitBondAmount, bondAssetId)])
353293 else if ((surplusBond > 0))
354294 then TransferSet([ScriptTransfer(addressFromStringValue(liquidationContract), convertBondToNeutrino(surplusBond), neutrinoAssetId)])
355295 else throw(((((("bond were generated or do not need it. Deficit:" + toString(deficitBondAmount)) + "|") + toString(((neutrinoSupply * DEFICITOFFSET) / 100))) + ". Surplus:") + toString(surplusBond)))
356296 }
357297
358298
359299
360300 @Callable(i)
361301 func transfer (account) = {
362302 let pmt = extract(i.payment)
363303 TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)])
364- }
365-
366-
367-
368-@Callable(i)
369-func nodeReward () = {
370- let pmt = value(i.payment)
371- if ((i.caller != addressFromStringValue(nodeAddress)))
372- then throw("only node account is able to transfer staking rewards from main account")
373- else if (isDefined(pmt.assetId))
374- then throw("waves tokens only allowed")
375- else {
376- let amount = convertWavesToNeutrino(pmt.amount, currentPrice)
377- let newRpdSyncIndex = (rpdSyncIndex + 1)
378- ScriptResult(WriteSet([DataEntry(RPDSyncIndexKey, newRpdSyncIndex), DataEntry(getRPDProfitKey(rpdSyncIndex), amount), DataEntry(getRPDSnapshotContractBalanceKey(rpdSyncIndex, neutrinoAssetId), getRPDContractBalance(neutrinoAssetId))]), TransferSet([ScriptTransfer(addressFromStringValue(rpdContract), amount, neutrinoAssetId)]))
379- }
380304 }
381305
382306
383307 @Verifier(tx)
384308 func verify () = {
385309 let id = toBase58String(tx.id)
386310 match tx {
387311 case leasingTx: LeaseCancelTransaction|LeaseTransaction =>
388312 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
389313 then (addressFromString(nodeOracleProvider) == addressFromPublicKey(tx.senderPublicKey))
390314 else false
391315 case _ =>
392316 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
393317 }
394318 }
395319

github/deemru/w8io/6500d08 
115.70 ms