tx · DhMtx3H2y2LAeqHiaVwHyApA3YZLUWeZKymVZ6hsYW3a

3MxbR7b3gHF4XdQKNTT5aQMRiazHvrVWC8N:  -0.02000000 Waves

2021.01.13 16:51 [1351766] smart account 3MxbR7b3gHF4XdQKNTT5aQMRiazHvrVWC8N > SELF 0.00000000 Waves

{ "type": 13, "id": "DhMtx3H2y2LAeqHiaVwHyApA3YZLUWeZKymVZ6hsYW3a", "fee": 2000000, "feeAssetId": null, "timestamp": 1610545926887, "version": 1, "sender": "3MxbR7b3gHF4XdQKNTT5aQMRiazHvrVWC8N", "senderPublicKey": "4bj7YXaphTC4Ldx7DqqMmrTjNshRtw1yNsej2XXZcAzS", "proofs": [ "44hu84Gjnmo1u1ajWq6vaGhM6iTT73mtAAEaqGsamUb6AoVJXjQ5W7w4CQKJ4LujXvtZiH7n29MUZnSUqTiotXkS", "27bytvuNbBAMxCErnJiCJFpQk1qbX5x4QBfSpGUYmy4vNoSW9F9NU3sYG5DakYmHUDnViQS6bQzCPgFBYsx5viQd", "3aUXfHni2PuB5rabaSbXaEdYz9t4iQCYEv8ogNRKr4qxfZBqRsK5M39wFyqTMxs6JrfCoCy6mAKCA5TU1odirMeV" ], "script": "base64:AAIEAAAAAAAAABYIAhIAEgMKAQESBAoCAQgSAwoBCBIAAAAAQwEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQcBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AgAAAAABAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AAAAAAAAAAAAAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAAAVQQVVMSQAAAAAAAA9CQAAAAAAKUEFVTElTQ0FMRQAAAAAAAAAABgAAAAAIUFJJQ0VMRVQAAAAAAAAPQkAAAAAABE1VTFQAAAAAAAX14QAAAAAACU1VTFRTQ0FMRQAAAAAAAAAACAAAAAANTUlOT1JERVJUT1RBTAkAAGgAAAACAAAAAAAAAAAKBQAAAAdXQVZFTEVUAAAAAAZNQVhST0kAAAAAAAAAAF8AAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAABkZJTExFRAIAAAAGZmlsbGVkAAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAhuZXV0cmlubwAAAAANRmlyc3RPcmRlcktleQIAAAALb3JkZXJfZmlyc3QBAAAAEmdldFJvaUJ5T3JkZXJJZEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABBkZWJ1Z19vcmRlcl9yb2lfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3ByaWNlXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl90b3RhbF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfb3duZXJfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9oZWlnaHRfBQAAAAdvcmRlcklkAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAA1vcmRlcl9zdGF0dXNfBQAAAAdvcmRlcklkAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAE29yZGVyX2ZpbGxlZF90b3RhbF8FAAAAB29yZGVySWQBAAAAD2dldFByZXZPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9wcmV2XwUAAAAHb3JkZXJJZAEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAAC29yZGVyX25leHRfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQUAAAAHV0FWRUxFVAUAAAAFUEFVTEkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACAAAABmFtb3VudAAAAAVwcmljZQkAAGsAAAADCQAAawAAAAMFAAAABmFtb3VudAUAAAAFcHJpY2UFAAAACFBSSUNFTEVUBQAAAAVQQVVMSQUAAAAHV0FWRUxFVAEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQEAAAASY29udmVydEJvbmRUb1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVHU7b6OlcTCIdohGSL8/NKL5nwWXL+YZyQAAAAAPY29udHJvbENvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUno2OAJeUn0PSjRqULfZsUfTQiLeRVcFDAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUrh+60NLfu2FBMSeZ0mudJuV2fLRxw6pzAAAAAA9uZXV0cmlub0Fzc2V0SWQBAAAAIA/yHBKs5MQ8muxGGqslqLDsugcrRsxtiHLwteKSSQG0AAAAAAtib25kQXNzZXRJZAEAAAAgmJo/x0eBXqqYBUsDVec3bkdYTgn3lisjb3dBcLTJiUgAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAAHcmVzZXJ2ZQkAAGUAAAACCAkAA+8AAAABBQAAABBuZXV0cmlub0NvbnRyYWN0AAAAB3JlZ3VsYXIJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAADnJlc2VydmVzSW5Vc2RuCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQAAAAAObmV1dHJpbm9TdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD8AAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA/AAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAAB2RlZmljaXQJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkFAAAADnJlc2VydmVzSW5Vc2RuAAAAAA1jdXJyZW50TWF4Um9pCQAAawAAAAMFAAAAB2RlZmljaXQAAAAAAAAAAGQFAAAADm5ldXRyaW5vU3VwcGx5AAAAAA1jdXJyZW50QnJNdWx0CQAAawAAAAMFAAAADnJlc2VydmVzSW5Vc2RuBQAAAARNVUxUBQAAAA5uZXV0cmlub1N1cHBseQAAAAAKZmlyc3RPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAANRmlyc3RPcmRlcktleQEAAAANZ2V0T3JkZXJQcmljZQAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQBAAAADGdldFByZXZPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAJpZAEAAAAMZ2V0TmV4dE9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAAAmlkAQAAAA5nZXRQcmljZUZvclJvaQAAAAEAAAALcm9pUGVyY2VudHMJAABrAAAAAwkAAGQAAAACAAAAAAAAAABkBQAAAAtyb2lQZXJjZW50cwUAAAAMY3VycmVudFByaWNlAAAAAAAAAABkAQAAAA9nZXRSZXZlcnNlUHJpY2UAAAABAAAABXByaWNlCQAAaQAAAAIJAABoAAAAAgUAAAAIUFJJQ0VMRVQFAAAACFBSSUNFTEVUBQAAAAVwcmljZQEAAAAWY2FsY05zYnQyV2F2ZXNQcmljZVJhdwAAAAIAAAANc3BlbnRXYXZlc1JhdwAAAA9yZWNlaXZlZE5zYnRSYXcJAABrAAAAAwUAAAANc3BlbnRXYXZlc1JhdwkAAGgAAAACBQAAAAVQQVVMSQUAAAAIUFJJQ0VMRVQFAAAAD3JlY2VpdmVkTnNidFJhdwEAAAAJb3JkZXJEYXRhAAAABwAAAAdvcmRlcklkAAAADXRvdGFsV2F2ZWxldHMAAAAOZmlsbGVkV2F2ZWxldHMAAAAFb3duZXIAAAAGc3RhdHVzAAAAA3JvaQAAAAVwcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABBQAAAAdvcmRlcklkBQAAAAVwcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABBQAAAAdvcmRlcklkBQAAAA10b3RhbFdhdmVsZXRzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAB29yZGVySWQFAAAADmZpbGxlZFdhdmVsZXRzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAAFb3duZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRPcmRlckhlaWdodEtleQAAAAEFAAAAB29yZGVySWQFAAAABmhlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAZzdGF0dXMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAZZGVidWdfb3JkZXJfY3VycmVudFByaWNlXwUAAAAHb3JkZXJJZAUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASZ2V0Um9pQnlPcmRlcklkS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAADcm9pBQAAAANuaWwBAAAAEGludGVybmFsU2VsbEJvbmQAAAAIAAAAC3BGaXJzdE9yZGVyAAAACnBOZXh0T3JkZXIAAAAMcEZpbGxlZFRvdGFsAAAABHBSb2kAAAAGcFByaWNlAAAAEHBQYXltZW50V2F2ZWxldHMAAAARb3JkZXJPd25lckFkZHJlc3MAAAAMaW5zdGFudE9yZGVyBAAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMJAQAAAA5nZXRQcmljZUZvclJvaQAAAAEFAAAABHBSb2kEAAAADXJlbWFpbmVkVG90YWwJAABlAAAAAgUAAAAQcFBheW1lbnRXYXZlbGV0cwUAAAAMcEZpbGxlZFRvdGFsBAAAABNmaWxsYWJsZU9yZGVyQW1vdW50CQEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgUAAAANcmVtYWluZWRUb3RhbAUAAAAVcHJpY2VXYXZlc0J5Qm9uZENlbnRzBAAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQJAQAAABJjb252ZXJ0Qm9uZFRvV2F2ZXMAAAACBQAAABNmaWxsYWJsZU9yZGVyQW1vdW50BQAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMEAAAAFW5iVG9rZW5zU2VsbENvbmRpdGlvbgkAAGcAAAACBQAAAA1jdXJyZW50TWF4Um9pBQAAAARwUm9pAwkBAAAAASEAAAABBQAAABVuYlRva2Vuc1NlbGxDb25kaXRpb24JAAACAAAAAQkAASwAAAACAgAAABNpbm5hcHJvcHJpYXRlIHJvaTogCQABpAAAAAEFAAAABHBSb2kDCQAAAAAAAAIFAAAAG3RvdGFsT3JkZXJXYXZlbGV0ZXNSZXF1aXJlZAAAAAAAAAAAAAkAAAIAAAABAgAAAB9jYW5ub3QgZmlsbCBvcmRlciBhdCB0aGUgbW9tZW50BAAAAA5jaGFuZ2VXYXZlbGV0cwkAAGUAAAACBQAAAA1yZW1haW5lZFRvdGFsBQAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQEAAAADHdyaXRlU2V0RGF0YQMFAAAADGluc3RhbnRPcmRlcgkBAAAACW9yZGVyRGF0YQAAAAcFAAAAC3BGaXJzdE9yZGVyBQAAABBwUGF5bWVudFdhdmVsZXRzCQAAZAAAAAIFAAAADHBGaWxsZWRUb3RhbAUAAAAbdG90YWxPcmRlcldhdmVsZXRlc1JlcXVpcmVkCQACWAAAAAEIBQAAABFvcmRlck93bmVyQWRkcmVzcwAAAAVieXRlcwUAAAAGRklMTEVEBQAAAARwUm9pBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAALcEZpcnN0T3JkZXIJAABkAAAAAgUAAAAMcEZpbGxlZFRvdGFsBQAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAALcEZpcnN0T3JkZXIFAAAABkZJTExFRAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0UHJldk9yZGVyS2V5AAAAAQUAAAAKcE5leHRPcmRlcgIAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADUZpcnN0T3JkZXJLZXkFAAAACnBOZXh0T3JkZXIFAAAAA25pbAkABE4AAAACBQAAAAx3cml0ZVNldERhdGEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAARb3JkZXJPd25lckFkZHJlc3MFAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQFAAAAC2JvbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAG3RvdGFsT3JkZXJXYXZlbGV0ZXNSZXF1aXJlZAUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABFvcmRlck93bmVyQWRkcmVzcwUAAAAOY2hhbmdlV2F2ZWxldHMFAAAABHVuaXQFAAAAA25pbAEAAAAXaW50ZXJuYWxBZGRCdXlCb25kT3JkZXIAAAAFAAAAA3JvaQAAAAVwcmljZQAAAAlwcmV2T3JkZXIAAAADaW52AAAADGluc3RhbnRPcmRlcgQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAANpbnYAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACm5ld09yZGVySWQJAAJYAAAAAQgFAAAAA2ludgAAAA10cmFuc2FjdGlvbklkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkAAGYAAAACBQAAAA1NSU5PUkRFUlRPVEFMCAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAF21pbiBvcmRlciB0b3RhbCBlcXVhbHMgCQABpAAAAAEFAAAADU1JTk9SREVSVE9UQUwDCQAAZgAAAAIFAAAAA3JvaQUAAAAGTUFYUk9JCQAAAgAAAAECAAAAF21heCBzZXRPcmRlciBST0kgaXMgOTUlAwkAAGYAAAACAAAAAAAAAAAABQAAAANyb2kJAAACAAAAAQIAAAAjY2FuJ3QgcGxhY2Ugb3JkZXIgd2l0aCBuZWdhdGl2ZSByb2kDCQAAAAAAAAIFAAAAA3JvaQAAAAAAAAAAAAkAAAIAAAABAgAAABxyb2kgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byAwAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAABJjYW4gdXNlIHdhdmVzIG9ubHkDCQEAAAACIT0AAAACCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAACm5ld09yZGVySWQCAAAAAAkAAAIAAAABAgAAAAxvcmRlciBleGlzdHMDAwkBAAAAAiE9AAAAAgUAAAAJcHJldk9yZGVyAgAAAAAJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAACXByZXZPcmRlcgUAAAADTkVXBwkAAAIAAAABAgAAABxwcmV2IG9yZGVyIHN0YXR1cyBpcyBub3QgbmV3BAAAABlpc05ld09yZGVyQXRGaXJzdFBvc2l0aW9uCQAAAAAAAAIFAAAACXByZXZPcmRlcgIAAAAABAAAAAVvd25lcgkABCUAAAABCAUAAAADaW52AAAABmNhbGxlcgQAAAAJbmV4dE9yZGVyAwUAAAAZaXNOZXdPcmRlckF0Rmlyc3RQb3NpdGlvbgUAAAAKZmlyc3RPcmRlcgkBAAAADGdldE5leHRPcmRlcgAAAAEFAAAACXByZXZPcmRlcgQAAAAMbmV4dE9yZGVyUm9pCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAASZ2V0Um9pQnlPcmRlcklkS2V5AAAAAQUAAAAJbmV4dE9yZGVyBAAAABBpc05leHRPcmRlckVycm9yAwMJAQAAAAIhPQAAAAIFAAAACW5leHRPcmRlcgIAAAAACQAAZwAAAAIFAAAAA3JvaQUAAAAMbmV4dE9yZGVyUm9pBwYHBAAAAAxwcmV2T3JkZXJSb2kJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABBQAAAAlwcmV2T3JkZXIEAAAAEGlzUHJldk9yZGVyRXJyb3IDAwkBAAAAAiE9AAAAAgUAAAAJcHJldk9yZGVyAgAAAAAJAABmAAAAAgUAAAAMcHJldk9yZGVyUm9pBQAAAANyb2kHBgcDAwUAAAAQaXNOZXh0T3JkZXJFcnJvcgYFAAAAEGlzUHJldk9yZGVyRXJyb3IJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAfaW52YWxpZCBvcmRlciBpc1ByZXZPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc1ByZXZPcmRlckVycm9yAgAAABIgaXNOZXh0T3JkZXJFcnJvcjoJAAGlAAAAAQUAAAAQaXNOZXh0T3JkZXJFcnJvcgMDBQAAABlpc05ld09yZGVyQXRGaXJzdFBvc2l0aW9uCQAAZwAAAAIFAAAADWN1cnJlbnRNYXhSb2kFAAAAA3JvaQcJAQAAABBpbnRlcm5hbFNlbGxCb25kAAAACAUAAAAKbmV3T3JkZXJJZAUAAAAJbmV4dE9yZGVyAAAAAAAAAAAABQAAAANyb2kFAAAABXByaWNlCAUAAAADcG10AAAABmFtb3VudAgFAAAAA2ludgAAAAZjYWxsZXIGAwUAAAAMaW5zdGFudE9yZGVyCQAAAgAAAAECAAAAMkluc3RhbnQgb3JkZXIgY291bGRuJ3QgYmUgYWRkZWQgaW50byB3YWl0aW5nIHF1ZXVlCQAETgAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACm5ld09yZGVySWQFAAAACXByZXZPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAJbmV4dE9yZGVy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CWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxhZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxzZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxkZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxmZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxnZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxoZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxqZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxrZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACxyZEx3NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACx0ZExxNUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACx0ZEx5NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACx0ZEx1NUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACx0ZExoNUpLZHBxZlNFcXZtRkp2Y2hlam9yQWt6ZDRCcldMdm9Gd3ZNR3U1awcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAPuAAAAAQkAAlkAAAABAgAAACsxZEw0SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDJkTDI1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDNkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDRkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDVkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDZkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDdkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDhkTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDkxTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDkyTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDkzTDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+4AAAABCQACWQAAAAECAAAALDk0TDk1SktkcHFmU0Vxdm1GSnZjaGVqb3JBa3pkNEJyV0x2b0Z3dk1HdTVrBwAAAAUAAAABaQEAAAAQYnV5TnNidEluU3VycGx1cwAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAId2F2ZXNQYXkFAAAACXBtdEFtb3VudAQAAAAMb3duZXJBZGRyZXNzCAUAAAABaQAAAAZjYWxsZXIDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABZY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQAAAgAAAAECAAAAEmNhbiB1c2Ugd2F2ZXMgb25seQMJAABmAAAAAgkAAGgAAAACAAAAAAAAAAAKBQAAAAdXQVZFTEVUBQAAAAlwbXRBbW91bnQJAAACAAAAAQIAAAAVbWluIDEwIHdhdmVzIGV4cGVjdGVkBAAAAAppc3N1ZWROc2J0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMCAAAAEHRtcF9pc3N1ZWROc2J0XzIAAAAAAAAAAAAEAAAAB25zYnRNYXgJAABoAAAAAgkAAGgAAAACAAAAAAAAAAsiAAAAAAAAAAPoBQAAAAVQQVVMSQQAAAALbnNidEN1cnJlbnQJAABkAAAAAgkAAGgAAAACCQAAaAAAAAIAAAAAAAAABzoAAAAAAAAAA+gFAAAABVBBVUxJBQAAAAppc3N1ZWROc2J0BAAAAAtjdXJ2ZVJlc3VsdAkBAAAADWN1cnZlRnVuY3Rpb24AAAAGBQAAAAdyZXNlcnZlBQAAAA5uZXV0cmlub1N1cHBseQUAAAAMY3VycmVudFByaWNlBQAAAAduc2J0TWF4BQAAAAtuc2J0Q3VycmVudAUAAAAId2F2ZXNQYXkEAAAACm5zYnRBbW91bnQJAAGRAAAAAgUAAAALY3VydmVSZXN1bHQAAAAAAAAAAAAEAAAAEm5zYnQyV2F2ZXNQcmljZVJhdwkBAAAAFmNhbGNOc2J0MldhdmVzUHJpY2VSYXcAAAACBQAAAAh3YXZlc1BheQUAAAAKbnNidEFtb3VudAQAAAADcm9pCQAAZQAAAAIJAABrAAAAAwkBAAAAD2dldFJldmVyc2VQcmljZQAAAAEFAAAAEm5zYnQyV2F2ZXNQcmljZVJhdwAAAAAAAAAAZAUAAAAMY3VycmVudFByaWNlAAAAAAAAAABkCQAETgAAAAIJAQAAAAlvcmRlckRhdGEAAAAHCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAACXBtdEFtb3VudAUAAAAJcG10QW1vdW50CQAEJQAAAAEFAAAADG93bmVyQWRkcmVzcwUAAAAGRklMTEVEBQAAAANyb2kFAAAAEm5zYnQyV2F2ZXNQcmljZVJhdwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAxvd25lckFkZHJlc3MFAAAACm5zYnRBbW91bnQFAAAAC2JvbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAACHdhdmVzUGF5BQAAAAR1bml0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAEWRlYnVnX2N1cnZlUmVzdWx0CQEAAAAFdG9TdHIAAAACAgAAAAtjdXJ2ZVJlc3VsdAUAAAALY3VydmVSZXN1bHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEHRtcF9pc3N1ZWROc2J0XzIJAABkAAAAAgUAAAAKaXNzdWVkTnNidAUAAAAKbnNidEFtb3VudAUAAAADbmlsAAAAAWkBAAAAFGluc3RhbnRCdXlOc2J0T3JGYWlsAAAAAQAAAA1ub0xlc3NUaGVuUm9pBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAA3JvaQUAAAANY3VycmVudE1heFJvaQMJAABmAAAAAgUAAAANbm9MZXNzVGhlblJvaQUAAAADcm9pCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD0N1cnJlbnQgbWF4Um9pPQkAAaQAAAABBQAAAANyb2kCAAAALSBpcyBsZXNzIHRoZW4gcGFzc2VkIHBhcmFtZXRlciBub0xlc3NUaGVuUm9pPQkAAaQAAAABBQAAAA1ub0xlc3NUaGVuUm9pBAAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMJAQAAAA5nZXRQcmljZUZvclJvaQAAAAEFAAAAA3JvaQkBAAAAF2ludGVybmFsQWRkQnV5Qm9uZE9yZGVyAAAABQUAAAADcm9pCQEAAAAPZ2V0UmV2ZXJzZVByaWNlAAAAAQUAAAAVcHJpY2VXYXZlc0J5Qm9uZENlbnRzAgAAAAAFAAAAAWkGAAAAAWkBAAAAD2FkZEJ1eUJvbmRPcmRlcgAAAAIAAAAFcHJpY2UAAAAJcHJldk9yZGVyBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAFXByaWNlV2F2ZXNCeUJvbmRDZW50cwkBAAAAD2dldFJldmVyc2VQcmljZQAAAAEFAAAABXByaWNlAwkAAGcAAAACAAAAAAAAAAAABQAAAAVwcmljZQkAAAIAAAABAgAAAA9wcmljZSBsZXNzIHplcm8JAQAAABdpbnRlcm5hbEFkZEJ1eUJvbmRPcmRlcgAAAAUJAABrAAAAAwkAAGUAAAACBQAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMFAAAADGN1cnJlbnRQcmljZQAAAAAAAAAAZAUAAAAMY3VycmVudFByaWNlBQAAAAVwcmljZQUAAAAJcHJldk9yZGVyBQAAAAFpBwAAAAFpAQAAAAtjYW5jZWxPcmRlcgAAAAEAAAAHb3JkZXJJZAQAAAAFb3duZXIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAQAAAAGYW1vdW50CQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAAZjYWxsZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAluZXh0T3JkZXIJAQAAAAxnZXROZXh0T3JkZXIAAAABBQAAAAdvcmRlcklkBAAAAAlwcmV2T3JkZXIJAQAAAAxnZXRQcmV2T3JkZXIAAAABBQAAAAdvcmRlcklkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkBAAAAAiE9AAAAAgUAAAAFb3duZXIFAAAABmNhbGxlcgkAAAIAAAABAgAAABFwZXJtaXNzaW9uIGRlbmllZAMJAQAAAAIhPQAAAAIJAQAAAA5nZXRPcmRlclN0YXR1cwAAAAEFAAAAB29yZGVySWQFAAAAA05FVwkAAAIAAAABAgAAABRpbnZhbGlkIG9yZGVyIHN0YXR1cwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1GaXJzdE9yZGVyS2V5AwkAAAAAAAACBQAAAApmaXJzdE9yZGVyBQAAAAdvcmRlcklkBQAAAAluZXh0T3JkZXIFAAAACmZpcnN0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAACXByZXZPcmRlcgUAAAAJbmV4dE9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAluZXh0T3JkZXIFAAAACXByZXZPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAdvcmRlcklkBQAAAAhDQU5DRUxFRAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmFtb3VudAUAAAAEdW5pdAUAAAADbmlsAAAAAWkBAAAACHNlbGxCb25kAAAAAAMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAAAAAAAAAgUAAAAKZmlyc3RPcmRlcgIAAAAACQAAAgAAAAECAAAAD2VtcHR5IG9yZGVyYm9vawQAAAAJbmV4dE9yZGVyCQEAAAAMZ2V0TmV4dE9yZGVyAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAALZmlsbGVkVG90YWwJAQAAABNnZXRPcmRlckZpbGxlZFRvdGFsAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAAKb3JkZXJQcmljZQkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAApmaXJzdE9yZGVyBAAAAANyb2kJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABBQAAAApmaXJzdE9yZGVyBAAAAA9wYXltZW50V2F2ZWxldHMJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAKZmlyc3RPcmRlcgQAAAARb3JkZXJPd25lckFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAACmZpcnN0T3JkZXIJAQAAABBpbnRlcm5hbFNlbGxCb25kAAAACAUAAAAKZmlyc3RPcmRlcgUAAAAJbmV4dE9yZGVyBQAAAAtmaWxsZWRUb3RhbAUAAAADcm9pBQAAAApvcmRlclByaWNlBQAAAA9wYXltZW50V2F2ZWxldHMFAAAAEW9yZGVyT3duZXJBZGRyZXNzBwAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAEHB1YktleUFkbWluc0xpc3QJAARMAAAAAgIAAAAsR1h4bVphQ2lnUGdKc1Q2ZDFjTHI4blVYQTY1bkdYOFY3RnVBenpyWTh3UUUJAARMAAAAAgIAAAAsM3h1bXg0aHJQcGVlb283OUhMR2JaQ2dmejk1TDM5WkZkeHh3V2VTVUMyUHUJAARMAAAAAgIAAAAsRDRDcXRLNWZCc256Um8zM1pNaHJNN25pTHNlREgydVJvSzZ3ZUJxMkpRM0EJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAQAAAAFY291bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAMAAAAAAAAAAAIAAAAAAAAAAAAJAABnAAAAAgUAAAAFY291bnQAAAAAAAAAAAOEicrs", "chainId": 84, "height": 1351766, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2ouMhj8ivPh81KrkUmZgL4kB7fTEiErURkQn1vkfTRo3 Next: CMZRDuE8nV6x3S1DPMn2VF8oYNFuyvRwY7USwytKyZdy Diff:
OldNewDifferences
236236 }
237237
238238
239-func curveFunction (wRaw,uRaw,price,mRaw,sRaw,nRaw) = {
239+func curveFunction (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
240240 let EXP = 271828100
241- let nsbtCurveParamA = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
241+ let a = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
242+ let paulB = valueOrElse(getInteger(this, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
242243 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
243- let brMult = fraction(wReservesInUsdn, MULT, uRaw)
244- let powerMult = (nsbtCurveParamA * (brMult - (1 * MULT)))
245- let expInPowerMult = pow(EXP, MULTSCALE, powerMult, MULTSCALE, MULTSCALE, DOWN)
246- let lnRes1 = log(((mRaw - sRaw) - nRaw), PAULISCALE, EXP, MULTSCALE, MULTSCALE, DOWN)
247- let lnRes0 = log((mRaw - sRaw), PAULISCALE, EXP, MULTSCALE, MULTSCALE, DOWN)
248- let lnDiffMult = (lnRes0 - lnRes1)
249- let lnDiffMultipliedMaxRaw = fraction(mRaw, lnDiffMult, MULT)
250- let usdnPaymentRaw = fraction(expInPowerMult, lnDiffMultipliedMaxRaw, MULT)
251- let wavesPayment = convertNeutrinoToWaves(usdnPaymentRaw, price)
252-[wavesPayment, usdnPaymentRaw, wRaw, uRaw, mRaw, sRaw, nRaw, nsbtCurveParamA, wReservesInUsdn, brMult, powerMult, expInPowerMult, lnRes0, lnRes1, lnDiffMult, lnDiffMultipliedMaxRaw]
244+ let multBR = fraction(wReservesInUsdn, MULT, uRaw)
245+ let multPower = (a * (multBR - (1 * MULT)))
246+ let multExpInPower = pow(EXP, MULTSCALE, multPower, MULTSCALE, MULTSCALE, DOWN)
247+ let multK = fraction(paulB, multExpInPower, PAULI)
248+ let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
249+ let multStepM1 = fraction(multK, mRaw, PAULI)
250+ let multStep2 = fraction(multStepM1, PAULI, (mRaw - sRaw))
251+ let multStepM3 = (fraction(usdnPay, MULT, PAULI) + fraction(multStep2, mRaw, PAULI))
252+ let multStep4 = fraction(multStepM1, MULT, multStepM3)
253+ let stepM5 = fraction(multStep4, mRaw, MULT)
254+ let nsbtAmountRaw = ((mRaw - sRaw) - stepM5)
255+[nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, a, paulB, wReservesInUsdn, price, multBR, multPower, multExpInPower, multK, multStepM1, multStep2, multStepM3, multStep4, stepM5]
253256 }
254257
255258
256-func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((name + "[wavesPayment=") + toString(curveResult[0])) + " usdnPayment=") + toString(curveResult[1])) + " wRaw=") + toString(curveResult[2])) + " uRaw=") + toString(curveResult[3])) + " mRaw=") + toString(curveResult[4])) + " sRaw=") + toString(curveResult[5])) + " nRaw=") + toString(curveResult[6])) + " nsbtCurveParamA=") + toString(curveResult[7])) + " wReservesInUsdn=") + toString(curveResult[8])) + " brMult=") + toString(curveResult[9])) + " powerMult=") + toString(curveResult[10])) + " expInPowerMult=") + toString(curveResult[11])) + " lnRes0=") + toString(curveResult[12])) + " lnRes1=") + toString(curveResult[13])) + " lnDiffMult=") + toString(curveResult[14])) + " maxXlndiff=") + toString(curveResult[15])) + "]")
259+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])) + "]")
257260
258261
259262 func bigComplexity (i) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (!(isDefined(transferTransactionById(fromBase58String("PdLw5JK5ppfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k")))))
310313
311314
312315 @Callable(i)
313-func buyNsbtInSurplus (nsbtAmount) = {
316+func buyNsbtInSurplus () = {
314317 let pmt = value(i.payments[0])
315318 let pmtAmount = pmt.amount
319+ let wavesPay = pmtAmount
316320 let ownerAddress = i.caller
317321 if (isBlocked)
318322 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
321325 else if (((10 * WAVELET) > pmtAmount))
322326 then throw("min 10 waves expected")
323327 else {
324- let issuedNsbt = valueOrElse(getInteger(this, "tmp_issuedNsbt"), 0)
325- let nsbtMax = ((2500 * 1000) * PAULI)
326- let nsbtCurrent = (((1500 * 1000) * PAULI) + issuedNsbt)
327- let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtMax, nsbtCurrent, nsbtAmount)
328- let requiredWaves = curveResult[0]
329- if ((requiredWaves > pmtAmount))
330- then throw(((("Payment amount is less then required: pmtAmount=" + toString(pmtAmount)) + " requiredWaves=") + toString(requiredWaves)))
331- else {
332- let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(requiredWaves, nsbtAmount)
333- let roi = (fraction(getReversePrice(nsbt2WavesPriceRaw), 100, currentPrice) - 100)
334- (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, bondAssetId), ScriptTransfer(ownerAddress, (pmtAmount - requiredWaves), unit), ScriptTransfer(neutrinoContract, requiredWaves, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult)), IntegerEntry("tmp_issuedNsbt", (issuedNsbt + nsbtAmount))])
335- }
328+ let issuedNsbt = valueOrElse(getInteger(this, "tmp_issuedNsbt_2"), 0)
329+ let nsbtMax = ((2850 * 1000) * PAULI)
330+ let nsbtCurrent = (((1850 * 1000) * PAULI) + issuedNsbt)
331+ let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtMax, nsbtCurrent, wavesPay)
332+ let nsbtAmount = curveResult[0]
333+ let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
334+ let roi = (fraction(getReversePrice(nsbt2WavesPriceRaw), 100, currentPrice) - 100)
335+ (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, bondAssetId), ScriptTransfer(neutrinoContract, wavesPay, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult)), IntegerEntry("tmp_issuedNsbt_2", (issuedNsbt + nsbtAmount))])
336336 }
337337 }
338338
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
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
2323 let PAULISCALE = 6
2424
2525 let PRICELET = 1000000
2626
2727 let MULT = 100000000
2828
2929 let MULTSCALE = 8
3030
3131 let MINORDERTOTAL = (10 * WAVELET)
3232
3333 let MAXROI = 95
3434
3535 let CANCELED = "canceled"
3636
3737 let NEW = "new"
3838
3939 let FILLED = "filled"
4040
4141 let PriceKey = "price"
4242
4343 let BondAssetIdKey = "bond_asset_id"
4444
4545 let NeutrinoAssetIdKey = "neutrino_asset_id"
4646
4747 let BalanceLockedkKey = "balance_lock_"
4848
4949 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
5050
5151 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
5252
5353 let FirstOrderKey = "order_first"
5454
5555 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
5656
5757
5858 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
5959
6060
6161 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
6262
6363
6464 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
6565
6666
6767 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
6868
6969
7070 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
7171
7272
7373 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
7474
7575
7676 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
7777
7878
7979 func getNextOrderKey (orderId) = ("order_next_" + orderId)
8080
8181
8282 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
8383
8484
8585 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
8686
8787
8888 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
8989
9090
9191 func convertBondToWaves (amount,price) = convertNeutrinoToWaves(amount, price)
9292
9393
9494 let neutrinoContract = Address(base58'3Mzbx34Ex5rRbn39vUHx9kiwh3nneF8S5we')
9595
9696 let controlContract = Address(base58'3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx')
9797
9898 let liquidationContract = Address(base58'3N5nmMvMH8o3RPEyCKCaoWahBTYTexnZy62')
9999
100100 let neutrinoAssetId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
101101
102102 let bondAssetId = base58'BGhPYquXSK6UYjnPLEn94gFhetp4Jvf7toekEY4x1VDH'
103103
104104 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
105105
106106 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
107107
108108 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
109109
110110 let reserve = (wavesBalance(neutrinoContract).regular - getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey))
111111
112112 let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
113113
114114 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
115115
116116 let deficit = (neutrinoSupply - reservesInUsdn)
117117
118118 let currentMaxRoi = fraction(deficit, 100, neutrinoSupply)
119119
120120 let currentBrMult = fraction(reservesInUsdn, MULT, neutrinoSupply)
121121
122122 let firstOrder = getStringByKey(FirstOrderKey)
123123
124124 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
125125
126126
127127 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
128128
129129
130130 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
131131
132132
133133 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
134134
135135
136136 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
137137
138138
139139 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
140140
141141
142142 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
143143
144144
145145 func getPriceForRoi (roiPercents) = fraction((100 + roiPercents), currentPrice, 100)
146146
147147
148148 func getReversePrice (price) = ((PRICELET * PRICELET) / price)
149149
150150
151151 func calcNsbt2WavesPriceRaw (spentWavesRaw,receivedNsbtRaw) = fraction(spentWavesRaw, (PAULI * PRICELET), receivedNsbtRaw)
152152
153153
154154 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)]
155155
156156
157157 func internalSellBond (pFirstOrder,pNextOrder,pFilledTotal,pRoi,pPrice,pPaymentWavelets,orderOwnerAddress,instantOrder) = {
158158 let priceWavesByBondCents = getPriceForRoi(pRoi)
159159 let remainedTotal = (pPaymentWavelets - pFilledTotal)
160160 let fillableOrderAmount = convertWavesToBond(remainedTotal, priceWavesByBondCents)
161161 let totalOrderWaveletesRequired = convertBondToWaves(fillableOrderAmount, priceWavesByBondCents)
162162 let nbTokensSellCondition = (currentMaxRoi >= pRoi)
163163 if (!(nbTokensSellCondition))
164164 then throw(("innapropriate roi: " + toString(pRoi)))
165165 else if ((totalOrderWaveletesRequired == 0))
166166 then throw("cannot fill order at the moment")
167167 else {
168168 let changeWavelets = (remainedTotal - totalOrderWaveletesRequired)
169169 let writeSetData = if (instantOrder)
170170 then orderData(pFirstOrder, pPaymentWavelets, (pFilledTotal + totalOrderWaveletesRequired), toBase58String(orderOwnerAddress.bytes), FILLED, pRoi, currentPrice)
171171 else [IntegerEntry(getOrderFilledTotalKey(pFirstOrder), (pFilledTotal + totalOrderWaveletesRequired)), StringEntry(getOrderStatusKey(pFirstOrder), FILLED), StringEntry(getPrevOrderKey(pNextOrder), ""), StringEntry(FirstOrderKey, pNextOrder)]
172172 (writeSetData ++ [ScriptTransfer(orderOwnerAddress, fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit), ScriptTransfer(orderOwnerAddress, changeWavelets, unit)])
173173 }
174174 }
175175
176176
177177 func internalAddBuyBondOrder (roi,price,prevOrder,inv,instantOrder) = {
178178 let pmt = value(inv.payments[0])
179179 let newOrderId = toBase58String(inv.transactionId)
180180 if (isBlocked)
181181 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
182182 else if ((MINORDERTOTAL > pmt.amount))
183183 then throw(("min order total equals " + toString(MINORDERTOTAL)))
184184 else if ((roi > MAXROI))
185185 then throw("max setOrder ROI is 95%")
186186 else if ((0 > roi))
187187 then throw("can't place order with negative roi")
188188 else if ((roi == 0))
189189 then throw("roi should not be equal to 0")
190190 else if (isDefined(pmt.assetId))
191191 then throw("can use waves only")
192192 else if ((getOrderOwner(newOrderId) != ""))
193193 then throw("order exists")
194194 else if (if ((prevOrder != ""))
195195 then (getOrderStatus(prevOrder) != NEW)
196196 else false)
197197 then throw("prev order status is not new")
198198 else {
199199 let isNewOrderAtFirstPosition = (prevOrder == "")
200200 let owner = toString(inv.caller)
201201 let nextOrder = if (isNewOrderAtFirstPosition)
202202 then firstOrder
203203 else getNextOrder(prevOrder)
204204 let nextOrderRoi = getNumberByKey(getRoiByOrderIdKey(nextOrder))
205205 let isNextOrderError = if (if ((nextOrder != ""))
206206 then (roi >= nextOrderRoi)
207207 else false)
208208 then true
209209 else false
210210 let prevOrderRoi = getNumberByKey(getRoiByOrderIdKey(prevOrder))
211211 let isPrevOrderError = if (if ((prevOrder != ""))
212212 then (prevOrderRoi > roi)
213213 else false)
214214 then true
215215 else false
216216 if (if (isNextOrderError)
217217 then true
218218 else isPrevOrderError)
219219 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
220220 else if (if (isNewOrderAtFirstPosition)
221221 then (currentMaxRoi >= roi)
222222 else false)
223223 then internalSellBond(newOrderId, nextOrder, 0, roi, price, pmt.amount, inv.caller, true)
224224 else if (instantOrder)
225225 then throw("Instant order couldn't be added into waiting queue")
226226 else ([StringEntry(getPrevOrderKey(newOrderId), prevOrder), StringEntry(getNextOrderKey(newOrderId), nextOrder), StringEntry(getNextOrderKey(prevOrder), if ((prevOrder == ""))
227227 then ""
228228 else newOrderId), StringEntry(getPrevOrderKey(nextOrder), if ((nextOrder == ""))
229229 then ""
230230 else newOrderId), StringEntry(FirstOrderKey, if (if ((firstOrder == ""))
231231 then true
232232 else (firstOrder == nextOrder))
233233 then newOrderId
234234 else firstOrder)] ++ orderData(newOrderId, pmt.amount, 0, owner, NEW, roi, price))
235235 }
236236 }
237237
238238
239-func curveFunction (wRaw,uRaw,price,mRaw,sRaw,nRaw) = {
239+func curveFunction (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
240240 let EXP = 271828100
241- let nsbtCurveParamA = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
241+ let a = valueOrElse(getInteger(this, "nsbtCurveParam_a"), 3)
242+ let paulB = valueOrElse(getInteger(this, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
242243 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
243- let brMult = fraction(wReservesInUsdn, MULT, uRaw)
244- let powerMult = (nsbtCurveParamA * (brMult - (1 * MULT)))
245- let expInPowerMult = pow(EXP, MULTSCALE, powerMult, MULTSCALE, MULTSCALE, DOWN)
246- let lnRes1 = log(((mRaw - sRaw) - nRaw), PAULISCALE, EXP, MULTSCALE, MULTSCALE, DOWN)
247- let lnRes0 = log((mRaw - sRaw), PAULISCALE, EXP, MULTSCALE, MULTSCALE, DOWN)
248- let lnDiffMult = (lnRes0 - lnRes1)
249- let lnDiffMultipliedMaxRaw = fraction(mRaw, lnDiffMult, MULT)
250- let usdnPaymentRaw = fraction(expInPowerMult, lnDiffMultipliedMaxRaw, MULT)
251- let wavesPayment = convertNeutrinoToWaves(usdnPaymentRaw, price)
252-[wavesPayment, usdnPaymentRaw, wRaw, uRaw, mRaw, sRaw, nRaw, nsbtCurveParamA, wReservesInUsdn, brMult, powerMult, expInPowerMult, lnRes0, lnRes1, lnDiffMult, lnDiffMultipliedMaxRaw]
244+ let multBR = fraction(wReservesInUsdn, MULT, uRaw)
245+ let multPower = (a * (multBR - (1 * MULT)))
246+ let multExpInPower = pow(EXP, MULTSCALE, multPower, MULTSCALE, MULTSCALE, DOWN)
247+ let multK = fraction(paulB, multExpInPower, PAULI)
248+ let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
249+ let multStepM1 = fraction(multK, mRaw, PAULI)
250+ let multStep2 = fraction(multStepM1, PAULI, (mRaw - sRaw))
251+ let multStepM3 = (fraction(usdnPay, MULT, PAULI) + fraction(multStep2, mRaw, PAULI))
252+ let multStep4 = fraction(multStepM1, MULT, multStepM3)
253+ let stepM5 = fraction(multStep4, mRaw, MULT)
254+ let nsbtAmountRaw = ((mRaw - sRaw) - stepM5)
255+[nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, a, paulB, wReservesInUsdn, price, multBR, multPower, multExpInPower, multK, multStepM1, multStep2, multStepM3, multStep4, stepM5]
253256 }
254257
255258
256-func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((name + "[wavesPayment=") + toString(curveResult[0])) + " usdnPayment=") + toString(curveResult[1])) + " wRaw=") + toString(curveResult[2])) + " uRaw=") + toString(curveResult[3])) + " mRaw=") + toString(curveResult[4])) + " sRaw=") + toString(curveResult[5])) + " nRaw=") + toString(curveResult[6])) + " nsbtCurveParamA=") + toString(curveResult[7])) + " wReservesInUsdn=") + toString(curveResult[8])) + " brMult=") + toString(curveResult[9])) + " powerMult=") + toString(curveResult[10])) + " expInPowerMult=") + toString(curveResult[11])) + " lnRes0=") + toString(curveResult[12])) + " lnRes1=") + toString(curveResult[13])) + " lnDiffMult=") + toString(curveResult[14])) + " maxXlndiff=") + toString(curveResult[15])) + "]")
259+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])) + "]")
257260
258261
259262 func bigComplexity (i) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (!(isDefined(transferTransactionById(fromBase58String("PdLw5JK5ppfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k")))))
260263 then !(isDefined(transferTransactionById(fromBase58String("adLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
261264 else false)
262265 then !(isDefined(transferTransactionById(fromBase58String("sdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
263266 else false)
264267 then !(isDefined(transferTransactionById(fromBase58String("ddLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
265268 else false)
266269 then !(isDefined(transferTransactionById(fromBase58String("fdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
267270 else false)
268271 then !(isDefined(transferTransactionById(fromBase58String("gdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
269272 else false)
270273 then !(isDefined(transferTransactionById(fromBase58String("hdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
271274 else false)
272275 then !(isDefined(transferTransactionById(fromBase58String("jdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
273276 else false)
274277 then !(isDefined(transferTransactionById(fromBase58String("kdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
275278 else false)
276279 then !(isDefined(transferTransactionById(fromBase58String("rdLw5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
277280 else false)
278281 then !(isDefined(transferTransactionById(fromBase58String("tdLq5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
279282 else false)
280283 then !(isDefined(transferTransactionById(fromBase58String("tdLy5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
281284 else false)
282285 then !(isDefined(transferTransactionById(fromBase58String("tdLu5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
283286 else false)
284287 then !(isDefined(transferTransactionById(fromBase58String("tdLh5JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
285288 else false)
286289 then !(isDefined(transferTransactionById(fromBase58String("1dL4JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
287290 else false)
288291 then !(isDefined(transferTransactionById(fromBase58String("2dL25JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
289292 else false)
290293 then !(isDefined(transferTransactionById(fromBase58String("3dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
291294 else false)
292295 then !(isDefined(transferTransactionById(fromBase58String("4dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
293296 else false)
294297 then !(isDefined(transferTransactionById(fromBase58String("5dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
295298 else false)
296299 then !(isDefined(transferTransactionById(fromBase58String("6dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
297300 else false)
298301 then !(isDefined(transferTransactionById(fromBase58String("7dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
299302 else false)
300303 then !(isDefined(transferTransactionById(fromBase58String("8dL95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
301304 else false)
302305 then !(isDefined(transferTransactionById(fromBase58String("91L95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
303306 else false)
304307 then !(isDefined(transferTransactionById(fromBase58String("92L95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
305308 else false)
306309 then !(isDefined(transferTransactionById(fromBase58String("93L95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
307310 else false)
308311 then !(isDefined(transferTransactionById(fromBase58String("94L95JKdpqfSEqvmFJvchejorAkzd4BrWLvoFwvMGu5k"))))
309312 else false
310313
311314
312315 @Callable(i)
313-func buyNsbtInSurplus (nsbtAmount) = {
316+func buyNsbtInSurplus () = {
314317 let pmt = value(i.payments[0])
315318 let pmtAmount = pmt.amount
319+ let wavesPay = pmtAmount
316320 let ownerAddress = i.caller
317321 if (isBlocked)
318322 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
319323 else if (isDefined(pmt.assetId))
320324 then throw("can use waves only")
321325 else if (((10 * WAVELET) > pmtAmount))
322326 then throw("min 10 waves expected")
323327 else {
324- let issuedNsbt = valueOrElse(getInteger(this, "tmp_issuedNsbt"), 0)
325- let nsbtMax = ((2500 * 1000) * PAULI)
326- let nsbtCurrent = (((1500 * 1000) * PAULI) + issuedNsbt)
327- let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtMax, nsbtCurrent, nsbtAmount)
328- let requiredWaves = curveResult[0]
329- if ((requiredWaves > pmtAmount))
330- then throw(((("Payment amount is less then required: pmtAmount=" + toString(pmtAmount)) + " requiredWaves=") + toString(requiredWaves)))
331- else {
332- let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(requiredWaves, nsbtAmount)
333- let roi = (fraction(getReversePrice(nsbt2WavesPriceRaw), 100, currentPrice) - 100)
334- (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, bondAssetId), ScriptTransfer(ownerAddress, (pmtAmount - requiredWaves), unit), ScriptTransfer(neutrinoContract, requiredWaves, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult)), IntegerEntry("tmp_issuedNsbt", (issuedNsbt + nsbtAmount))])
335- }
328+ let issuedNsbt = valueOrElse(getInteger(this, "tmp_issuedNsbt_2"), 0)
329+ let nsbtMax = ((2850 * 1000) * PAULI)
330+ let nsbtCurrent = (((1850 * 1000) * PAULI) + issuedNsbt)
331+ let curveResult = curveFunction(reserve, neutrinoSupply, currentPrice, nsbtMax, nsbtCurrent, wavesPay)
332+ let nsbtAmount = curveResult[0]
333+ let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
334+ let roi = (fraction(getReversePrice(nsbt2WavesPriceRaw), 100, currentPrice) - 100)
335+ (orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw) ++ [ScriptTransfer(ownerAddress, nsbtAmount, bondAssetId), ScriptTransfer(neutrinoContract, wavesPay, unit), StringEntry("debug_curveResult", toStr("curveResult", curveResult)), IntegerEntry("tmp_issuedNsbt_2", (issuedNsbt + nsbtAmount))])
336336 }
337337 }
338338
339339
340340
341341 @Callable(i)
342342 func instantBuyNsbtOrFail (noLessThenRoi) = {
343343 let pmt = value(i.payments[0])
344344 let roi = currentMaxRoi
345345 if ((noLessThenRoi > roi))
346346 then throw(((("Current maxRoi=" + toString(roi)) + " is less then passed parameter noLessThenRoi=") + toString(noLessThenRoi)))
347347 else {
348348 let priceWavesByBondCents = getPriceForRoi(roi)
349349 internalAddBuyBondOrder(roi, getReversePrice(priceWavesByBondCents), "", i, true)
350350 }
351351 }
352352
353353
354354
355355 @Callable(i)
356356 func addBuyBondOrder (price,prevOrder) = {
357357 let pmt = value(i.payments[0])
358358 let priceWavesByBondCents = getReversePrice(price)
359359 if ((0 >= price))
360360 then throw("price less zero")
361361 else internalAddBuyBondOrder(fraction((priceWavesByBondCents - currentPrice), 100, currentPrice), price, prevOrder, i, false)
362362 }
363363
364364
365365
366366 @Callable(i)
367367 func cancelOrder (orderId) = {
368368 let owner = getOrderOwner(orderId)
369369 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
370370 let caller = toString(i.caller)
371371 let nextOrder = getNextOrder(orderId)
372372 let prevOrder = getPrevOrder(orderId)
373373 if (isBlocked)
374374 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
375375 else if ((owner != caller))
376376 then throw("permission denied")
377377 else if ((getOrderStatus(orderId) != NEW))
378378 then throw("invalid order status")
379379 else [StringEntry(FirstOrderKey, if ((firstOrder == orderId))
380380 then nextOrder
381381 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, unit)]
382382 }
383383
384384
385385
386386 @Callable(i)
387387 func sellBond () = if (isBlocked)
388388 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
389389 else if ((firstOrder == ""))
390390 then throw("empty orderbook")
391391 else {
392392 let nextOrder = getNextOrder(firstOrder)
393393 let filledTotal = getOrderFilledTotal(firstOrder)
394394 let orderPrice = getOrderPrice(firstOrder)
395395 let roi = getNumberByKey(getRoiByOrderIdKey(firstOrder))
396396 let paymentWavelets = getOrderTotal(firstOrder)
397397 let orderOwnerAddress = Address(fromBase58String(getOrderOwner(firstOrder)))
398398 internalSellBond(firstOrder, nextOrder, filledTotal, roi, orderPrice, paymentWavelets, orderOwnerAddress, false)
399399 }
400400
401401
402402 @Verifier(tx)
403403 func verify () = {
404404 let pubKeyAdminsList = ["GXxmZaCigPgJsT6d1cLr8nUXA65nGX8V7FuAzzrY8wQE", "3xumx4hrPpeeoo79HLGbZCgfz95L39ZFdxxwWeSUC2Pu", "D4CqtK5fBsnzRo33ZMhrM7niLseDH2uRoK6weBq2JQ3A", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
405405 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
406406 then 1
407407 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
408408 then 1
409409 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
410410 then 1
411411 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
412412 then 2
413413 else 0))
414414 (count >= 3)
415415 }
416416

github/deemru/w8io/169f3d6 
77.61 ms