tx · DiFeVsgDWR5sTsVe8h1mcFam3JJjUUDM8WJXWuBcPKxZ

3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP:  -0.01400000 Waves

2019.11.29 18:55 [1817204] smart account 3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP > SELF 0.00000000 Waves

{ "type": 13, "id": "DiFeVsgDWR5sTsVe8h1mcFam3JJjUUDM8WJXWuBcPKxZ", "fee": 1400000, "feeAssetId": null, "timestamp": 1575042944078, "version": 1, "sender": "3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP", "senderPublicKey": "5RM3w4ysmDbtgfswnVNPx7DQkNwVAG3RoxNFHgt6ToNU", "proofs": [ "2D5rm7NYkdZYL82foVakiK8NzUjcRpkaBPGs3WzFZNmotSqxM6riwWWSXDWLScJLiMjJkEg5AJpHYZYA2M84b4HP" ], "script": "base64:AAIDAAAAAAAAAA8IARIECgIBARIDCgEIEgAAAAA2AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAQT1JERVJTUExJVFNZTUJPTAIAAAABXwAAAAAFUEFVTEkAAAAAAAAPQkAAAAAAD1BFUkNFTlRBQ0NVUkFDWQAAAAAAAAAD6AAAAAALTUFYRElTQ09VTlQAAAAAAAAAADIAAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAABkZJTExFRAIAAAAGZmlsbGVkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAMT3JkZXJib29rS2V5AgAAAAlvcmRlcmJvb2sAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8BAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfcHJpY2VfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9vd25lcl8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX2hlaWdodF8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX3N0YXR1c18FAAAAB29yZGVySWQBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAATb3JkZXJfZmlsbGVkX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAASZ2V0T3JkZXJIaXN0b3J5S2V5AAAAAQAAAAZoZWlnaHQJAAEsAAAAAgIAAAAOb3JkZXJfaGlzdG9yeV8JAAGkAAAAAQUAAAAGaGVpZ2h0AQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABpAAAAAgkAAGgAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGYW1vdW50AAAAAAAAAABkBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGkAAAACCQAAaAAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAZhbW91bnQFAAAABXByaWNlAAAAAAAAAABkBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQAAAAZhbW91bnQJAABpAAAAAgUAAAAGYW1vdW50BQAAAAVQQVVMSQEAAAAVY29udmVydEJvbmRUb05ldXRyaW5vAAAAAQAAAAZhbW91bnQJAABoAAAAAgUAAAAGYW1vdW50BQAAAAVQQVVMSQEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABVjb252ZXJ0TmV1dHJpbm9Ub0JvbmQAAAABCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAABmFtb3VudAUAAAAFcHJpY2UAAAAACW9yZGVyYm9vawkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAMT3JkZXJib29rS2V5AAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAE05ldXRyaW5vQ29udHJhY3RLZXkAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASQ29udHJvbENvbnRyYWN0S2V5AAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAAAEndhdmVzTG9ja2VkQmFsYW5jZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJOZXV0cmlub0Fzc2V0SWRLZXkAAAAAC2JvbmRBc3NldElkCQACWQAAAAEJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA5Cb25kQXNzZXRJZEtleQAAAAAHcmVzZXJ2ZQkAAGUAAAACCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlAAAAAA5uZXV0cmlub1N1cHBseQkAAGQAAAACCQAAZQAAAAIICQEAAAAHZXh0cmFjdAAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD6wAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAdkZWZpY2l0CQAAZQAAAAIFAAAADm5ldXRyaW5vU3VwcGx5CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQAAAAAHc3VycGx1cwkAAGUAAAACCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQUAAAAObmV1dHJpbm9TdXBwbHkBAAAADWdldE9yZGVyUHJpY2UAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAAAmlkAQAAAA1n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cmRlcmJvb2sEAAAAC25leHRPcmRlcklkAwkAAAAAAAACBQAAAAhwb3NpdGlvbgAAAAAAAAAAAAIAAAAACQABkQAAAAIFAAAABm9yZGVycwkAAGUAAAACBQAAAAhwb3NpdGlvbgAAAAAAAAAAAQQAAAAObmV4dE9yZGVyUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAALbmV4dE9yZGVySWQEAAAAEGlzTmV4dE9yZGVyRXJyb3IDAwkBAAAAAiE9AAAAAgUAAAALbmV4dE9yZGVySWQCAAAAAAkAAGYAAAACBQAAAAVwcmljZQUAAAAObmV4dE9yZGVyUHJpY2UHBgcEAAAAC3ByZXZPcmRlcklkCQABkQAAAAIFAAAABm9yZGVycwUAAAAIcG9zaXRpb24EAAAADnByZXZPcmRlclByaWNlCQEAAAANZ2V0T3JkZXJQcmljZQAAAAEFAAAAC3ByZXZPcmRlcklkBAAAABBpc1ByZXZPcmRlckVycm9yAwkAAGcAAAACBQAAAA5wcmV2T3JkZXJQcmljZQUAAAAFcHJpY2UGBwMDBQAAABBpc05leHRPcmRlckVycm9yBgUAAAAQaXNQcmV2T3JkZXJFcnJvcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9pbnZhbGlkIG9yZGVyIGlzUHJldk9yZGVyRXJyb3I6CQABpQAAAAEFAAAAEGlzUHJldk9yZGVyRXJyb3ICAAAAEiBpc05leHRPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc05leHRPcmRlckVycm9yCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkJAQAAAAhhZGRPcmRlcgAAAAIFAAAACm5ld09yZGVySWQFAAAACHBvc2l0aW9uCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEFAAAACm5ld09yZGVySWQFAAAABXByaWNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAACm5ld09yZGVySWQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEFAAAACm5ld09yZGVySWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABBQAAAApuZXdPcmRlcklkBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAACm5ld09yZGVySWQFAAAAA05FVwUAAAADbmlsAAAAAWkBAAAAC2NhbmNlbE9yZGVyAAAAAQAAAAdvcmRlcklkBAAAAAVvd25lcgkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAAdvcmRlcklkBAAAAAZhbW91bnQJAABlAAAAAgkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAAdvcmRlcklkCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAAB29yZGVySWQDCQEAAAACIT0AAAACBQAAAAVvd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAARcGVybWlzc2lvbiBkZW5pZWQDCQEAAAACIT0AAAACCQEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABBQAAAAdvcmRlcklkBQAAAANORVcJAAACAAAAAQIAAAAUaW52YWxpZCBvcmRlciBzdGF0dXMJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkJAQAAAAlkcm9wT3JkZXIAAAABBQAAAAdvcmRlcklkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAhDQU5DRUxFRAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAhzZWxsQm9uZAAAAAAEAAAAC2JvbmRCYWxhbmNlCQAD6wAAAAIFAAAABHRoaXMFAAAAC2JvbmRBc3NldElkBAAAAA9kZWZpY2l0UG9zaXRpdmUDCQAAZwAAAAIAAAAAAAAAAAAFAAAAB2RlZmljaXQAAAAAAAAAAAAFAAAAB2RlZmljaXQEAAAACmJvbmRBbW91bnQDCQAAZwAAAAIFAAAAD2RlZmljaXRQb3NpdGl2ZQUAAAALYm9uZEJhbGFuY2UFAAAAC2JvbmRCYWxhbmNlBQAAAA9kZWZpY2l0UG9zaXRpdmUEAAAADHJldHVybkFtb3VudAMJAABnAAAAAgUAAAAPZGVmaWNpdFBvc2l0aXZlBQAAAAtib25kQmFsYW5jZQAAAAAAAAAAAAkAAGUAAAACBQAAAAtib25kQmFsYW5jZQUAAAAPZGVmaWNpdFBvc2l0aXZlAwMJAAAAAAAAAgUAAAAMcmV0dXJuQW1vdW50AAAAAAAAAAAACQAAAAAAAAIFAAAACmJvbmRBbW91bnQAAAAAAAAAAAAHCQAAAgAAAAECAAAAD3dpdGhvdXQgZGVmaWNpdAMJAAAAAAAAAgUAAAAKYm9uZEFtb3VudAAAAAAAAAAAAAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAxyZXR1cm5BbW91bnQFAAAAC2JvbmRBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAACW9yZGVyYm9vawIAAAAACQAAAgAAAAECAAAAD2VtcHR5IG9yZGVyYm9vawQAAAAHb3JkZXJJZAkAAZEAAAACCQEAAAAUZ2V0T3JkZXJzSW5PcmRlcmJvb2sAAAABBQAAAAlvcmRlcmJvb2sAAAAAAAAAAAAEAAAAC2ZpbGxlZFRvdGFsCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAAB29yZGVySWQEAAAACm9yZGVyVG90YWwJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAQAAAAKb3JkZXJQcmljZQkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAAdvcmRlcklkBAAAAApvcmRlck93bmVyCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQEAAAABmFtb3VudAkBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEJAABpAAAAAgkAAGgAAAACCQAAZQAAAAIFAAAACm9yZGVyVG90YWwFAAAAC2ZpbGxlZFRvdGFsAAAAAAAAAABkBQAAAApvcmRlclByaWNlBAAAAAxmaWxsZWRBbW91bnQDCQAAZwAAAAIFAAAACmJvbmRBbW91bnQFAAAABmFtb3VudAUAAAAGYW1vdW50BQAAAApib25kQW1vdW50BAAAAAV0b3RhbAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAAMZmlsbGVkQW1vdW50BQAAAApvcmRlclByaWNlBQAAAAVQQVVMSQAAAAAAAAAAZAQAAAAGc3RhdHVzAwkAAGcAAAACBQAAAApib25kQW1vdW50BQAAAAZhbW91bnQFAAAABkZJTExFRAUAAAADTkVXAwkAAAAAAAACBQAAAAV0b3RhbAAAAAAAAAAAAAkAAAIAAAABAgAAABB0b3RhbCBlcXVhbCB6ZXJvCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAMT3JkZXJib29rS2V5AwkAAGcAAAACBQAAAApib25kQW1vdW50BQAAAAZhbW91bnQJAQAAAAlkcm9wT3JkZXIAAAABBQAAAAdvcmRlcklkBQAAAAlvcmRlcmJvb2sJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAAHb3JkZXJJZAkAAGQAAAACBQAAAAtmaWxsZWRUb3RhbAUAAAAFdG90YWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAABnN0YXR1cwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEmdldE9yZGVySGlzdG9yeUtleQAAAAEFAAAABmhlaWdodAUAAAAKb3JkZXJQcmljZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAKb3JkZXJPd25lcgUAAAAMZmlsbGVkQW1vdW50BQAAAAtib25kQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAV0b3RhbAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAAAWs8vZg==", "chainId": 87, "height": 1817204, "spentComplexity": 0 } View: original | compacted Prev: FrbZp5wxWqiQqKQadzEiUGxCPds75W2hAKnLVLiUGotw Next: 3UfFWE9F1khDVZg4Hz6Kx6ffCbHoQEJKhL6aThkRAKQk Diff:
OldNewDifferences
6161
6262 let ControlContractKey = "control_contract"
6363
64-let BalanceLocedkKey = "balance_lock_"
64+let BalanceLockedkKey = "balance_lock_"
6565
66-let WavesLockedBalanceKey = (BalanceLocedkKey + "waves")
66+let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6767
68-let NeutrinoLockedBalanceKey = (BalanceLocedkKey + "neutrino")
68+let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
6969
7070 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7171
111111
112112 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
113113
114-let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
114+let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
115115
116-let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
116+let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
117117
118118 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
119119
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
64-let BalanceLocedkKey = "balance_lock_"
64+let BalanceLockedkKey = "balance_lock_"
6565
66-let WavesLockedBalanceKey = (BalanceLocedkKey + "waves")
66+let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6767
68-let NeutrinoLockedBalanceKey = (BalanceLocedkKey + "neutrino")
68+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
9191 func convertNeutrinoToWaves (amount,price) = ((((amount * 100) / price) * WAVELET) / PAULI)
9292
9393
9494 func convertWavesToNeutrino (amount,price) = ((((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
114-let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
114+let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
115115
116-let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
116+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))
127127
128128 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
129129
130130 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
131131
132132
133133 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
134134
135135
136136 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
137137
138138
139139 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
140140
141141
142142 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
143143
144144
145145 func getOrderElementById (id) = (id + ORDERSPLITSYMBOL)
146146
147147
148148 func addOrder (orderId,position) = {
149149 let orders = split(orderbook, ORDERSPLITSYMBOL)
150150 let newOrder = getOrderElementById(orderId)
151151 if ((position == 0))
152152 then (newOrder + orderbook)
153153 else if ((position >= (size(orders) - 1)))
154154 then (orderbook + newOrder)
155155 else {
156156 let parts = split(orderbook, getOrderElementById(orders[position]))
157157 (((parts[0] + newOrder) + getOrderElementById(orders[position])) + parts[1])
158158 }
159159 }
160160
161161
162162 func dropOrder (orderId) = {
163163 let parts = split(orderbook, getOrderElementById(orderId))
164164 (parts[0] + parts[1])
165165 }
166166
167167
168168 func getOrdersInOrderbook (orderbook) = split(orderbook, ORDERSPLITSYMBOL)
169169
170170
171171 @Callable(i)
172172 func addBuyBondOrder (price,position) = {
173173 let pmt = extract(i.payment)
174174 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
175175 if ((MAXDISCOUNT > price))
176176 then throw("max discount is 50%")
177177 else if ((pmt.assetId != neutrinoAssetId))
178178 then throw("can use neutrino only")
179179 else if ((0 >= price))
180180 then throw("price less zero")
181181 else if ((getOrderOwner(newOrderId) != ""))
182182 then throw("order exists")
183183 else {
184184 let orders = getOrdersInOrderbook(orderbook)
185185 let nextOrderId = if ((position == 0))
186186 then ""
187187 else orders[(position - 1)]
188188 let nextOrderPrice = getOrderPrice(nextOrderId)
189189 let isNextOrderError = if (if ((nextOrderId != ""))
190190 then (price > nextOrderPrice)
191191 else false)
192192 then true
193193 else false
194194 let prevOrderId = orders[position]
195195 let prevOrderPrice = getOrderPrice(prevOrderId)
196196 let isPrevOrderError = if ((prevOrderPrice >= price))
197197 then true
198198 else false
199199 if (if (isNextOrderError)
200200 then true
201201 else isPrevOrderError)
202202 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
203203 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)])
204204 }
205205 }
206206
207207
208208
209209 @Callable(i)
210210 func cancelOrder (orderId) = {
211211 let owner = getOrderOwner(orderId)
212212 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
213213 if ((owner != toString(i.caller)))
214214 then throw("permission denied")
215215 else if ((getOrderStatus(orderId) != NEW))
216216 then throw("invalid order status")
217217 else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, neutrinoAssetId)]))
218218 }
219219
220220
221221
222222 @Callable(i)
223223 func sellBond () = {
224224 let bondBalance = assetBalance(this, bondAssetId)
225225 let deficitPositive = if ((0 >= deficit))
226226 then 0
227227 else deficit
228228 let bondAmount = if ((deficitPositive >= bondBalance))
229229 then bondBalance
230230 else deficitPositive
231231 let returnAmount = if ((deficitPositive >= bondBalance))
232232 then 0
233233 else (bondBalance - deficitPositive)
234234 if (if ((returnAmount == 0))
235235 then (bondAmount == 0)
236236 else false)
237237 then throw("without deficit")
238238 else if ((bondAmount == 0))
239239 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
240240 else if ((orderbook == ""))
241241 then throw("empty orderbook")
242242 else {
243243 let orderId = getOrdersInOrderbook(orderbook)[0]
244244 let filledTotal = getOrderFilledTotal(orderId)
245245 let orderTotal = getOrderTotal(orderId)
246246 let orderPrice = getOrderPrice(orderId)
247247 let orderOwner = getOrderOwner(orderId)
248248 let amount = convertNeutrinoToBond((((orderTotal - filledTotal) * 100) / orderPrice))
249249 let filledAmount = if ((bondAmount >= amount))
250250 then amount
251251 else bondAmount
252252 let total = (((filledAmount * orderPrice) * PAULI) / 100)
253253 let status = if ((bondAmount >= amount))
254254 then FILLED
255255 else NEW
256256 if ((total == 0))
257257 then throw("total equal zero")
258258 else ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((bondAmount >= amount))
259259 then dropOrder(orderId)
260260 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)]))
261261 }
262262 }
263263
264264

github/deemru/w8io/3ef1775 
65.84 ms