tx · 3UfFWE9F1khDVZg4Hz6Kx6ffCbHoQEJKhL6aThkRAKQk

3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP:  -0.01400000 Waves

2019.12.06 18:16 [1827392] smart account 3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP > SELF 0.00000000 Waves

{ "type": 13, "id": "3UfFWE9F1khDVZg4Hz6Kx6ffCbHoQEJKhL6aThkRAKQk", "fee": 1400000, "feeAssetId": null, "timestamp": 1575645445372, "version": 1, "sender": "3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP", "senderPublicKey": "5RM3w4ysmDbtgfswnVNPx7DQkNwVAG3RoxNFHgt6ToNU", "proofs": [ "3DRrRuWocZTspZYxv2x8gDrjcZgFfJzkdPVWW2i7cDAaah7sQb8RBPL9topA4akZT2YVSbVdqbetTbuTFpbVB6aB" ], "script": "base64:AAIDAAAAAAAAAA8IARIECgIBARIDCgEIEgAAAAA1AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAQT1JERVJTUExJVFNZTUJPTAIAAAABXwAAAAAFUEFVTEkAAAAAAAAPQkAAAAAAD1BFUkNFTlRBQ0NVUkFDWQAAAAAAAAAD6AAAAAALTUFYRElTQ09VTlQAAAAAAAAAADIAAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAABkZJTExFRAIAAAAGZmlsbGVkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAMT3JkZXJib29rS2V5AgAAAAlvcmRlcmJvb2sAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8BAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfcHJpY2VfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9vd25lcl8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX2hlaWdodF8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX3N0YXR1c18FAAAAB29yZGVySWQBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAATb3JkZXJfZmlsbGVkX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAASZ2V0T3JkZXJIaXN0b3J5S2V5AAAAAQAAAAZoZWlnaHQJAAEsAAAAAgIAAAAOb3JkZXJfaGlzdG9yeV8JAAGkAAAAAQUAAAAGaGVpZ2h0AQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQAAAAAAAAAAGQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEAAAAGYW1vdW50CQAAaQAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEAAAAGYW1vdW50CQAAaAAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAAAAAAlvcmRlcmJvb2sJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADE9yZGVyYm9va0tleQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABNOZXV0cmlub0NvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEkNvbnRyb2xDb250cmFjdEtleQAAAAAMY3VycmVudFByaWNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAhQcmljZUtleQAAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAAtib25kQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAOQm9uZEFzc2V0SWRLZXkAAAAAB3Jlc2VydmUJAABlAAAAAgkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEndhdmVzTG9ja2VkQmFsYW5jZQAAAAAObmV1dHJpbm9TdXBwbHkJAABkAAAAAgkAAGUAAAACCAkBAAAAB2V4dHJhY3QAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA+sAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAAHZGVmaWNpdAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UBAAAADWdldE9yZGVyUHJpY2UAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlclRvdGFsAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABBQAAAAJpZAEAAAANZ2V0T3JkZXJPd25lcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAACaWQBAAAADmdldE9yZGVyU3RhdHVzAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAACaWQBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAAmlkAQAAABNnZXRPcmRlckVsZW1lbnRCeUlkAAAAAQAAAAJpZAkAASwAAAACBQAAAAJpZAUAAAAQT1JERVJTUExJVFNZTUJPTAEAAAAIYWRkT3JkZXIAAAACAAAAB29yZGVySWQAAAAIcG9zaXRpb24EAAAABm9yZGVycwkABLUAAAACBQAAAAlvcmRlcmJvb2sFAAAAEE9SREVSU1BMSVRTWU1CT0wEAAAACG5ld09yZGVyCQEAAAATZ2V0T3JkZXJFbGVtZW50QnlJZAAAAAEFAAAAB29yZGVySWQDCQAAAAAAAAIFAAAACHBvc2l0aW9uAAAAAAAAAAAACQABLAAAAAIFAAAACG5ld09yZGVyBQAAAAlvcmRlcmJvb2sDCQAAZwAAAAIFAAAACHBvc2l0aW9uCQAAZQAAAAIJAAGQAAAAAQUAAAAGb3JkZXJzAAAAAAAAAAABCQABLAAAAAIFAAAACW9yZGVyYm9vawUAAAAIbmV3T3JkZXIEAAAABXBhcnRzCQAEtQAAAAIFAAAACW9yZGVyYm9vawkBAAAAE2dldE9yZGVyRWxlbWVudEJ5SWQAAAABCQABkQAAAAIFAAAABm9yZGVycwUAAAAIcG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAAFAAAACG5ld09yZGVyCQEAAAATZ2V0T3JkZXJFbGVtZW50QnlJZAAAAAEJAAGRAAAAAgUAAAAGb3JkZXJzBQAAAAhwb3NpdGlvbgkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAQEAAAAJZHJvcE9yZGVyAAAAAQAAAAdvcmRlcklkBAAAAAVwYXJ0cwkABLUAAAACBQAAAAlvcmRlcmJvb2sJAQAAABNnZXRPcmRlckVsZW1lbnRCeUlkAAAAAQUAAAAHb3JkZXJJZAkAASwAAAACCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAACQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAABAQAAABRnZXRPcmRlcnNJbk9yZGVyYm9vawAAAAEAAAAJb3JkZXJib29rCQAEtQAAAAIFAAAACW9yZGVyYm9vawUAAAAQT1JERVJTUExJVFNZTUJPTAAAAAMAAAABaQEAAAAPYWRkQnV5Qm9uZE9yZGVyAAAAAgAAAAVwcmljZQAAAAhwb3NpdGlvbgQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQEAAAACm5ld09yZGVySWQJAAJYAAAAAQkAAfUAAAABCQAAywAAAAIJAADLAAAAAgkAAMsAAAACCQABmgAAAAEFAAAABXByaWNlCQABmgAAAAEIBQAAAANwbXQAAAAGYW1vdW50CAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzCQABmgAAAAEFAAAABmhlaWdodAMJAABmAAAAAgUAAAALTUFYRElTQ09VTlQFAAAABXByaWNlCQAAAgAAAAECAAAAE21heCBkaXNjb3VudCBpcyA1MCUDCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAABVjYW4gdXNlIG5ldXRyaW5vIG9ubHkDCQAAZwAAAAIAAAAAAAAAAAAFAAAABXByaWNlCQAAAgAAAAECAAAAD3ByaWNlIGxlc3MgemVybwMJAQAAAAIhPQAAAAIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAKbmV3T3JkZXJJZAIAAAAACQAAAgAAAAECAAAADG9yZGVyIGV4aXN0cwQAAAAGb3JkZXJzCQEAAAAUZ2V0T3JkZXJzSW5PcmRlcmJvb2sAAAABBQAAAAlvcmRlcmJvb2sEAAAAC25leHRPcmRlcklkAwkAAAAAAAACBQAAAAhwb3NpdGlvbgAAAAAAAAAAAAIAAAAACQABkQAAAAIFAAAABm9yZGVycwkAAGUAAAACBQAAAAhwb3NpdGlvbgAAAAAAAAAAAQQAAAAObmV4dE9yZGVyUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAALbmV4dE9yZGVySWQEAAAAEGlzTmV4dE9yZGVyRXJyb3IDAwkBAAAAAiE9AAAAAgUAAAALbmV4dE9yZGVySWQCAAAAAAkAAGYAAAACBQAAAAVwcmljZQUAAAAObmV4dE9yZGVyUHJpY2UHBgcEAAAAC3ByZXZPcmRlcklkCQABkQAAAAIFAAAABm9yZGVycwUAAAAIcG9zaXRpb24EAAAADnByZXZPcmRlclByaWNlCQEAAAANZ2V0T3JkZXJQcmljZQAAAAEFAAAAC3ByZXZPcmRlcklkBAAAABBpc1ByZXZPcmRlckVycm9yAwkAAGcAAAACBQAAAA5wcmV2T3JkZXJQcmljZQUAAAAFcHJpY2UGBwMDBQAAABBpc05leHRPcmRlckVycm9yBgUAAAAQaXNQcmV2T3JkZXJFcnJvcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9pbnZhbGlkIG9yZGVyIGlzUHJldk9yZGVyRXJyb3I6CQABpQAAAAEFAAAAEGlzUHJldk9yZGVyRXJyb3ICAAAAEiBpc05leHRPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc05leHRPcmRlckVycm9yCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkJAQAAAAhhZGRPcmRlcgAAAAIFAAAACm5ld09yZGVySWQFAAAACHBvc2l0aW9uCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABXByaWNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAACm5ld09yZGVySWQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAACm5ld09yZGVySWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAACm5ld09yZGVySWQFAAAAA05FVwUAAAADbmlsAAAAAWkBAAAAC2NhbmNlbE9yZGVyAAAAAQAAAAdvcmRlcklkBAAAAAVvd25lcgkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAAdvcmRlcklkBAAAAAZhbW91bnQJAABlAAAAAgkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAAdvcmRlcklkCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAAB29yZGVySWQDCQEAAAACIT0AAAACBQAAAAVvd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAARcGVybWlzc2lvbiBkZW5pZWQDCQEAAAACIT0AAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAdvcmRlcklkBQAAAANORVcJAAACAAAAAQIAAAAUaW52YWxpZCBvcmRlciBzdGF0dXMJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkJAQAAAAlkcm9wT3JkZXIAAAABBQAAAAdvcmRlcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAhDQU5DRUxFRAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAhzZWxsQm9uZAAAAAAEAAAAC2JvbmRCYWxhbmNlCQAD6wAAAAIFAAAABHRoaXMFAAAAC2JvbmRBc3NldElkBAAAAA9kZWZpY2l0UG9zaXRpdmUDCQAAZwAAAAIAAAAAAAAAAAAFAAAAB2RlZmljaXQAAAAAAAAAAAAFAAAAB2RlZmljaXQEAAAACmJvbmRBbW91bnQDCQAAZwAAAAIFAAAAD2RlZmljaXRQb3NpdGl2ZQUAAAALYm9uZEJhbGFuY2UFAAAAC2JvbmRCYWxhbmNlBQAAAA9kZWZpY2l0UG9zaXRpdmUEAAAADHJldHVybkFtb3VudAMJAABnAAAAAgUAAAAPZGVmaWNpdFBvc2l0aXZlBQAAAAtib25kQmFsYW5jZQAAAAAAAAAAAAkAAGUAAAACBQAAAAtib25kQmFsYW5jZQUAAAAPZGVmaWNpdFBvc2l0aXZlAwMJAAAAAAAAAgUAAAAMcmV0dXJuQW1vdW50AAAAAAAAAAAACQAAAAAAAAIFAAAACmJvbmRBbW91bnQAAAAAAAAAAAAHCQAAAgAAAAECAAAAD3dpdGhvdXQgZGVmaWNpdAMJAAAAAAAAAgUAAAAKYm9uZEFtb3VudAAAAAAAAAAAAAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAxyZXR1cm5BbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAACW9yZGVyYm9vawIAAAAACQAAAgAAAAECAAAAD2VtcHR5IG9yZGVyYm9vawQAAAAHb3JkZXJJZAkAAZEAAAACCQEAAAAUZ2V0T3JkZXJzSW5PcmRlcmJvb2sAAAABBQAAAAlvcmRlcmJvb2sAAAAAAAAAAAAEAAAAC2ZpbGxlZFRvdGFsCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAAB29yZGVySWQEAAAACm9yZGVyVG90YWwJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAQAAAAKb3JkZXJQcmljZQkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAAdvcmRlcklkBAAAAApvcmRlck93bmVyCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQEAAAABmFtb3VudAkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEJAABpAAAAAgkAAGgAAAACCQAAZQAAAAIFAAAACm9yZGVyVG90YWwFAAAAC2ZpbGxlZFRvdGFsAAAAAAAAAABkBQAAAApvcmRlclByaWNlBAAAAAxmaWxsZWRBbW91bnQDCQAAZwAAAAIFAAAACmJvbmRBbW91bnQFAAAABmFtb3VudAUAAAAGYW1vdW50BQAAAApib25kQW1vdW50BAAAAAV0b3RhbAkAAGsAAAADCQAAaAAAAAIFAAAADGZpbGxlZEFtb3VudAUAAAAKb3JkZXJQcmljZQUAAAAFUEFVTEkAAAAAAAAAAGQEAAAABnN0YXR1cwMJAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAGYW1vdW50BQAAAAZGSUxMRUQFAAAAA05FVwMJAAAAAAAAAgUAAAAFdG90YWwAAAAAAAAAAAAJAAACAAAAAQIAAAAQdG90YWwgZXF1YWwgemVybwkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADE9yZGVyYm9va0tleQMJAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAGYW1vdW50CQEAAAAJZHJvcE9yZGVyAAAAAQUAAAAHb3JkZXJJZAUAAAAJb3JkZXJib29rCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAB29yZGVySWQJAABkAAAAAgUAAAALZmlsbGVkVG90YWwFAAAABXRvdGFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAZzdGF0dXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABJnZXRPcmRlckhpc3RvcnlLZXkAAAABBQAAAAZoZWlnaHQFAAAACm9yZGVyUHJpY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAACm9yZGVyT3duZXIFAAAADGZpbGxlZEFtb3VudAUAAAALYm9uZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAFdG90YWwFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAANyylto=", "chainId": 87, "height": 1827392, "spentComplexity": 0 } View: original | compacted Prev: DiFeVsgDWR5sTsVe8h1mcFam3JJjUUDM8WJXWuBcPKxZ Next: 7TubxzL1GwZ8JH2evSmMSYXbDQt5VCvGuReJ7NcwJvf4 Diff:
OldNewDifferences
8888 func getOrderHistoryKey (height) = ("order_history_" + toString(height))
8989
9090
91-func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
91+func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
9292
9393
94-func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
94+func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
9595
9696
9797 func convertNeutrinoToBond (amount) = (amount / PAULI)
124124 let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(neutrinoContract, neutrinoAssetId)) + neutrinoLockedBalance)
125125
126126 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
127-
128-let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
129127
130128 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
131129
249247 let filledAmount = if ((bondAmount >= amount))
250248 then amount
251249 else bondAmount
252- let total = (((filledAmount * orderPrice) * PAULI) / 100)
250+ let total = fraction((filledAmount * orderPrice), PAULI, 100)
253251 let status = if ((bondAmount >= amount))
254252 then FILLED
255253 else NEW
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 getStringByAddressAndKey (address,key) = match getString(address, key) {
2121 case a: String =>
2222 a
2323 case _ =>
2424 ""
2525 }
2626
2727
2828 func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 let WAVELET = 100000000
3737
3838 let ORDERSPLITSYMBOL = "_"
3939
4040 let PAULI = 1000000
4141
4242 let PERCENTACCURACY = 1000
4343
4444 let MAXDISCOUNT = 50
4545
4646 let CANCELED = "canceled"
4747
4848 let NEW = "new"
4949
5050 let FILLED = "filled"
5151
5252 let NeutrinoContractKey = "neutrino_contract"
5353
5454 let OrderbookKey = "orderbook"
5555
5656 let PriceKey = "price"
5757
5858 let BondAssetIdKey = "bond_asset_id"
5959
6060 let NeutrinoAssetIdKey = "neutrino_asset_id"
6161
6262 let ControlContractKey = "control_contract"
6363
6464 let BalanceLockedkKey = "balance_lock_"
6565
6666 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6767
6868 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
6969
7070 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7171
7272
7373 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
7474
7575
7676 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
7777
7878
7979 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
8080
8181
8282 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
8383
8484
8585 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
8686
8787
8888 func getOrderHistoryKey (height) = ("order_history_" + toString(height))
8989
9090
91-func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
91+func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
9292
9393
94-func convertWavesToNeutrino (amount,price) = ((((amount * price) / 100) * PAULI) / WAVELET)
94+func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
9595
9696
9797 func convertNeutrinoToBond (amount) = (amount / PAULI)
9898
9999
100100 func convertBondToNeutrino (amount) = (amount * PAULI)
101101
102102
103103 func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
104104
105105
106106 let orderbook = getStringByKey(OrderbookKey)
107107
108108 let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
109109
110110 let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
111111
112112 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
113113
114114 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
115115
116116 let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
117117
118118 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
119119
120120 let bondAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, BondAssetIdKey))
121121
122122 let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
123123
124124 let neutrinoSupply = ((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(neutrinoContract, neutrinoAssetId)) + neutrinoLockedBalance)
125125
126126 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
127-
128-let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
129127
130128 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
131129
132130
133131 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
134132
135133
136134 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
137135
138136
139137 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
140138
141139
142140 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
143141
144142
145143 func getOrderElementById (id) = (id + ORDERSPLITSYMBOL)
146144
147145
148146 func addOrder (orderId,position) = {
149147 let orders = split(orderbook, ORDERSPLITSYMBOL)
150148 let newOrder = getOrderElementById(orderId)
151149 if ((position == 0))
152150 then (newOrder + orderbook)
153151 else if ((position >= (size(orders) - 1)))
154152 then (orderbook + newOrder)
155153 else {
156154 let parts = split(orderbook, getOrderElementById(orders[position]))
157155 (((parts[0] + newOrder) + getOrderElementById(orders[position])) + parts[1])
158156 }
159157 }
160158
161159
162160 func dropOrder (orderId) = {
163161 let parts = split(orderbook, getOrderElementById(orderId))
164162 (parts[0] + parts[1])
165163 }
166164
167165
168166 func getOrdersInOrderbook (orderbook) = split(orderbook, ORDERSPLITSYMBOL)
169167
170168
171169 @Callable(i)
172170 func addBuyBondOrder (price,position) = {
173171 let pmt = extract(i.payment)
174172 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
175173 if ((MAXDISCOUNT > price))
176174 then throw("max discount is 50%")
177175 else if ((pmt.assetId != neutrinoAssetId))
178176 then throw("can use neutrino only")
179177 else if ((0 >= price))
180178 then throw("price less zero")
181179 else if ((getOrderOwner(newOrderId) != ""))
182180 then throw("order exists")
183181 else {
184182 let orders = getOrdersInOrderbook(orderbook)
185183 let nextOrderId = if ((position == 0))
186184 then ""
187185 else orders[(position - 1)]
188186 let nextOrderPrice = getOrderPrice(nextOrderId)
189187 let isNextOrderError = if (if ((nextOrderId != ""))
190188 then (price > nextOrderPrice)
191189 else false)
192190 then true
193191 else false
194192 let prevOrderId = orders[position]
195193 let prevOrderPrice = getOrderPrice(prevOrderId)
196194 let isPrevOrderError = if ((prevOrderPrice >= price))
197195 then true
198196 else false
199197 if (if (isNextOrderError)
200198 then true
201199 else isPrevOrderError)
202200 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
203201 else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId, position)), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
204202 }
205203 }
206204
207205
208206
209207 @Callable(i)
210208 func cancelOrder (orderId) = {
211209 let owner = getOrderOwner(orderId)
212210 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
213211 if ((owner != toString(i.caller)))
214212 then throw("permission denied")
215213 else if ((getOrderStatus(orderId) != NEW))
216214 then throw("invalid order status")
217215 else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, neutrinoAssetId)]))
218216 }
219217
220218
221219
222220 @Callable(i)
223221 func sellBond () = {
224222 let bondBalance = assetBalance(this, bondAssetId)
225223 let deficitPositive = if ((0 >= deficit))
226224 then 0
227225 else deficit
228226 let bondAmount = if ((deficitPositive >= bondBalance))
229227 then bondBalance
230228 else deficitPositive
231229 let returnAmount = if ((deficitPositive >= bondBalance))
232230 then 0
233231 else (bondBalance - deficitPositive)
234232 if (if ((returnAmount == 0))
235233 then (bondAmount == 0)
236234 else false)
237235 then throw("without deficit")
238236 else if ((bondAmount == 0))
239237 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
240238 else if ((orderbook == ""))
241239 then throw("empty orderbook")
242240 else {
243241 let orderId = getOrdersInOrderbook(orderbook)[0]
244242 let filledTotal = getOrderFilledTotal(orderId)
245243 let orderTotal = getOrderTotal(orderId)
246244 let orderPrice = getOrderPrice(orderId)
247245 let orderOwner = getOrderOwner(orderId)
248246 let amount = convertNeutrinoToBond((((orderTotal - filledTotal) * 100) / orderPrice))
249247 let filledAmount = if ((bondAmount >= amount))
250248 then amount
251249 else bondAmount
252- let total = (((filledAmount * orderPrice) * PAULI) / 100)
250+ let total = fraction((filledAmount * orderPrice), PAULI, 100)
253251 let status = if ((bondAmount >= amount))
254252 then FILLED
255253 else NEW
256254 if ((total == 0))
257255 then throw("total equal zero")
258256 else ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((bondAmount >= amount))
259257 then dropOrder(orderId)
260258 else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + total)), DataEntry(getOrderStatusKey(orderId), status), DataEntry(getOrderHistoryKey(height), orderPrice)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), filledAmount, bondAssetId), ScriptTransfer(neutrinoContract, total, neutrinoAssetId)]))
261259 }
262260 }
263261
264262

github/deemru/w8io/3ef1775 
93.54 ms