tx · 7vfb4wg6EuGYnjCRTQ6xyys5B8EeS1m1iaqCfudXCQ42

3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP:  -0.14000000 Waves

2021.07.30 11:49 [2700954] smart account 3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP > SELF 0.00000000 Waves

{ "type": 13, "id": "7vfb4wg6EuGYnjCRTQ6xyys5B8EeS1m1iaqCfudXCQ42", "fee": 14000000, "feeAssetId": null, "timestamp": 1627636289811, "version": 1, "sender": "3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP", "senderPublicKey": "5RM3w4ysmDbtgfswnVNPx7DQkNwVAG3RoxNFHgt6ToNU", "proofs": [ "28S5w3eUoN82ZSrPhPQks5XY7n1qZzmSB6WNXgsXBnBC8nnn7VyBrxHGqS76DsdgKcDvFsk4Ztiq1yyHU4BzgpZ9", "3mpyfBt8tVjXDfLdRYTh5h3LuXsBUk9hLhUWXkFaMbrEZWaco2SYUSfxKVWWwHVATAVc2kHh5Ewo4AyoDmKLtG3L", "2tVaRqW6FTY9zNBrCjcTiwQmVQEf6AxwXFUZ89tSVz3TyR5NxCrv85bgxSk5EzHZYUKVEGBP9zNhfFVAaG9Fnkya", "5jJJkNJF4JEvVQ8WH7tRQ4B2MdvLs6eAfpcHRgFCPpzjthNmWVKyrC5Y1vFe9BmE61vMoCBfkCULC6fFkq5ZSgAN" ], "script": "base64:AAIFAAAAAAAAAAkIAhIAEgMKAQgAAABFAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BwEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAAAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAABVBBVUxJAAAAAAAAD0JAAAAAAAhCSUdQQVVMSQkAATYAAAABAAAAAAAAD0JAAAAAAAhQUklDRUxFVAAAAAAAAA9CQAAAAAAETVVMVAAAAAAABfXhAAAAAAAJQklHTVVMVDE2CQABNgAAAAEAACOG8m/BAAAAAAAABlNDQUxFOAAAAAAAAAAACAAAAAAHU0NBTEUxNgAAAAAAAAAAEAAAAAANTUlOT1JERVJUT1RBTAkAAGgAAAACAAAAAAAAAAAKBQAAAAdXQVZFTEVUAAAAAAZNQVhST0kAAAAAAAAAAF8AAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAABkZJTExFRAIAAAAGZmlsbGVkAAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAADk5zYnRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAhuZXV0cmlubwAAAAANRmlyc3RPcmRlcktleQIAAAALb3JkZXJfZmlyc3QBAAAAEmdldFJvaUJ5T3JkZXJJZEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABBkZWJ1Z19vcmRlcl9yb2lfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3ByaWNlXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl90b3RhbF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfb3duZXJfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9oZWlnaHRfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9zdGF0dXNfBQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8FAAAAB29yZGVySWQBAAAAD2dldFByZXZPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9wcmV2XwUAAAAHb3JkZXJJZAEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX25leHRfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAFcHJpY2UFAAAACFBSSUNFTEVUBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQEAAAASY29udmVydEJvbmRUb1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBV3AEYqZHm+mtVmiUy++FjDCCICiaCBSWsgAAAAAPY29udHJvbENvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXI7OtElyTpMrsOf5PRtbNVk0t+xD7Y5h6AAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXGupJy/oKfsoIfyjVn5WODHtptak4kR9IAAAAAA9uZXV0cmlub0Fzc2V0SWQBAAAAILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAAAAAAtuc2J0QXNzZXRJZAEAAAAgVe7DvqoL8FDoccgbqm5wnqSxyP5KLrnB8czFaw94l0sAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAAHcmVzZXJ2ZQkAAGUAAAACCAkAA+8AAAABBQAAABBuZXV0cmlub0NvbnRyYWN0AAAAB3JlZ3VsYXIJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAADnJlc2VydmVzSW5Vc2RuCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQAAAAAObmV1dHJpbm9TdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD8AAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA/AAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAAB2RlZmljaXQJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkFAAAADnJlc2VydmVzSW5Vc2RuAAAAAA1jdXJyZW50TWF4Um9pCQAAawAAAAMFAAAAB2RlZmljaXQAAAAAAAAAAGQFAAAADm5ldXRyaW5vU3VwcGx5AAAAAA1jdXJyZW50QnJNdWx0CQAAawAAAAMFAAAADnJlc2VydmVzSW5Vc2RuBQAAAARNVUxUBQAAAA5uZXV0cmlub1N1cHBseQAAAAAKZmlyc3RPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAANRmlyc3RPcmRlcktleQAAAAANbnNidFN1cHBseU1BWAgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAALbnNidEFzc2V0SWQAAAAIcXVhbnRpdHkAAAAACm5zYnRTdXBwbHkJAABlAAAAAgUAAAANbnNidFN1cHBseU1BWAkAA/AAAAACBQAAAAR0aGlzBQAAAAtuc2J0QXNzZXRJZAEAAAANZ2V0T3JkZXJQcmljZQAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQBAAAADGdldFByZXZPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAJpZAEAAAAMZ2V0TmV4dE9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAAAmlkAQAAAA5nZXRQcmljZUZvclJvaQAAAAEAAAALcm9pUGVyY2VudHMJAABrAAAAAwkAAGQAAAACAAAAAAAAAABkBQAAAAtyb2lQZXJjZW50cwUAAAAMY3VycmVudFByaWNlAAAAAAAAAABkAQAAAA9nZXRSZXZlcnNlUHJpY2UAAAABAAAABXByaWNlCQAAaQAAAAIJAABoAAAAAgUAAAAIUFJJQ0VMRVQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQEAAAAWY2FsY05zYnQyV2F2ZXNQcmljZVJhdwAAAAIAAAANc3BlbnRXYXZlc1JhdwAAAA9yZWNlaXZlZE5zYnRSYXcJAABrAAAAAwUAAAANc3BlbnRXYXZlc1JhdwkAAGgAAAACBQAAAAVQQVVMSQUAAAAIUFJJQ0VMRVQFAAAAD3JlY2VpdmVkTnNidFJhdwEAAAAJb3JkZXJEYXRhAAAABwAAAAdvcmRlcklkAAAADXRvdGFsV2F2ZWxldHMAAAAOZmlsbGVkV2F2ZWxldHMAAAAFb3duZXIAAAAGc3RhdHVzAAAAA3JvaQAAAAVwcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAdvcmRlcklkBQAAAAVwcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABBQAAAAdvcmRlcklkBQAAAA10b3RhbFdhdmVsZXRzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAB29yZGVySWQFAAAADmZpbGxlZFdhdmVsZXRzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAAFb3duZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAAB29yZGVySWQFAAAABmhlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAZzdGF0dXMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAZZGVidWdfb3JkZXJfY3VycmVudFByaWNlXwUAAAAHb3JkZXJJZAUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASZ2V0Um9pQnlPcmRlcklkS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAADcm9pBQAA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zAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJOc2J0MldhdmVzIHByaWNlIGV4Y2VlZHMgTUFYX0lOVDogCQABpAAAAAEFAAAACHdhdmVzUGF5AgAAAAEvCQABpAAAAAEFAAAACm5zYnRBbW91bnQEAAAAEm5zYnQyV2F2ZXNQcmljZVJhdwkBAAAAFmNhbGNOc2J0MldhdmVzUHJpY2VSYXcAAAACBQAAAAh3YXZlc1BheQUAAAAKbnNidEFtb3VudAQAAAADcm9pAAAAAAAAAAAABAAAAAxhbW91bnRMZWFzZWQJAAP8AAAABAUAAAAQbmV1dHJpbm9Db250cmFjdAIAAAALYWNjZXB0V2F2ZXMFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAADGFtb3VudExlYXNlZAUAAAAMYW1vdW50TGVhc2VkCQAFFAAAAAIJAAROAAAAAgkBAAAACW9yZGVyRGF0YQAAAAcJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAJcG10QW1vdW50BQAAAAlwbXRBbW91bnQJAAQlAAAAAQUAAAAMb3duZXJBZGRyZXNzBQAAAAZGSUxMRUQFAAAAA3JvaQUAAAASbnNidDJXYXZlc1ByaWNlUmF3CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADG93bmVyQWRkcmVzcwUAAAAKbnNidEFtb3VudAUAAAALbnNidEFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAARZGVidWdfY3VydmVSZXN1bHQJAQAAAAV0b1N0cgAAAAICAAAAC2N1cnZlUmVzdWx0BQAAAAtjdXJ2ZVJlc3VsdAUAAAADbmlsBQAAAApuc2J0QW1vdW50CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAtjYW5jZWxPcmRlcgAAAAEAAAAHb3JkZXJJZAQAAAAFb3duZXIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAQAAAAGYW1vdW50CQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAAZjYWxsZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAluZXh0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAAdvcmRlcklkBAAAAAlwcmV2T3JkZXIJAQAAAAxnZXRQcmV2T3JkZXIAAAABBQAAAAdvcmRlcklkAwkBAAAAAiE9AAAAAgkBAAAADmdldE9yZGVyU3RhdHVzAAAAAQUAAAAHb3JkZXJJZAUAAAADTkVXCQAAAgAAAAECAAAAFGludmFsaWQgb3JkZXIgc3RhdHVzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkDCQAAAAAAAAIFAAAACmZpcnN0T3JkZXIFAAAAB29yZGVySWQFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAJcHJldk9yZGVyBQAAAAluZXh0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAACENBTkNFTEVECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAR1bml0BQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABBwdWJLZXlBZG1pbnNMaXN0CQAETAAAAAICAAAALEdKZExTYUxpdjVLN3h1ZWphYzhtY1JjSG95bzNkUHJFU3J2a3RHM2E2TUFSCQAETAAAAAICAAAALEZXVmZmWXIyQUxtSE1lalptM1dxZUx6NlNkeW0zZ0xGR3RKbjRLVHd5VTV4CQAETAAAAAICAAAALDNXaDJMYVdjYjVnZzdLMnBQY1czRXA2RUF1UkJ6WWtBZ3JkcHQ0M2pUREZhCQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwEAAAABWNvdW50CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAADAAAAAAAAAAACAAAAAAAAAAAACQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAADviLvvQ==", "chainId": 87, "height": 2700954, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C7rToQQXBRwXA38nMpBW6m6Y8k3VgcqgtsZ8353SrM8 Next: 8ga51ACCKUagMQNTF8swRa1E9LBwKS6319nmWeEu5AbD Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
2020
2121 let PAULI = 1000000
2222
23-let PAULISCALE = 6
23+let BIGPAULI = toBigInt(1000000)
2424
2525 let PRICELET = 1000000
2626
2727 let MULT = 100000000
2828
29-let MULTSCALE = 8
29+let BIGMULT16 = toBigInt(10000000000000000)
30+
31+let SCALE8 = 8
32+
33+let SCALE16 = 16
3034
3135 let MINORDERTOTAL = (10 * WAVELET)
3236
158162 func orderData (orderId,totalWavelets,filledWavelets,owner,status,roi,price) = [IntegerEntry(getOrderPriceKey(orderId), price), IntegerEntry(getOrderTotalKey(orderId), totalWavelets), IntegerEntry(getOrderFilledTotalKey(orderId), filledWavelets), StringEntry(getOrderOwnerKey(orderId), owner), IntegerEntry(getOrderHeightKey(orderId), height), StringEntry(getOrderStatusKey(orderId), status), IntegerEntry(("debug_order_currentPrice_" + orderId), currentPrice), IntegerEntry(getRoiByOrderIdKey(orderId), roi)]
159163
160164
161-let IdxA = 0
162-
163-let IdxPaulB = 1
164-
165-let IdxWResAsUsdn = 2
166-
167-let IdxMultBR = 3
168-
169-let IdxMultPower = 4
170-
171-let IdxMultExpInPower = 5
172-
173-let IdxMultK = 6
174-
175165 func calculateK (wRaw,uRaw,price,mRaw,sRaw) = {
176- let EXP = 271828100
166+ let EXP = toBigInt(2718281)
167+ let EXPSCALE = 6
177168 let a = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
178169 let paulB = valueOrElse(getInteger(this, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
179170 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
180171 let multBR = fraction(wReservesInUsdn, MULT, uRaw)
181- let multPower = (a * (multBR - (1 * MULT)))
182- let multExpInPower = pow(EXP, MULTSCALE, multPower, MULTSCALE, MULTSCALE, DOWN)
183- let multK = fraction(paulB, multExpInPower, PAULI)
184-[a, paulB, wReservesInUsdn, multBR, multPower, multExpInPower, multK]
172+ if ((multBR > 10678564816))
173+ then throw("BR > 10678.564816% will overflow exponent")
174+ else {
175+ let multPower = (a * (multBR - MULT))
176+ let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), SCALE8, SCALE16, DOWN)
177+ let multK = fraction(toBigInt(paulB), multExpInPower, BIGPAULI)
178+ $Tuple7(a, paulB, wReservesInUsdn, multBR, multPower, multExpInPower, multK)
179+ }
185180 }
186181
187182
188183 func curveFunction (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
189184 let kCalcArray = calculateK(wRaw, uRaw, price, mRaw, sRaw)
190- let multK = kCalcArray[IdxMultK]
185+ let multK = kCalcArray._7
191186 let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
192- let multStepM1 = fraction(multK, mRaw, PAULI)
193- let multStep2 = fraction(multStepM1, PAULI, (mRaw - sRaw))
194- let multStepM3 = (fraction(usdnPay, MULT, PAULI) + fraction(multStep2, mRaw, PAULI))
195- let multStep4 = fraction(multStepM1, MULT, multStepM3)
196- let stepM5 = fraction(multStep4, mRaw, MULT)
197- let nsbtAmountRaw = ((mRaw - sRaw) - stepM5)
198-[nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, kCalcArray[IdxA], kCalcArray[IdxPaulB], kCalcArray[IdxWResAsUsdn], price, kCalcArray[IdxMultBR], kCalcArray[IdxMultPower], kCalcArray[IdxMultExpInPower], multK, multStepM1, multStep2, multStepM3, multStep4, stepM5]
187+ let bigMaxNsbtSupply = toBigInt(mRaw)
188+ let bigNsbtSupply = toBigInt((mRaw - sRaw))
189+ let step1 = fraction(toBigInt(usdnPay), BIGMULT16, multK)
190+ let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
191+ let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
192+ let nsbtAmountRaw = ((mRaw - sRaw) - step3)
193+ $Tuple17(nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, kCalcArray._1, kCalcArray._2, kCalcArray._3, price, kCalcArray._4, kCalcArray._5, kCalcArray._6, multK, step1, step2, step3)
199194 }
200195
201196
202-func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(curveResult[0])) + " usdnPayment=") + toString(curveResult[1])) + " wRaw=") + toString(curveResult[2])) + " uRaw=") + toString(curveResult[3])) + " mRaw=") + toString(curveResult[4])) + " sRaw=") + toString(curveResult[5])) + " nsbtCurveParam_a=") + toString(curveResult[6])) + " nsbtCurveParam_b=") + toString(curveResult[7])) + " wReservesInUsdn=") + toString(curveResult[8])) + " price=") + toString(curveResult[9])) + " multBR=") + toString(curveResult[10])) + " multPower=") + toString(curveResult[11])) + " multExpInPower=") + toString(curveResult[12])) + " multK=") + toString(curveResult[13])) + " multStepM1=") + toString(curveResult[14])) + " multStep2=") + toString(curveResult[15])) + " multStepM3=") + toString(curveResult[16])) + " multStep4=") + toString(curveResult[17])) + " stepM5=") + toString(curveResult[18])) + "]")
197+func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(curveResult._1)) + " usdnPayment=") + toString(curveResult._2)) + " wRaw=") + toString(curveResult._3)) + " uRaw=") + toString(curveResult._4)) + " mRaw=") + toString(curveResult._5)) + " sRaw=") + toString(curveResult._6)) + " nsbtCurveParam_a=") + toString(curveResult._7)) + " nsbtCurveParam_b=") + toString(curveResult._8)) + " wReservesInUsdn=") + toString(curveResult._9)) + " price=") + toString(curveResult._10)) + " multBR=") + toString(curveResult._11)) + " multPower=") + toString(curveResult._12)) + " multExpInPower=") + toString(curveResult._13)) + " multK=") + toString(curveResult._14)) + " step1=") + toString(curveResult._15)) + " step2=") + toString(curveResult._16)) + " step3=") + toString(curveResult._17)) + "]")
203198
204199
205200 @Callable(i)
216211 then throw("min 10 waves expected")
217212 else {
218213 let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtSupplyMAX, nsbtSupply, wavesPay)
219- let nsbtAmount = curveResult[0]
214+ let nsbtAmount = curveResult._1
220215 if ((0 >= nsbtAmount))
221216 then throw("nsbtAmount <= 0")
222- else {
223- let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
224- let roi = 0
225- (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), ScriptTransfer(neutrinoContract, wavesPay, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult))])
226- }
217+ else if ((wavesPay > (nsbtAmount * 9223372)))
218+ then throw(((("Nsbt2Waves price exceeds MAX_INT: " + toString(wavesPay)) + "/") + toString(nsbtAmount)))
219+ else {
220+ let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
221+ let roi = 0
222+ let amountLeased = invoke(neutrinoContract, "acceptWaves", nil, i.payments)
223+ if ((amountLeased == amountLeased))
224+ then $Tuple2((orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), StringEntry("debug_curveResult", toStr("curveResult", curveResult))]), nsbtAmount)
225+ else throw("Strict value is not equal to itself.")
226+ }
227227 }
228228 }
229229
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
55
66
77 func getStringByKey (key) = valueOrElse(getString(this, key), "")
88
99
1010 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
1111
1212
1313 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
1414
1515
1616 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1717
1818
1919 let WAVELET = 100000000
2020
2121 let PAULI = 1000000
2222
23-let PAULISCALE = 6
23+let BIGPAULI = toBigInt(1000000)
2424
2525 let PRICELET = 1000000
2626
2727 let MULT = 100000000
2828
29-let MULTSCALE = 8
29+let BIGMULT16 = toBigInt(10000000000000000)
30+
31+let SCALE8 = 8
32+
33+let SCALE16 = 16
3034
3135 let MINORDERTOTAL = (10 * WAVELET)
3236
3337 let MAXROI = 95
3438
3539 let CANCELED = "canceled"
3640
3741 let NEW = "new"
3842
3943 let FILLED = "filled"
4044
4145 let PriceKey = "price"
4246
4347 let NsbtAssetIdKey = "bond_asset_id"
4448
4549 let NeutrinoAssetIdKey = "neutrino_asset_id"
4650
4751 let BalanceLockedkKey = "balance_lock_"
4852
4953 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
5054
5155 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
5256
5357 let FirstOrderKey = "order_first"
5458
5559 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
5660
5761
5862 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
5963
6064
6165 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
6266
6367
6468 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
6569
6670
6771 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
6872
6973
7074 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
7175
7276
7377 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
7478
7579
7680 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
7781
7882
7983 func getNextOrderKey (orderId) = ("order_next_" + orderId)
8084
8185
8286 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
8387
8488
8589 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
8690
8791
8892 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
8993
9094
9195 func convertBondToWaves (amount,price) = convertNeutrinoToWaves(amount, price)
9296
9397
9498 let neutrinoContract = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo')
9599
96100 let controlContract = Address(base58'3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP')
97101
98102 let liquidationContract = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7')
99103
100104 let neutrinoAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
101105
102106 let nsbtAssetId = base58'6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g'
103107
104108 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
105109
106110 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
107111
108112 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
109113
110114 let reserve = (wavesBalance(neutrinoContract).regular - getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey))
111115
112116 let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
113117
114118 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
115119
116120 let deficit = (neutrinoSupply - reservesInUsdn)
117121
118122 let currentMaxRoi = fraction(deficit, 100, neutrinoSupply)
119123
120124 let currentBrMult = fraction(reservesInUsdn, MULT, neutrinoSupply)
121125
122126 let firstOrder = getStringByKey(FirstOrderKey)
123127
124128 let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
125129
126130 let nsbtSupply = (nsbtSupplyMAX - assetBalance(this, nsbtAssetId))
127131
128132 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
129133
130134
131135 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
132136
133137
134138 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
135139
136140
137141 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
138142
139143
140144 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
141145
142146
143147 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
144148
145149
146150 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
147151
148152
149153 func getPriceForRoi (roiPercents) = fraction((100 + roiPercents), currentPrice, 100)
150154
151155
152156 func getReversePrice (price) = ((PRICELET * PRICELET) / price)
153157
154158
155159 func calcNsbt2WavesPriceRaw (spentWavesRaw,receivedNsbtRaw) = fraction(spentWavesRaw, (PAULI * PRICELET), receivedNsbtRaw)
156160
157161
158162 func orderData (orderId,totalWavelets,filledWavelets,owner,status,roi,price) = [IntegerEntry(getOrderPriceKey(orderId), price), IntegerEntry(getOrderTotalKey(orderId), totalWavelets), IntegerEntry(getOrderFilledTotalKey(orderId), filledWavelets), StringEntry(getOrderOwnerKey(orderId), owner), IntegerEntry(getOrderHeightKey(orderId), height), StringEntry(getOrderStatusKey(orderId), status), IntegerEntry(("debug_order_currentPrice_" + orderId), currentPrice), IntegerEntry(getRoiByOrderIdKey(orderId), roi)]
159163
160164
161-let IdxA = 0
162-
163-let IdxPaulB = 1
164-
165-let IdxWResAsUsdn = 2
166-
167-let IdxMultBR = 3
168-
169-let IdxMultPower = 4
170-
171-let IdxMultExpInPower = 5
172-
173-let IdxMultK = 6
174-
175165 func calculateK (wRaw,uRaw,price,mRaw,sRaw) = {
176- let EXP = 271828100
166+ let EXP = toBigInt(2718281)
167+ let EXPSCALE = 6
177168 let a = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
178169 let paulB = valueOrElse(getInteger(this, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
179170 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
180171 let multBR = fraction(wReservesInUsdn, MULT, uRaw)
181- let multPower = (a * (multBR - (1 * MULT)))
182- let multExpInPower = pow(EXP, MULTSCALE, multPower, MULTSCALE, MULTSCALE, DOWN)
183- let multK = fraction(paulB, multExpInPower, PAULI)
184-[a, paulB, wReservesInUsdn, multBR, multPower, multExpInPower, multK]
172+ if ((multBR > 10678564816))
173+ then throw("BR > 10678.564816% will overflow exponent")
174+ else {
175+ let multPower = (a * (multBR - MULT))
176+ let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), SCALE8, SCALE16, DOWN)
177+ let multK = fraction(toBigInt(paulB), multExpInPower, BIGPAULI)
178+ $Tuple7(a, paulB, wReservesInUsdn, multBR, multPower, multExpInPower, multK)
179+ }
185180 }
186181
187182
188183 func curveFunction (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
189184 let kCalcArray = calculateK(wRaw, uRaw, price, mRaw, sRaw)
190- let multK = kCalcArray[IdxMultK]
185+ let multK = kCalcArray._7
191186 let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
192- let multStepM1 = fraction(multK, mRaw, PAULI)
193- let multStep2 = fraction(multStepM1, PAULI, (mRaw - sRaw))
194- let multStepM3 = (fraction(usdnPay, MULT, PAULI) + fraction(multStep2, mRaw, PAULI))
195- let multStep4 = fraction(multStepM1, MULT, multStepM3)
196- let stepM5 = fraction(multStep4, mRaw, MULT)
197- let nsbtAmountRaw = ((mRaw - sRaw) - stepM5)
198-[nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, kCalcArray[IdxA], kCalcArray[IdxPaulB], kCalcArray[IdxWResAsUsdn], price, kCalcArray[IdxMultBR], kCalcArray[IdxMultPower], kCalcArray[IdxMultExpInPower], multK, multStepM1, multStep2, multStepM3, multStep4, stepM5]
187+ let bigMaxNsbtSupply = toBigInt(mRaw)
188+ let bigNsbtSupply = toBigInt((mRaw - sRaw))
189+ let step1 = fraction(toBigInt(usdnPay), BIGMULT16, multK)
190+ let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
191+ let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
192+ let nsbtAmountRaw = ((mRaw - sRaw) - step3)
193+ $Tuple17(nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, kCalcArray._1, kCalcArray._2, kCalcArray._3, price, kCalcArray._4, kCalcArray._5, kCalcArray._6, multK, step1, step2, step3)
199194 }
200195
201196
202-func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(curveResult[0])) + " usdnPayment=") + toString(curveResult[1])) + " wRaw=") + toString(curveResult[2])) + " uRaw=") + toString(curveResult[3])) + " mRaw=") + toString(curveResult[4])) + " sRaw=") + toString(curveResult[5])) + " nsbtCurveParam_a=") + toString(curveResult[6])) + " nsbtCurveParam_b=") + toString(curveResult[7])) + " wReservesInUsdn=") + toString(curveResult[8])) + " price=") + toString(curveResult[9])) + " multBR=") + toString(curveResult[10])) + " multPower=") + toString(curveResult[11])) + " multExpInPower=") + toString(curveResult[12])) + " multK=") + toString(curveResult[13])) + " multStepM1=") + toString(curveResult[14])) + " multStep2=") + toString(curveResult[15])) + " multStepM3=") + toString(curveResult[16])) + " multStep4=") + toString(curveResult[17])) + " stepM5=") + toString(curveResult[18])) + "]")
197+func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(curveResult._1)) + " usdnPayment=") + toString(curveResult._2)) + " wRaw=") + toString(curveResult._3)) + " uRaw=") + toString(curveResult._4)) + " mRaw=") + toString(curveResult._5)) + " sRaw=") + toString(curveResult._6)) + " nsbtCurveParam_a=") + toString(curveResult._7)) + " nsbtCurveParam_b=") + toString(curveResult._8)) + " wReservesInUsdn=") + toString(curveResult._9)) + " price=") + toString(curveResult._10)) + " multBR=") + toString(curveResult._11)) + " multPower=") + toString(curveResult._12)) + " multExpInPower=") + toString(curveResult._13)) + " multK=") + toString(curveResult._14)) + " step1=") + toString(curveResult._15)) + " step2=") + toString(curveResult._16)) + " step3=") + toString(curveResult._17)) + "]")
203198
204199
205200 @Callable(i)
206201 func buyNsbt () = {
207202 let pmt = value(i.payments[0])
208203 let pmtAmount = pmt.amount
209204 let wavesPay = pmtAmount
210205 let ownerAddress = i.caller
211206 if (isBlocked)
212207 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
213208 else if (isDefined(pmt.assetId))
214209 then throw("can use waves only")
215210 else if (((10 * WAVELET) > pmtAmount))
216211 then throw("min 10 waves expected")
217212 else {
218213 let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtSupplyMAX, nsbtSupply, wavesPay)
219- let nsbtAmount = curveResult[0]
214+ let nsbtAmount = curveResult._1
220215 if ((0 >= nsbtAmount))
221216 then throw("nsbtAmount <= 0")
222- else {
223- let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
224- let roi = 0
225- (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), ScriptTransfer(neutrinoContract, wavesPay, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult))])
226- }
217+ else if ((wavesPay > (nsbtAmount * 9223372)))
218+ then throw(((("Nsbt2Waves price exceeds MAX_INT: " + toString(wavesPay)) + "/") + toString(nsbtAmount)))
219+ else {
220+ let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
221+ let roi = 0
222+ let amountLeased = invoke(neutrinoContract, "acceptWaves", nil, i.payments)
223+ if ((amountLeased == amountLeased))
224+ then $Tuple2((orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), StringEntry("debug_curveResult", toStr("curveResult", curveResult))]), nsbtAmount)
225+ else throw("Strict value is not equal to itself.")
226+ }
227227 }
228228 }
229229
230230
231231
232232 @Callable(i)
233233 func cancelOrder (orderId) = {
234234 let owner = getOrderOwner(orderId)
235235 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
236236 let caller = toString(i.caller)
237237 let nextOrder = getNextOrder(orderId)
238238 let prevOrder = getPrevOrder(orderId)
239239 if ((getOrderStatus(orderId) != NEW))
240240 then throw("invalid order status")
241241 else [StringEntry(FirstOrderKey, if ((firstOrder == orderId))
242242 then nextOrder
243243 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, unit)]
244244 }
245245
246246
247247 @Verifier(tx)
248248 func verify () = {
249249 let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
250250 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
251251 then 1
252252 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
253253 then 1
254254 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
255255 then 1
256256 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
257257 then 2
258258 else 0))
259259 (count >= 3)
260260 }
261261

github/deemru/w8io/3ef1775 
78.31 ms