tx · FYMgaBisNouzjQoPkZXzt89ineHNvhD7b7Q3ZBhh71aZ

3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp:  -0.02300000 Waves

2023.05.02 14:32 [2560086] smart account 3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp > SELF 0.00000000 Waves

{ "type": 13, "id": "FYMgaBisNouzjQoPkZXzt89ineHNvhD7b7Q3ZBhh71aZ", "fee": 2300000, "feeAssetId": null, "timestamp": 1683027169477, "version": 2, "chainId": 84, "sender": "3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp", "senderPublicKey": "86RHVxKovtU7yKnepY8wKsd8niDxGAsiwuA1XA1DNqrS", "proofs": [ "5QsCpRZV6GBxKYsiqUF9Jsc2SYy3S1uVsTrGgrmHRXSGbF4xangRVJwqYwvLsssintjHZ4UUqn8Cb9DF4HmPJsE2" ], "script": "base64:BgLkIAgCEgMKAQgSAwoBCBIECgIICBIJCgcBERERGAgYEgcKBRERERgIEgcKBQEBAQgIEgASAwoBCBIECgIIARIECgIIARIECgIIARIDCgEIEgYKBAgBCAESBQoDARgYEgMKARgiBlNDQUxFOCIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIDU0VQIg5QT09MV0VJR0hUTVVMVCIKemVyb0JpZ0ludCIOaWR4UG9vbEFkZHJlc3MiDWlkeFBvb2xTdGF0dXMiEGlkeFBvb2xMUEFzc2V0SWQiDWlkeEFtdEFzc2V0SWQiD2lkeFByaWNlQXNzZXRJZCIOaWR4QW10QXNzZXREY20iEGlkeFByaWNlQXNzZXREY20iDmlkeElBbXRBc3NldElkIhBpZHhJUHJpY2VBc3NldElkIg1pZHhMUEFzc2V0RGNtIg9nZXRTdHJpbmdPckZhaWwiA2tleSIYZ2V0U3RyaW5nQnlBZGRyZXNzT3JGYWlsIgdhZGRyZXNzIgxnZXRJbnRPclplcm8iDGdldEludE9yRmFpbCIJYXNBbnlMaXN0IgN2YWwiByRtYXRjaDAiCnZhbEFueUx5c3QiBWFzSW50IgZ2YWxJbnQiCGFzU3RyaW5nIgZ2YWxTdHIiEWtleUZhY3RvcnlBZGRyZXNzIhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiDWtleUZhY3RvcnlDZmciGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nIgpscEFzc2V0U3RyIhBrZXlGYWN0b3J5THBMaXN0IiZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcyIUa2V5RmFjdG9yeVBvb2xXZWlnaHQiD2NvbnRyYWN0QWRkcmVzcyIWa2V5TWFuYWdlclZhdWx0QWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsIgpyZWFkTHBMaXN0IhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsIgRmQ2ZnIhhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwiF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsIhlnZXRHd3hSZXdhcmRBZGRyZXNzT3JGYWlsIhdnZXRNYW5hZ2VyQWRkcmVzc09yRmFpbCILa2V5Qm9vc3RDZmciH2tleUJvb3N0aW5nTG9ja1BhcmFtVG90YWxBbW91bnQiKGtleUJvb3N0aW5nU3RhdHNMb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MiGmtleUJvb3N0aW5nU3RhdHNMb2Nrc0NvdW50IhprZXlCb29zdGluZ1N0YXRzVXNlcnNDb3VudCISa2V5VXNlcjJOdW1NYXBwaW5nIgt1c2VyQWRkcmVzcyISa2V5TnVtMlVzZXJNYXBwaW5nIgNudW0iFmtleUxvY2tQYXJhbVVzZXJBbW91bnQiB3VzZXJOdW0iFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2siFGtleUxvY2tQYXJhbUR1cmF0aW9uIg1rZXlMb2NrUGFyYW1LIg1rZXlMb2NrUGFyYW1CIhVrZXlMb2NrUGFyYW1CeVBlcmlvZEsiBnBlcmlvZCIVa2V5TG9ja1BhcmFtQnlQZXJpb2RCIiBrZXlVc2VyQm9vc3RFbWlzc2lvbkxhc3RJTlRFR1JBTCIXa2V5VXNlck1heEJvb3N0SU5URUdSQUwiGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTCIha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsIhNrZXlVc2VyQm9vc3RDbGFpbWVkIhFrZXlUb3RhbENhY2hlZEd3eCIPa2V5U3Rha2VkQnlVc2VyIg51c2VyQWRkcmVzc1N0ciIMbHBBc3NldElkU3RyIg5rZXlTdGFrZWRUb3RhbCIQa2V5Q2xhaW1lZEJ5VXNlciIZa2V5Q2xhaW1lZEJ5VXNlck1pblJld2FyZCIba2V5Q2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIgpyZWFkU3Rha2VkIgtzdGFraW5nRGFwcCIea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50IiFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQiFWtleUVtaXNzaW9uU3RhcnRCbG9jayIba2V5RW1pc3Npb25EdXJhdGlvbkluQmxvY2tzIhNrZXlFbWlzc2lvbkVuZEJsb2NrIgtmYWN0b3J5RGFwcCIKZmFjdG9yeUNmZyIMZW1pc3Npb25EYXBwIg1nd3hSZXdhcmREYXBwIgxib29zdGluZ0RhcHAiDGdldFBvb2xJbkZlZSILcG9vbEFkZHJlc3MiAUAiDWdldFBvb2xPdXRGZWUiGWludGVybmFsQ3VycmVudFJld2FyZFJhdGUiCWxwQXNzZXRJZCIOcG9vbEFkZHJlc3NTdHIiDnBvb2xXZWlnaHRNdWx0Igpwb29sV2VpZ2h0IhJ3eEVtaXNzaW9uUGVyQmxvY2siFXd4RW1pc3Npb25QZXJCbG9ja01heCINYm9vc3RNYXhDb2VmZiIWcG9vbFd4RW1pc3Npb25QZXJCbG9jayIZcG9vbFd4RW1pc3Npb25QZXJCbG9ja01heCIJbWF4RmFjdG9yIg10b3RhbExwU3Rha2VkIhpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWSIKbG9ja0Ftb3VudCIMbG9ja0R1cmF0aW9uIg9tYXhMb2NrRHVyYXRpb24iB2NvZWZmWDgiDmdXeEFtb3VudFN0YXJ0IgZnZXRLZXkiBGFkZHIiBHR5cGUiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiE21hbmFnZXJWYXVsdEFkZHJlc3MiAXMiCWlzTWFuYWdlciIBaSICcGsiC211c3RNYW5hZ2VyIg5mYWN0b3J5QWRkcmVzcyILY2hlY2tDYWxsZXIiCnJld2FyZERhdGEiEnZvdGluZ1Jlc3VsdFN0YWtlZCIObHBTdGFrZWRCeVVzZXIiDXVzZXJDbGFpbUluZm8iDW1pblJld2FyZFBhcnQiD2Jvb3N0UmV3YXJkUGFydCIFZGVidWciDWJvb3N0aW5nUG93ZXIiC2N1cnJlbnRJdGVyIhFkZWx0YVd4QW1vdW50QnVsayIbZGVsdGFMb2NrUGVyaW9kSW5CbG9ja3NCdWxrIhFkZWx0YUxwQW1vdW50QnVsayIQbHBBc3NldElkT3B0QnVsayIOdXNlckFkZHJlc3NPcHQiBnJlc0FjYyINZGVsdGFXeEFtb3VudCIXZGVsdGFMb2NrUGVyaW9kSW5CbG9ja3MiDWRlbHRhTHBBbW91bnQiDGxwQXNzZXRJZE9wdCIEaW5mbyIDcmVzIgNpbnYiCmJvb3N0Q29lZmYiCG1hdGhEYXBwIghFTVBUWVNUUiIXbWF4TG9ja0R1cmF0aW9uSW5CbG9ja3MiCnVzZXJOdW1TdHIiCnVzZXJBbW91bnQiCWxvY2tTdGFydCIHbG9ja0VuZCIRcmVtYWluaW5nRHVyYXRpb24iDXVzZXJBbW91bnROZXciD2xvY2tEdXJhdGlvbk5ldyIRdXNlckN1cnJnV3hBbW91bnQiEWdXeEFtb3VudFN0YXJ0TmV3Ig50b3RhbENhY2hlZEd3eCIFTVVMVDMiFHd4RW1pc3Npb25QZXJCbG9ja1gzIg9zdGFrZWRCeVVzZXJLRVkiDnN0YWtlZFRvdGFsS0VZIgxzdGFrZWRCeVVzZXIiC3N0YWtlZFRvdGFsIhhwb29sV3hFbWlzc2lvblBlckJsb2NrWDMiCXd4UGVyTHBYMyIQdXNlcld4UGVyQmxvY2tYMyIXYm9vc3RFbWlzc2lvblBlckJsb2NrWDMiFnRtcFVzZXJCb29zdFBlckJsb2NrWDMiE3VzZXJCb29zdFBlckJsb2NrWDMiDnVzZXJCb29zdENvZWZmIgdPTkVNVUxUIgNPTkUiEmVtaXNzaW9uU3RhcnRCbG9jayIMcGFzc2VkQmxvY2tzIg50ZWFtRW1EdXJhdGlvbiIJdGVhbUVtTWF4IgZ0ZWFtRW0iD3RvdGFsV3hSZWxlYXNlZCINdG90YWxXeExvY2tlZCIYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIgpsb2Nrc0NvdW50IgdscEFzc2V0IgZzdGF0dXMiA3RwbCIDY2ZnIgphbXRBc3NldElkIgxwcmljZUFzc2V0SWQiC2lBbXRBc3NldElkIg1pUHJpY2VBc3NldElkIgthbXRBc3NldERjbSINcHJpY2VBc3NldERjbSINcG9vbExQQmFsYW5jZSISYWNjQW10QXNzZXRCYWxhbmNlIhRhY2NQcmljZUFzc2V0QmFsYW5jZSIKcHJpY2VzTGlzdCIIY3VyUHJpY2UiD2xwQW10QXNzZXRTaGFyZSIRbHBQcmljZUFzc2V0U2hhcmUiBWluRmVlIgZvdXRGZWUiHnBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIdcG9vbE9uZVRva2VuT3BlcmF0aW9uc0VuYWJsZWQiDGluQW1Bc3NldEFtdCIMYW1Bc3NldElkU3RyIglhbUFzc2V0SWQiDHByQXNzZXRJZFN0ciIJcHJBc3NldElkIgpwb29sU3RhdHVzIg5hbXRBc3NldEFtdFgxOCIQcHJpY2VBc3NldEFtdFgxOCILY3VyUHJpY2VYMTgiD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4IgxpblByQXNzZXRBbXQiDSR0MDIyNjI3MjI5ODAiCWNhbGNMcEFtdCIMY3VyUHJpY2VDYWxjIglhbUJhbGFuY2UiCXByQmFsYW5jZSIKbHBFbWlzc2lvbiIMYW1CYWxhbmNlUmF3IgxwckJhbGFuY2VSYXciD2FtQmFsYW5jZVJhd1gxOCIPcHJCYWxhbmNlUmF3WDE4Ig0kdDAyNTU1MzI1OTA2IhBwYXltZW50THBBc3NldElkIgxwYXltZW50THBBbXQiDSR0MDI2NjAxMjcwMTgiCG91dEFtQW10IghvdXRQckFtdCIPZ3d4VXNlckluZm9MSVNUIglnd3hBbW91bnQiDXVuc3Rha2VBbW91bnQiCm91dEFzc2V0SWQiDG1pbk91dEFtb3VudCIEa2V5cyIBayICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5XQABYQAIAAFiAIDC1y8AAWMAEgABZAkAtgIBAICAkLu61q3wDQABZQICX18AAWYFAWIAAWcJALYCAQAAAAFoAAEAAWkAAgABagADAAFrAAQAAWwABQABbQAGAAFuAAcAAW8ACAABcAAJAAFxAAoBAXIBAXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQFzCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFzAg8gaXMgbm90IGRlZmluZWQBAXQCAXUBcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAXUFAXMJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQF1AgEuBQFzAg8gaXMgbm90IGRlZmluZWQBAXYCAXUBcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQF1BQFzAAABAXcCAXUBcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAXUFAXMJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAXMCDyBpcyBub3QgZGVmaW5lZAEBeAEBeQQBegUBeQMJAAECBQF6AglMaXN0W0FueV0EAUEFAXoFAUEJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BAUIBAXkEAXoFAXkDCQABAgUBegIDSW50BAFDBQF6BQFDCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQFEAQF5BAF6BQF5AwkAAQIFAXoCBlN0cmluZwQBRQUBegUBRQkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEBRgACHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MAAUcAAQABSAACAAFJAAMAAUoABAABSwAFAAFMAAYAAU0ABwABTgAIAQFPAAIRJXNfX2ZhY3RvcnlDb25maWcBAVABAVEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUBUQkAzAgCAh5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFA25pbAUBZQEBUgACECVzX19scFRva2Vuc0xpc3QBAVMBAVEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUBUQkAzAgCAh5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFA25pbAUBZQEBVAEBVQkAuQkCCQDMCAICBCVzJXMJAMwIAgIKcG9vbFdlaWdodAkAzAgCBQFVBQNuaWwFAWUBAVYAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwEBVwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFYAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAXIBCQEBRgABAVkACQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgkBAVgACQEBUgACAAUBZQEBWgECYWEJALUJAgkBAXQCBQJhYQkBAU8ABQFlAQJhYgECYWMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWMFAUgBAmFkAQJhYwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhYwUBSwECYWUBAmFjCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFjBQFHAQJhZgECYWMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWMFAU4BAmFnAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBAVYAAQJhaAACCiVzX19jb25maWcBAmFpAAIeJXMlc19fc3RhdHNfX2FjdGl2ZVRvdGFsTG9ja2VkAQJhagACJSVzJXNfX3N0YXRzX19sb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MBAmFrAAIXJXMlc19fc3RhdHNfX2xvY2tzQ291bnQBAmFsAAIdJXMlc19fc3RhdHNfX2FjdGl2ZVVzZXJzQ291bnQBAmFtAQJhbgkAuQkCCQDMCAICGSVzJXMlc19fbWFwcGluZ19fdXNlcjJudW0JAMwIAgUCYW4FA25pbAUBZQECYW8BAmFwCQC5CQIJAMwIAgIZJXMlcyVzX19tYXBwaW5nX19udW0ydXNlcgkAzAgCBQJhcAUDbmlsBQFlAQJhcQECYXIJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFyCQDMCAICBmFtb3VudAUDbmlsBQFlAQJhcwECYXIJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFyCQDMCAICBXN0YXJ0BQNuaWwFAWUBAmF0AQJhcgkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYXIJAMwIAgIIZHVyYXRpb24FA25pbAUBZQECYXUBAmFyCQC5CQIJAMwIAgIWJXMlZCVzX19wYXJhbUJ5VXNlck51bQkAzAgCBQJhcgkAzAgCAgFrBQNuaWwFAWUBAmF2AQJhcgkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYXIJAMwIAgIBYgUDbmlsBQFlAQJhdwICYXICYXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCBQJhcgkAzAgCAgFrCQDMCAIFAmF4BQNuaWwFAWUBAmF5AgJhcgJheAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIFAmFyCQDMCAICAWIJAMwIAgUCYXgFA25pbAUBZQECYXoBAmFyCQC5CQIJAMwIAgIeJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50CQDMCAIFAmFyBQNuaWwFAWUBAmFBAQJhcgkAuQkCCQDMCAICESVzJWRfX21heEJvb3N0SW50CQDMCAIFAmFyBQNuaWwFAWUBAmFCAAIYJXMlc19fbWF4Qm9vc3RJbnRfX3RvdGFsAQJhQwECYXIJALkJAgkAzAgCAiQlcyVkX191c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwJAMwIAgUCYXIFA25pbAUBZQECYUQBAmFyCQC5CQIJAMwIAgIWJXMlZF9fdXNlckJvb3N0Q2xhaW1lZAkAzAgCBQJhcgUDbmlsBQFlAQJhRQACFiVzJXNfX2d3eENhY2hlZF9fdG90YWwBAmFGAgJhRwJhSAkAuQkCCQDMCAICDiVzJXMlc19fc3Rha2VkCQDMCAIFAmFHCQDMCAIFAmFIBQNuaWwFAWUBAmFJAQJhSAkArAICAhclcyVzJXNfX3N0YWtlZF9fdG90YWxfXwUCYUgBAmFKAgJhSAJhRwkAuQkCCQDMCAICDyVzJXMlc19fY2xhaW1lZAkAzAgCBQJhRwkAzAgCBQJhSAUDbmlsBQFlAQJhSwICYUgCYUcJALkJAgkAzAgCAhglcyVzJXNfX2NsYWltZWRNaW5SZXdhcmQJAMwIAgUCYUcJAMwIAgUCYUgFA25pbAUBZQECYUwCAmFIAmFHCQC5CQIJAMwIAgIaJXMlcyVzX19jbGFpbWVkQm9vc3RSZXdhcmQJAMwIAgUCYUcJAMwIAgUCYUgFA25pbAUBZQECYU0CAmFOAXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYU4FAXMAAAECYU8AAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAmFQAAIeJXMlc19fcmF0ZVBlckJsb2NrTWF4X19jdXJyZW50AQJhUQACGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQJhUgACGCVzJXNfX2VtaXNzaW9uX19kdXJhdGlvbgECYVMAAhglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sAAmFUCQEBWAAAAmFVCQEBWgEFAmFUAAJhVgkBAmFkAQUCYVUAAmFOCQECYWUBBQJhVQACYVcJAQJhZgEFAmFVAAJhWAkBAmFiAQUCYVUBAmFZAQJhWgoAAmJhCQD8BwQFAmFUAhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUCYVoFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAECYmIBAmFaCgACYmEJAPwHBAUCYVQCEWdldE91dEZlZVJFQURPTkxZCQDMCAIJAKUIAQUCYVoFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAECYmMBAmJkBAJiZQkBAXQCBQJhVAkBAVMBBQJiZAQCYmYFAWIEAmJnCQERQGV4dHJOYXRpdmUoMTA1MCkCBQJhVAkBAVQBBQJiZQQCYmgJAQF3AgUCYVYJAQJhTwAEAmJpCQEBdwIFAmFWCQECYVAABAJiagoAAmJhCQD8BwQFAmFWAhVnZXRCb29zdENvZWZmUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCYmsJAGkCCQBrAwUCYmgFAmJnBQJiZgUCYmoEAmJsCQBrAwUCYmkFAmJnBQJiZgQCYm0JAGgCBQJiagUBYgQCYm4JAQF2AgUCYU4JAQJhSQEFAmJkCQDMCAIFAmJrCQDMCAIFAmJtCQDMCAIFAmJuBQNuaWwBAmJvAwJicAJicQJicgQCYnMJAGsDBQJicQUBYgUCYnIEAmJ0CQBrAwUCYnAFAmJzBQFiCQDMCAIFAmJ0BQNuaWwBAmJ1AwJidgFzAmJ3AwkAAAIFAmJ3AgZzdHJpbmcJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAmJ2BQFzAwkAAAIFAmJ3AgdpbnRlZ2VyCQCkAwEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAmJ2BQFzAwkAAAIFAmJ3Agdib29sZWFuCQClAwEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFAmJ2BQFzCQACAQItdW5rbm93biB0eXBlLiBleHBlY3RlZCBzdHJpbmcvaW50ZWdlci9ib29sZWFuAQJieAAEAmJ5CQECYWcABAF6CQCdCAIFAmJ5CQEBVwADCQABAgUBegIGU3RyaW5nBAJiegUBegkA2QQBBQJiegMJAAECBQF6AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJBAQJiQgQBegkBAmJ4AAMJAAECBQF6AgpCeXRlVmVjdG9yBAJiQwUBegkAAAIIBQJiQg9jYWxsZXJQdWJsaWNLZXkFAmJDAwkAAQIFAXoCBFVuaXQJAAACCAUCYkIGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmJEAQJiQgMJAQJiQQEFAmJCBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkDwJiQgELY29uc3RydWN0b3IBAmJFBAJiRgkBAmJEAQUCYkIDCQAAAgUCYkYFAmJGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFGAAUCYkUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiQgEZY3VycmVudFJld2FyZFJhdGVSRUFET05MWQECYmQEAmJHCQECYmMBBQJiZAQCYmgJAJEDAgUCYkcAAAQCYm0JAJEDAgUCYkcAAQQCYm4JAJEDAgUCYkcAAgQCYkgKAAJiYQkA/AcEBQJhWAIdZ2V0Vm90aW5nUmVzdWx0U3Rha2VkUkVBRE9OTFkJAMwIAgUCYmQFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAlAoCBQNuaWwJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFAmJoCQDMCAIJAKQDAQUCYm0JAMwIAgkApAMBBQJibgkAzAgCCQCkAwEFAmJIBQNuaWwFAWUCYkIBHWN1cnJlbnRVc2VyUmV3YXJkUmF0ZVJFQURPTkxZAgJiZAJhbgQCYkcJAQJiYwEFAmJkBAJiaAkAkQMCBQJiRwAABAJibQkAkQMCBQJiRwABBAJibgkAkQMCBQJiRwACBAJiSQkBAXYCBQJhTgkBAmFGAgUCYW4FAmJkBAJiSgkAtQkCCQEBRAEJAPwHBAUCYU4CD2NsYWltV3hSRUFET05MWQkAzAgCBQJiZAkAzAgCBQJhbgUDbmlsBQNuaWwFAWUEAmJLCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQJiSgAFAhxjb3VsZG4ndCBwYXJzZSBtaW5SZXdhcmRQYXJ0BAJiTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUCYkoABgIeY291bGRuJ3QgcGFyc2UgYm9vc3RSZXdhcmRQYXJ0BAJiTQkAkQMCBQJiSgAHBAJiTgMJAAACBQJiTAAACQBoAgABBQFiCQBrAwkAZAIFAmJLBQJiTAUBYgUCYksJAJQKAgUDbmlsCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVzCQDMCAIJAKQDAQUCYmgJAMwIAgkApAMBBQJibQkAzAgCCQCkAwEFAmJuCQDMCAIJAKQDAQUCYkkJAMwIAgkApAMBBQJiTgkAzAgCBQJiTQUDbmlsBQFlAmJCAR1jYWxjQm9vc3RCdWxrSW50ZXJuYWxSRUFET05MWQcCYk8CYlACYlECYlICYlMCYlQCYlUDCQAAAgUCYk8JAJADAQUCYlAJAJQKAgUDbmlsBQJiVQQCYlYJAJEDAgUCYlAFAmJPBAJiVwkAkQMCBQJiUQUCYk8EAmJYCQCRAwIFAmJSBQJiTwQCYlkJAJEDAgUCYlMFAmJPBAJiWgoAAmJhCQD8BwQFBHRoaXMCEWNhbGNCb29zdFJFQURPTkxZCQDMCAIFAmJWCQDMCAIFAmJXCQDMCAIFAmJYCQDMCAIFAmJZCQDMCAIFAmJUBQNuaWwFA25pbAMJAAECBQJiYQIGU3RyaW5nBQJiYQkAAgEJAKwCAgkAAwEFAmJhAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEAmNhCQDNCAIFAmJVBQJiWgQCY2IKAAJiYQkA/AcEBQR0aGlzAh1jYWxjQm9vc3RCdWxrSW50ZXJuYWxSRUFET05MWQkAzAgCCQBkAgUCYk8AAQkAzAgCBQJiUAkAzAgCBQJiUQkAzAgCBQJiUgkAzAgCBQJiUwkAzAgCBQJiVAkAzAgCBQJjYQUDbmlsBQNuaWwDCQABAgUCYmECCUxpc3RbQW55XQUCYmEJAAIBCQCsAgIJAAMBBQJiYQIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFAmNiBQJjYgkAlAoCBQNuaWwFAmNiCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJCARVjYWxjQm9vc3RCdWxrUkVBRE9OTFkFAmJWAmJXAmJYAmJZAmJUBAJjYQkA/AcEBQR0aGlzAh1jYWxjQm9vc3RCdWxrSW50ZXJuYWxSRUFET05MWQkAzAgCAAAJAMwIAgUCYlYJAMwIAgUCYlcJAMwIAgUCYlgJAMwIAgUCYlkJAMwIAgUCYlQJAMwIAgUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFAmNhAmJCARFjYWxjQm9vc3RSRUFET05MWQUCYlYCYlcCYlgCYlkCYlQEAmNjCgACYmEJAPwHBAUCYVYCFWdldEJvb3N0Q29lZmZSRUFET05MWQUDbmlsBQNuaWwDCQABAgUCYmECA0ludAUCYmEJAAIBCQCsAgIJAAMBBQJiYQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJjZAUCYVcEAmNlAgVlbXB0eQQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAQF0AgUCYVgJAQJhaAAFAWUABAQCYUgDCQAAAgUCYlkCAAUCY2UFAmJZBAJhRwMJAAACBQJiVAIABQJjZQUCYlQEAmNnCQELdmFsdWVPckVsc2UCCQCdCAIFAmFYCQECYW0BBQJiVAUCY2UEAmNoCQELdmFsdWVPckVsc2UCCQCaCAIFAmFYCQECYXEBBQJjZwAABAJjaQkBC3ZhbHVlT3JFbHNlAgkAmggCBQJhWAkBAmFzAQUCY2cFBmhlaWdodAQCYnEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYVgJAQJhdAEFAmNnAAAEAmNqCQBkAgUCY2kFAmJxBAJjawkAlgMBCQDMCAIJAGUCBQJjagUGaGVpZ2h0CQDMCAIAAAUDbmlsBAJjbAkAZAIFAmNoBQJiVgQCY20JAJcDAQkAzAgCCQBkAgUCY2sFAmJXCQDMCAIFAmNmBQNuaWwEAmNuCQEBQgEJAJEDAgkBAXgBCQD8BwQFAmFYAhNnd3hVc2VySW5mb1JFQURPTkxZCQDMCAIFAmFHBQNuaWwFA25pbAAABAJjbwkAkQMCCQECYm8DBQJjbAUCY20FAmNmAAAEAmNwCgACYmEJAPwHBAUCYVgCGWdldFRvdGFsQ2FjaGVkR3d4UkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQCY3EA6AcEAmNyCQBoAgkBAXcCBQJhVgkBAmFPAAUCY3EEAmNzCQECYUYCBQJhRwUCYUgEAmN0CQECYUkBBQJhSAQCY3UJAQJhTQIFAmFOBQJjcwQCY3YJAQJhTQIFAmFOBQJjdAQCYmcDCQECIT0CBQJhSAUCY2UEAmJlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVQJAQFQAQUCYUgJAKwCAgIVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJhSAkBEUBleHRyTmF0aXZlKDEwNTApAgUCYVQJAQFUAQUCYmUAAAQCY3cJAGsDBQJjcgUCYmcJAGgCBQFmBQJjYwQCY3gDCQECIT0CBQJjdgAACQBrAwUCY3cFAWIFAmN2AAAEAmN5CQBrAwUCY3gFAmN1BQFiBAJjegkAaAIFAmN3CQBlAgUCY2MAAQQCY0EJAGsDBQJjbgUCY3oFAmNwBAJjQgkAlwMBCQDMCAIFAmNBCQDMCAIJAGgCBQJjeQkAZQIFAmNjAAEFA25pbAQCY0MDCQAAAgUCY3kAAAkAaAIAAQUBYgkAawMJAGQCBQJjQgUCY3kFAWIFAmN5CQCUCgIFA25pbAkAuQkCCQDMCAICBiVkJWQlcwkAzAgCCQCkAwEFAmNvCQDMCAIJAKQDAQUCY0MJAMwIAgIBZAUDbmlsBQFlAmJCARd3eEVtaXNzaW9uU3RhdHNSRUFET05MWQAEAmNECQCkAwEFAWIEAmNFAgExBAJiaAkBAXcCBQJhVgkBAmFPAAQCY0YJAQF3AgUCYVYJAQJhUQAEAmNHAwkAZgIFAmNGBQZoZWlnaHQAAAkAZQIFBmhlaWdodAUCY0YEAmNICQBoAgCgCwDtAgQCY0kJAGgCAMCI7F8FAWIEAmNKAwkAZgIFAmNHBQJjSAUCY0kJAGsDBQJjSQUCY0cFAmNIBAJjSwkAZAIJAGgCBQJiaAUCY0cFAmNKBAJjTAkBAXYCBQJhWAkBAmFpAAQCY00JAQF2AgUCYVgJAQJhagAEAmNOCQEBdgIFAmFYCQECYWsACQCUCgIFA25p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XzQEAmRBCAUCZEkCXzUEAmRjCAUCZEkCXzYEAmRvCAUCZEkCXzcJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJkSgkAzAgCCQCkAwEFAmRLCQDMCAIJAKQDAQUCZHkJAMwIAgkApAMBBQJkegkAzAgCCQCkAwEFAmRBCQDMCAIFAmRjCQDMCAIFAmRvBQNuaWwFAWUCYkIBE2d3eFVzZXJJbmZvUkVBRE9OTFkBAmFuBAJkTAkBAXgBCQD8BwQFAmFYAhNnd3hVc2VySW5mb1JFQURPTkxZCQDMCAIFAmFuBQNuaWwFA25pbAQCZE0JAQFCAQkAkQMCBQJkTAAACQCUCgIFA25pbAkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUCZE0FA25pbAUBZQJiQgEVdW5zdGFrZUFuZEdldE9uZVRrblYyBAJhWgJkTgJkTwJkUAQCY2IJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYVoCFXVuc3Rha2VBbmRHZXRPbmVUa25WMgkAzAgCBQJkTgkAzAgCBQJkTwkAzAgCBQJkUAUDbmlsBQNuaWwDCQAAAgUCY2IFAmNiCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiQgETZ2V0S2V5c0J1bGtJbnRlcm5hbAMCYk8CZFECYlUDCQAAAgUCYk8JAJADAQUCZFEJAJQKAgUDbmlsBQJiVQQCZFIJALUJAgkAkQMCBQJkUQUCYk8CAisrBAJidgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJkUgAABAFzCQCRAwIFAmRSAAEEAmJ3CQCRAwIFAmRSAAIEAXkJAQJidQMFAmJ2BQFzBQJidwQCY2EJAM0IAgUCYlUFAXkEAmNiCQD8BwQFBHRoaXMCE2dldEtleXNCdWxrSW50ZXJuYWwJAMwIAgkAZAIFAmJPAAEJAMwIAgUCZFEJAMwIAgUCY2EFA25pbAUDbmlsAwkAAAIFAmNiBQJjYgkAlAoCBQNuaWwFAmNiCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJCAQtnZXRLZXlzQnVsawECZFEEAmNhCQD8BwQFBHRoaXMCE2dldEtleXNCdWxrSW50ZXJuYWwJAMwIAgAACQDMCAIFAmRRCQDMCAIFA25pbAUDbmlsBQNuaWwJAJQKAgUDbmlsBQJjYQECZFMBAmRUAAQCZFUEAXoJAQJieAADCQABAgUBegIKQnl0ZVZlY3RvcgQCYkMFAXoFAmJDAwkAAQIFAXoCBFVuaXQIBQJkUw9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCZFMJYm9keUJ5dGVzCQCRAwIIBQJkUwZwcm9vZnMAAAUCZFVvoN1x", "height": 2560086, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 617TnknFNAwzizwCivsmUUzV6gsPn5JUdC7pZg7jrRtZ Next: Hwgqr3CcNxEPcWdrLTREmK4tEcDnk1i1XqYTnQ9siYip Diff:
OldNewDifferences
226226
227227
228228 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
229-
230-
231-func keyAddonAddr () = "%s__addonAddr"
232229
233230
234231 let factoryDapp = readFactoryAddressOrFail()
560557 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
561558 let inPrAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil))
562559 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
563- let $t02268423037 = match res {
560+ let $t02262722980 = match res {
564561 case _ =>
565562 if (if (if ($isInstanceOf($match0._1, "Int"))
566563 then if ($isInstanceOf($match0._3, "Int"))
583580 }
584581 else throw("Couldn't cast types")
585582 }
586- let calcLpAmt = $t02268423037._1
587- let curPriceCalc = $t02268423037._2
588- let amBalance = $t02268423037._3
589- let prBalance = $t02268423037._4
590- let lpEmission = $t02268423037._5
583+ let calcLpAmt = $t02262722980._1
584+ let curPriceCalc = $t02262722980._2
585+ let amBalance = $t02262722980._3
586+ let prBalance = $t02262722980._4
587+ let lpEmission = $t02262722980._5
591588 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
592589 }
593590
618615 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
619616 let inAmAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil))
620617 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
621- let $t02561025963 = match res {
618+ let $t02555325906 = match res {
622619 case _ =>
623620 if (if (if ($isInstanceOf($match0._1, "Int"))
624621 then if ($isInstanceOf($match0._3, "Int"))
641638 }
642639 else throw("Couldn't cast types")
643640 }
644- let calcLpAmt = $t02561025963._1
645- let curPriceCalc = $t02561025963._2
646- let amBalance = $t02561025963._3
647- let prBalance = $t02561025963._4
648- let lpEmission = $t02561025963._5
641+ let calcLpAmt = $t02555325906._1
642+ let curPriceCalc = $t02555325906._2
643+ let amBalance = $t02555325906._3
644+ let prBalance = $t02555325906._4
645+ let lpEmission = $t02555325906._5
649646 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
650647 }
651648
655652 func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
656653 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
657654 let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
658- let $t02665827075 = match res {
655+ let $t02660127018 = match res {
659656 case _ =>
660657 if (if (if ($isInstanceOf($match0._1, "Int"))
661658 then if ($isInstanceOf($match0._2, "Int"))
684681 }
685682 else throw("Couldn't cast types")
686683 }
687- let outAmAmt = $t02665827075._1
688- let outPrAmt = $t02665827075._2
689- let amBalance = $t02665827075._3
690- let prBalance = $t02665827075._4
691- let lpEmission = $t02665827075._5
692- let curPrice = $t02665827075._6
693- let poolStatus = $t02665827075._7
684+ let outAmAmt = $t02660127018._1
685+ let outPrAmt = $t02660127018._2
686+ let amBalance = $t02660127018._3
687+ let prBalance = $t02660127018._4
688+ let lpEmission = $t02660127018._5
689+ let curPrice = $t02660127018._6
690+ let poolStatus = $t02660127018._7
694691 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
695692 }
696693
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
1414 let POOLWEIGHTMULT = MULT8
1515
1616 let zeroBigInt = toBigInt(0)
1717
1818 let idxPoolAddress = 1
1919
2020 let idxPoolStatus = 2
2121
2222 let idxPoolLPAssetId = 3
2323
2424 let idxAmtAssetId = 4
2525
2626 let idxPriceAssetId = 5
2727
2828 let idxAmtAssetDcm = 6
2929
3030 let idxPriceAssetDcm = 7
3131
3232 let idxIAmtAssetId = 8
3333
3434 let idxIPriceAssetId = 9
3535
3636 let idxLPAssetDcm = 10
3737
3838 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3939
4040
4141 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4242
4343
4444 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
4545
4646
4747 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
4848
4949
5050 func asAnyList (val) = match val {
5151 case valAnyLyst: List[Any] =>
5252 valAnyLyst
5353 case _ =>
5454 throw("fail to cast into List[Any]")
5555 }
5656
5757
5858 func asInt (val) = match val {
5959 case valInt: Int =>
6060 valInt
6161 case _ =>
6262 throw("fail to cast into Int")
6363 }
6464
6565
6666 func asString (val) = match val {
6767 case valStr: String =>
6868 valStr
6969 case _ =>
7070 throw("fail to cast into String")
7171 }
7272
7373
7474 func keyFactoryAddress () = "%s%s__config__factoryAddress"
7575
7676
7777 let IdxFactoryCfgStakingDapp = 1
7878
7979 let IdxFactoryCfgBoostingDapp = 2
8080
8181 let IdxFactoryCfgIdoDapp = 3
8282
8383 let IdxFactoryCfgTeamDapp = 4
8484
8585 let IdxFactoryCfgEmissionDapp = 5
8686
8787 let IdxFactoryCfgRestDapp = 6
8888
8989 let IdxFactoryCfgSlippageDapp = 7
9090
9191 let IdxFactoryCfgGwxRewardDapp = 8
9292
9393 func keyFactoryCfg () = "%s__factoryConfig"
9494
9595
9696 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9797
9898
9999 func keyFactoryLpList () = "%s__lpTokensList"
100100
101101
102102 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
103103
104104
105105 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
106106
107107
108108 func keyManagerVaultAddress () = "%s__managerVaultAddress"
109109
110110
111111 func keyManagerPublicKey () = "%s__managerPublicKey"
112112
113113
114114 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
115115
116116
117117 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
118118
119119
120120 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
121121
122122
123123 func getBoostingAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgBoostingDapp])
124124
125125
126126 func getEmissionAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgEmissionDapp])
127127
128128
129129 func getStakingAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgStakingDapp])
130130
131131
132132 func getGwxRewardAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgGwxRewardDapp])
133133
134134
135135 func getManagerAddressOrFail () = addressFromStringValue(getStringValue(keyManagerVaultAddress()))
136136
137137
138138 func keyBoostCfg () = "%s__config"
139139
140140
141141 func keyBoostingLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
142142
143143
144144 func keyBoostingStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
145145
146146
147147 func keyBoostingStatsLocksCount () = "%s%s__stats__locksCount"
148148
149149
150150 func keyBoostingStatsUsersCount () = "%s%s__stats__activeUsersCount"
151151
152152
153153 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
154154
155155
156156 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
157157
158158
159159 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
160160
161161
162162 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
163163
164164
165165 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
166166
167167
168168 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
169169
170170
171171 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
172172
173173
174174 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
175175
176176
177177 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
178178
179179
180180 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
181181
182182
183183 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
184184
185185
186186 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
187187
188188
189189 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
190190
191191
192192 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
193193
194194
195195 func keyTotalCachedGwx () = "%s%s__gwxCached__total"
196196
197197
198198 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
199199
200200
201201 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
202202
203203
204204 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
205205
206206
207207 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
208208
209209
210210 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
211211
212212
213213 func readStaked (stakingDapp,key) = valueOrElse(getInteger(stakingDapp, key), 0)
214214
215215
216216 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
217217
218218
219219 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
220220
221221
222222 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
223223
224224
225225 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
226226
227227
228228 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
229-
230-
231-func keyAddonAddr () = "%s__addonAddr"
232229
233230
234231 let factoryDapp = readFactoryAddressOrFail()
235232
236233 let factoryCfg = readFactoryCfgOrFail(factoryDapp)
237234
238235 let emissionDapp = getEmissionAddressOrFail(factoryCfg)
239236
240237 let stakingDapp = getStakingAddressOrFail(factoryCfg)
241238
242239 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
243240
244241 let boostingDapp = getBoostingAddressOrFail(factoryCfg)
245242
246243 func getPoolInFee (poolAddress) = {
247244 let @ = invoke(factoryDapp, "getInFeeREADONLY", [toString(poolAddress)], nil)
248245 if ($isInstanceOf(@, "Int"))
249246 then @
250247 else throw(($getType(@) + " couldn't be cast to Int"))
251248 }
252249
253250
254251 func getPoolOutFee (poolAddress) = {
255252 let @ = invoke(factoryDapp, "getOutFeeREADONLY", [toString(poolAddress)], nil)
256253 if ($isInstanceOf(@, "Int"))
257254 then @
258255 else throw(($getType(@) + " couldn't be cast to Int"))
259256 }
260257
261258
262259 func internalCurrentRewardRate (lpAssetId) = {
263260 let poolAddressStr = getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
264261 let poolWeightMult = MULT8
265262 let poolWeight = getIntegerValue(factoryDapp, keyFactoryPoolWeight(poolAddressStr))
266263 let wxEmissionPerBlock = getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent())
267264 let wxEmissionPerBlockMax = getIntOrFail(emissionDapp, keyEmissionRatePerBlockMaxCurrent())
268265 let boostMaxCoeff = {
269266 let @ = invoke(emissionDapp, "getBoostCoeffREADONLY", nil, nil)
270267 if ($isInstanceOf(@, "Int"))
271268 then @
272269 else throw(($getType(@) + " couldn't be cast to Int"))
273270 }
274271 let poolWxEmissionPerBlock = (fraction(wxEmissionPerBlock, poolWeight, poolWeightMult) / boostMaxCoeff)
275272 let poolWxEmissionPerBlockMax = fraction(wxEmissionPerBlockMax, poolWeight, poolWeightMult)
276273 let maxFactor = (boostMaxCoeff * MULT8)
277274 let totalLpStaked = getIntOrZero(stakingDapp, keyStakedTotal(lpAssetId))
278275 [poolWxEmissionPerBlock, maxFactor, totalLpStaked]
279276 }
280277
281278
282279 func calcGwxAmountStartREADONLY (lockAmount,lockDuration,maxLockDuration) = {
283280 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
284281 let gWxAmountStart = fraction(lockAmount, coeffX8, MULT8)
285282 [gWxAmountStart]
286283 }
287284
288285
289286 func getKey (addr,key,type) = if ((type == "string"))
290287 then getStringValue(addr, key)
291288 else if ((type == "integer"))
292289 then toString(getIntegerValue(addr, key))
293290 else if ((type == "boolean"))
294291 then toString(getBooleanValue(addr, key))
295292 else throw("unknown type. expected string/integer/boolean")
296293
297294
298295 func managerPublicKeyOrUnit () = {
299296 let managerVaultAddress = getManagerAddressOrFail()
300297 match getString(managerVaultAddress, keyManagerPublicKey()) {
301298 case s: String =>
302299 fromBase58String(s)
303300 case _: Unit =>
304301 unit
305302 case _ =>
306303 throw("Match error")
307304 }
308305 }
309306
310307
311308 func isManager (i) = match managerPublicKeyOrUnit() {
312309 case pk: ByteVector =>
313310 (i.callerPublicKey == pk)
314311 case _: Unit =>
315312 (i.caller == this)
316313 case _ =>
317314 throw("Match error")
318315 }
319316
320317
321318 func mustManager (i) = if (isManager(i))
322319 then true
323320 else throw("permission denied")
324321
325322
326323 @Callable(i)
327324 func constructor (factoryAddress) = {
328325 let checkCaller = mustManager(i)
329326 if ((checkCaller == checkCaller))
330327 then [StringEntry(keyFactoryAddress(), factoryAddress)]
331328 else throw("Strict value is not equal to itself.")
332329 }
333330
334331
335332
336333 @Callable(i)
337334 func currentRewardRateREADONLY (lpAssetId) = {
338335 let rewardData = internalCurrentRewardRate(lpAssetId)
339336 let wxEmissionPerBlock = rewardData[0]
340337 let maxFactor = rewardData[1]
341338 let totalLpStaked = rewardData[2]
342339 let votingResultStaked = {
343340 let @ = invoke(boostingDapp, "getVotingResultStakedREADONLY", [lpAssetId], nil)
344341 if ($isInstanceOf(@, "Int"))
345342 then @
346343 else throw(($getType(@) + " couldn't be cast to Int"))
347344 }
348345 $Tuple2(nil, makeString(["%d%d%d%d", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(votingResultStaked)], SEP))
349346 }
350347
351348
352349
353350 @Callable(i)
354351 func currentUserRewardRateREADONLY (lpAssetId,userAddress) = {
355352 let rewardData = internalCurrentRewardRate(lpAssetId)
356353 let wxEmissionPerBlock = rewardData[0]
357354 let maxFactor = rewardData[1]
358355 let totalLpStaked = rewardData[2]
359356 let lpStakedByUser = getIntOrZero(stakingDapp, keyStakedByUser(userAddress, lpAssetId))
360357 let userClaimInfo = split(asString(invoke(stakingDapp, "claimWxREADONLY", [lpAssetId, userAddress], nil)), SEP)
361358 let minRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[5]), "couldn't parse minRewardPart")
362359 let boostRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[6]), "couldn't parse boostRewardPart")
363360 let debug = userClaimInfo[7]
364361 let boostingPower = if ((boostRewardPart == 0))
365362 then (1 * MULT8)
366363 else fraction((minRewardPart + boostRewardPart), MULT8, minRewardPart)
367364 $Tuple2(nil, makeString(["%d%d%d%d%d%s", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower), debug], SEP))
368365 }
369366
370367
371368
372369 @Callable(i)
373370 func calcBoostBulkInternalREADONLY (currentIter,deltaWxAmountBulk,deltaLockPeriodInBlocksBulk,deltaLpAmountBulk,lpAssetIdOptBulk,userAddressOpt,resAcc) = if ((currentIter == size(deltaWxAmountBulk)))
374371 then $Tuple2(nil, resAcc)
375372 else {
376373 let deltaWxAmount = deltaWxAmountBulk[currentIter]
377374 let deltaLockPeriodInBlocks = deltaLockPeriodInBlocksBulk[currentIter]
378375 let deltaLpAmount = deltaLpAmountBulk[currentIter]
379376 let lpAssetIdOpt = lpAssetIdOptBulk[currentIter]
380377 let info = {
381378 let @ = invoke(this, "calcBoostREADONLY", [deltaWxAmount, deltaLockPeriodInBlocks, deltaLpAmount, lpAssetIdOpt, userAddressOpt], nil)
382379 if ($isInstanceOf(@, "String"))
383380 then @
384381 else throw(($getType(@) + " couldn't be cast to String"))
385382 }
386383 let res = (resAcc :+ info)
387384 let inv = {
388385 let @ = invoke(this, "calcBoostBulkInternalREADONLY", [(currentIter + 1), deltaWxAmountBulk, deltaLockPeriodInBlocksBulk, deltaLpAmountBulk, lpAssetIdOptBulk, userAddressOpt, res], nil)
389386 if ($isInstanceOf(@, "List[Any]"))
390387 then @
391388 else throw(($getType(@) + " couldn't be cast to List[Any]"))
392389 }
393390 if ((inv == inv))
394391 then $Tuple2(nil, inv)
395392 else throw("Strict value is not equal to itself.")
396393 }
397394
398395
399396
400397 @Callable(i)
401398 func calcBoostBulkREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
402399 let res = invoke(this, "calcBoostBulkInternalREADONLY", [0, deltaWxAmount, deltaLockPeriodInBlocks, deltaLpAmount, lpAssetIdOpt, userAddressOpt, nil], nil)
403400 $Tuple2(nil, res)
404401 }
405402
406403
407404
408405 @Callable(i)
409406 func calcBoostREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
410407 let boostCoeff = {
411408 let @ = invoke(emissionDapp, "getBoostCoeffREADONLY", nil, nil)
412409 if ($isInstanceOf(@, "Int"))
413410 then @
414411 else throw(($getType(@) + " couldn't be cast to Int"))
415412 }
416413 let mathDapp = gwxRewardDapp
417414 let EMPTYSTR = "empty"
418415 let maxLockDurationInBlocks = parseIntValue(split(getStringByAddressOrFail(boostingDapp, keyBoostCfg()), SEP)[4])
419416 let lpAssetIdStr = if ((lpAssetIdOpt == ""))
420417 then EMPTYSTR
421418 else lpAssetIdOpt
422419 let userAddressStr = if ((userAddressOpt == ""))
423420 then EMPTYSTR
424421 else userAddressOpt
425422 let userNumStr = valueOrElse(getString(boostingDapp, keyUser2NumMapping(userAddressOpt)), EMPTYSTR)
426423 let userAmount = valueOrElse(getInteger(boostingDapp, keyLockParamUserAmount(userNumStr)), 0)
427424 let lockStart = valueOrElse(getInteger(boostingDapp, keyLockParamStartBlock(userNumStr)), height)
428425 let lockDuration = valueOrElse(getInteger(boostingDapp, keyLockParamDuration(userNumStr)), 0)
429426 let lockEnd = (lockStart + lockDuration)
430427 let remainingDuration = max([(lockEnd - height), 0])
431428 let userAmountNew = (userAmount + deltaWxAmount)
432429 let lockDurationNew = min([(remainingDuration + deltaLockPeriodInBlocks), maxLockDurationInBlocks])
433430 let userCurrgWxAmount = asInt(asAnyList(invoke(boostingDapp, "gwxUserInfoREADONLY", [userAddressStr], nil))[0])
434431 let gWxAmountStartNew = calcGwxAmountStartREADONLY(userAmountNew, lockDurationNew, maxLockDurationInBlocks)[0]
435432 let totalCachedGwx = {
436433 let @ = invoke(boostingDapp, "getTotalCachedGwxREADONLY", nil, nil)
437434 if ($isInstanceOf(@, "Int"))
438435 then @
439436 else throw(($getType(@) + " couldn't be cast to Int"))
440437 }
441438 let MULT3 = 1000
442439 let wxEmissionPerBlockX3 = (getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent()) * MULT3)
443440 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
444441 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
445442 let stakedByUser = readStaked(stakingDapp, stakedByUserKEY)
446443 let stakedTotal = readStaked(stakingDapp, stakedTotalKEY)
447444 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
448445 then {
449446 let poolAddressStr = valueOrErrorMessage(getString(factoryDapp, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
450447 getIntegerValue(factoryDapp, keyFactoryPoolWeight(poolAddressStr))
451448 }
452449 else 0
453450 let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * boostCoeff))
454451 let wxPerLpX3 = if ((stakedTotal != 0))
455452 then fraction(poolWxEmissionPerBlockX3, MULT8, stakedTotal)
456453 else 0
457454 let userWxPerBlockX3 = fraction(wxPerLpX3, stakedByUser, MULT8)
458455 let boostEmissionPerBlockX3 = (poolWxEmissionPerBlockX3 * (boostCoeff - 1))
459456 let tmpUserBoostPerBlockX3 = fraction(userCurrgWxAmount, boostEmissionPerBlockX3, totalCachedGwx)
460457 let userBoostPerBlockX3 = min([tmpUserBoostPerBlockX3, (userWxPerBlockX3 * (boostCoeff - 1))])
461458 let userBoostCoeff = if ((userWxPerBlockX3 == 0))
462459 then (1 * MULT8)
463460 else fraction((userBoostPerBlockX3 + userWxPerBlockX3), MULT8, userWxPerBlockX3)
464461 $Tuple2(nil, makeString(["%d%d%s", toString(gWxAmountStartNew), toString(userBoostCoeff), "d"], SEP))
465462 }
466463
467464
468465
469466 @Callable(i)
470467 func wxEmissionStatsREADONLY () = {
471468 let ONEMULT = toString(MULT8)
472469 let ONE = "1"
473470 let wxEmissionPerBlock = getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent())
474471 let emissionStartBlock = getIntOrFail(emissionDapp, keyEmissionStartBlock())
475472 let passedBlocks = if ((emissionStartBlock > height))
476473 then 0
477474 else (height - emissionStartBlock)
478475 let teamEmDuration = (1440 * 365)
479476 let teamEmMax = (201000000 * MULT8)
480477 let teamEm = if ((passedBlocks > teamEmDuration))
481478 then teamEmMax
482479 else fraction(teamEmMax, passedBlocks, teamEmDuration)
483480 let totalWxReleased = ((wxEmissionPerBlock * passedBlocks) + teamEm)
484481 let totalWxLocked = getIntOrZero(boostingDapp, keyBoostingLockParamTotalAmount())
485482 let locksDurationSumInBlocks = getIntOrZero(boostingDapp, keyBoostingStatsLocksDurationSumInBlocks())
486483 let locksCount = getIntOrZero(boostingDapp, keyBoostingStatsLocksCount())
487484 $Tuple2(nil, makeString(["%d%d%d%d", toString(totalWxReleased), toString(totalWxLocked), toString(locksDurationSumInBlocks), toString(locksCount)], SEP))
488485 }
489486
490487
491488
492489 @Callable(i)
493490 func poolStatsREADONLY (lpAsset) = {
494491 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
495492 let status = {
496493 let @ = invoke(factoryDapp, "getPoolStatusREADONLY", [toString(poolAddress)], nil)
497494 if ($isInstanceOf(@, "Int"))
498495 then @
499496 else throw(($getType(@) + " couldn't be cast to Int"))
500497 }
501498 let tpl = "%d%d%d%d%d%d%d%d%d%s"
502499 if ((status == 4))
503500 then $Tuple2(nil, makeString([tpl, toString(0), toString(0), toString(0), toString(0), toString(0), toString(0), toString(0), toString(0), toString(0), toString(false)], SEP))
504501 else {
505502 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
506503 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
507504 let amtAssetId = asString(cfg[idxAmtAssetId])
508505 let priceAssetId = asString(cfg[idxPriceAssetId])
509506 let iAmtAssetId = asString(cfg[idxIAmtAssetId])
510507 let iPriceAssetId = asString(cfg[idxIPriceAssetId])
511508 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
512509 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
513510 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
514511 let accAmtAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil))
515512 let accPriceAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil))
516513 let pricesList = if ((poolLPBalance == 0))
517514 then [toString(zeroBigInt), toString(zeroBigInt), toString(zeroBigInt)]
518515 else asAnyList(invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil))
519516 let curPrice = 0
520517 let lpAmtAssetShare = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil))
521518 let lpPriceAssetShare = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil))
522519 let poolWeight = getIntegerValue(factoryDapp, keyFactoryPoolWeight(toString(poolAddress)))
523520 let inFee = getPoolInFee(poolAddress)
524521 let outFee = getPoolOutFee(poolAddress)
525522 let poolOneTokenOperationsDisabled = {
526523 let @ = invoke(factoryDapp, "isPoolOneTokenOperationsDisabledREADONLY", [toString(poolAddress)], nil)
527524 if ($isInstanceOf(@, "Boolean"))
528525 then @
529526 else throw(($getType(@) + " couldn't be cast to Boolean"))
530527 }
531528 let poolOneTokenOperationsEnabled = !(poolOneTokenOperationsDisabled)
532529 $Tuple2(nil, makeString([tpl, toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight), toString(inFee), toString(outFee), toString(poolOneTokenOperationsEnabled)], SEP))
533530 }
534531 }
535532
536533
537534
538535 @Callable(i)
539536 func poolEvaluatePutByAmountAssetREADONLY (lpAsset,inAmAssetAmt) = {
540537 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
541538 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
542539 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
543540 let amAssetIdStr = asString(cfg[idxAmtAssetId])
544541 let amAssetId = fromBase58String(amAssetIdStr)
545542 let prAssetIdStr = asString(cfg[idxPriceAssetId])
546543 let prAssetId = fromBase58String(prAssetIdStr)
547544 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
548545 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
549546 let poolStatus = asString(cfg[idxPoolStatus])
550547 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
551548 let accAmtAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil))
552549 let accPriceAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil))
553550 let amtAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [accAmtAssetBalance, amtAssetDcm], nil)))
554551 let priceAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [accPriceAssetBalance, priceAssetDcm], nil)))
555552 let curPriceX18 = if ((poolLPBalance == 0))
556553 then zeroBigInt
557554 else parseBigIntValue(asString(invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(priceAssetAmtX18), toString(amtAssetAmtX18)], nil)))
558555 let curPrice = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil))
559556 let inAmAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [inAmAssetAmt, amtAssetDcm], nil)))
560557 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
561558 let inPrAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil))
562559 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
563- let $t02268423037 = match res {
560+ let $t02262722980 = match res {
564561 case _ =>
565562 if (if (if ($isInstanceOf($match0._1, "Int"))
566563 then if ($isInstanceOf($match0._3, "Int"))
567564 then if ($isInstanceOf($match0._4, "Int"))
568565 then if ($isInstanceOf($match0._5, "Int"))
569566 then $isInstanceOf($match0._6, "Int")
570567 else false
571568 else false
572569 else false
573570 else false)
574571 then (size($match0) == 13)
575572 else false)
576573 then {
577574 let calcLpAmt = $match0._1
578575 let curPriceCalc = $match0._3
579576 let amBalance = $match0._4
580577 let prBalance = $match0._5
581578 let lpEmission = $match0._6
582579 $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
583580 }
584581 else throw("Couldn't cast types")
585582 }
586- let calcLpAmt = $t02268423037._1
587- let curPriceCalc = $t02268423037._2
588- let amBalance = $t02268423037._3
589- let prBalance = $t02268423037._4
590- let lpEmission = $t02268423037._5
583+ let calcLpAmt = $t02262722980._1
584+ let curPriceCalc = $t02262722980._2
585+ let amBalance = $t02262722980._3
586+ let prBalance = $t02262722980._4
587+ let lpEmission = $t02262722980._5
591588 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
592589 }
593590
594591
595592
596593 @Callable(i)
597594 func poolEvaluatePutByPriceAssetREADONLY (lpAsset,inPrAssetAmt) = {
598595 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
599596 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
600597 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
601598 let amAssetIdStr = asString(cfg[idxAmtAssetId])
602599 let amAssetId = fromBase58String(amAssetIdStr)
603600 let prAssetIdStr = asString(cfg[idxPriceAssetId])
604601 let prAssetId = fromBase58String(prAssetIdStr)
605602 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
606603 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
607604 let poolStatus = asString(cfg[idxPoolStatus])
608605 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
609606 let amBalanceRaw = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil))
610607 let prBalanceRaw = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil))
611608 let amBalanceRawX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [amBalanceRaw, amtAssetDcm], nil)))
612609 let prBalanceRawX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [prBalanceRaw, priceAssetDcm], nil)))
613610 let curPriceX18 = if ((poolLPBalance == 0))
614611 then zeroBigInt
615612 else parseBigIntValue(asString(invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(prBalanceRawX18), toString(amBalanceRawX18)], nil)))
616613 let curPrice = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil))
617614 let inPrAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [inPrAssetAmt, priceAssetDcm], nil)))
618615 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
619616 let inAmAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil))
620617 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
621- let $t02561025963 = match res {
618+ let $t02555325906 = match res {
622619 case _ =>
623620 if (if (if ($isInstanceOf($match0._1, "Int"))
624621 then if ($isInstanceOf($match0._3, "Int"))
625622 then if ($isInstanceOf($match0._4, "Int"))
626623 then if ($isInstanceOf($match0._5, "Int"))
627624 then $isInstanceOf($match0._6, "Int")
628625 else false
629626 else false
630627 else false
631628 else false)
632629 then (size($match0) == 13)
633630 else false)
634631 then {
635632 let calcLpAmt = $match0._1
636633 let curPriceCalc = $match0._3
637634 let amBalance = $match0._4
638635 let prBalance = $match0._5
639636 let lpEmission = $match0._6
640637 $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
641638 }
642639 else throw("Couldn't cast types")
643640 }
644- let calcLpAmt = $t02561025963._1
645- let curPriceCalc = $t02561025963._2
646- let amBalance = $t02561025963._3
647- let prBalance = $t02561025963._4
648- let lpEmission = $t02561025963._5
641+ let calcLpAmt = $t02555325906._1
642+ let curPriceCalc = $t02555325906._2
643+ let amBalance = $t02555325906._3
644+ let prBalance = $t02555325906._4
645+ let lpEmission = $t02555325906._5
649646 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
650647 }
651648
652649
653650
654651 @Callable(i)
655652 func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
656653 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
657654 let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
658- let $t02665827075 = match res {
655+ let $t02660127018 = match res {
659656 case _ =>
660657 if (if (if ($isInstanceOf($match0._1, "Int"))
661658 then if ($isInstanceOf($match0._2, "Int"))
662659 then if ($isInstanceOf($match0._5, "Int"))
663660 then if ($isInstanceOf($match0._6, "Int"))
664661 then if ($isInstanceOf($match0._7, "Int"))
665662 then if ($isInstanceOf($match0._8, "String"))
666663 then $isInstanceOf($match0._9, "String")
667664 else false
668665 else false
669666 else false
670667 else false
671668 else false
672669 else false)
673670 then (size($match0) == 10)
674671 else false)
675672 then {
676673 let outAmAmt = $match0._1
677674 let outPrAmt = $match0._2
678675 let amBalance = $match0._5
679676 let prBalance = $match0._6
680677 let lpEmission = $match0._7
681678 let curPrice = $match0._8
682679 let poolStatus = $match0._9
683680 $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
684681 }
685682 else throw("Couldn't cast types")
686683 }
687- let outAmAmt = $t02665827075._1
688- let outPrAmt = $t02665827075._2
689- let amBalance = $t02665827075._3
690- let prBalance = $t02665827075._4
691- let lpEmission = $t02665827075._5
692- let curPrice = $t02665827075._6
693- let poolStatus = $t02665827075._7
684+ let outAmAmt = $t02660127018._1
685+ let outPrAmt = $t02660127018._2
686+ let amBalance = $t02660127018._3
687+ let prBalance = $t02660127018._4
688+ let lpEmission = $t02660127018._5
689+ let curPrice = $t02660127018._6
690+ let poolStatus = $t02660127018._7
694691 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
695692 }
696693
697694
698695
699696 @Callable(i)
700697 func gwxUserInfoREADONLY (userAddress) = {
701698 let gwxUserInfoLIST = asAnyList(invoke(boostingDapp, "gwxUserInfoREADONLY", [userAddress], nil))
702699 let gwxAmount = asInt(gwxUserInfoLIST[0])
703700 $Tuple2(nil, makeString(["%d", toString(gwxAmount)], SEP))
704701 }
705702
706703
707704
708705 @Callable(i)
709706 func unstakeAndGetOneTknV2 (poolAddress,unstakeAmount,outAssetId,minOutAmount) = {
710707 let inv = invoke(addressFromStringValue(poolAddress), "unstakeAndGetOneTknV2", [unstakeAmount, outAssetId, minOutAmount], nil)
711708 if ((inv == inv))
712709 then $Tuple2(nil, unit)
713710 else throw("Strict value is not equal to itself.")
714711 }
715712
716713
717714
718715 @Callable(i)
719716 func getKeysBulkInternal (currentIter,keys,resAcc) = if ((currentIter == size(keys)))
720717 then $Tuple2(nil, resAcc)
721718 else {
722719 let k = split(keys[currentIter], "++")
723720 let addr = addressFromStringValue(k[0])
724721 let key = k[1]
725722 let type = k[2]
726723 let val = getKey(addr, key, type)
727724 let res = (resAcc :+ val)
728725 let inv = invoke(this, "getKeysBulkInternal", [(currentIter + 1), keys, res], nil)
729726 if ((inv == inv))
730727 then $Tuple2(nil, inv)
731728 else throw("Strict value is not equal to itself.")
732729 }
733730
734731
735732
736733 @Callable(i)
737734 func getKeysBulk (keys) = {
738735 let res = invoke(this, "getKeysBulkInternal", [0, keys, nil], nil)
739736 $Tuple2(nil, res)
740737 }
741738
742739
743740 @Verifier(tx)
744741 func verify () = {
745742 let targetPublicKey = match managerPublicKeyOrUnit() {
746743 case pk: ByteVector =>
747744 pk
748745 case _: Unit =>
749746 tx.senderPublicKey
750747 case _ =>
751748 throw("Match error")
752749 }
753750 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
754751 }
755752

github/deemru/w8io/873ac7e 
109.61 ms