tx · 5wSC8Gnfhet32BySVqdcrRAWmZcKS93kdyP6FzqZRgzh

3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp:  -0.02300000 Waves

2022.11.21 14:31 [2326821] smart account 3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp > SELF 0.00000000 Waves

{ "type": 13, "id": "5wSC8Gnfhet32BySVqdcrRAWmZcKS93kdyP6FzqZRgzh", "fee": 2300000, "feeAssetId": null, "timestamp": 1669030301787, "version": 1, "sender": "3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp", "senderPublicKey": "86RHVxKovtU7yKnepY8wKsd8niDxGAsiwuA1XA1DNqrS", "proofs": [ "4JM9mEByR2v5kfaPNf2FssGKQeapziTsm3f62QAa1HtK2vCGVzjBxsPGivF3qFaN6nTEWJ4kvHuske49J1gAVTxV" ], "script": "base64:BgKeIggCEgMKAQgSAwoBCBIECgIICBIJCgcBERERGAgYEgcKBRERERgIEgcKBQEBAQgIEgASAwoBCBIECgIIARIECgIIARIECgIIARIDCgEIEgYKBAgBCAESBQoDARgYEgMKARgSAwoBCBIAIg50ZXN0c3RzdHN0c3RzdCIGU0NBTEU4IgVNVUxUOCIHU0NBTEUxOCIGTVVMVDE4IgNTRVAiDlBPT0xXRUlHSFRNVUxUIgp6ZXJvQmlnSW50Ig5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iD2dldFN0cmluZ09yRmFpbCIDa2V5IhhnZXRTdHJpbmdCeUFkZHJlc3NPckZhaWwiB2FkZHJlc3MiDGdldEludE9yWmVybyIMZ2V0SW50T3JGYWlsIglhc0FueUxpc3QiA3ZhbCIHJG1hdGNoMCIKdmFsQW55THlzdCIFYXNJbnQiBnZhbEludCIIYXNTdHJpbmciBnZhbFN0ciIRa2V5RmFjdG9yeUFkZHJlc3MiE2tleU1hbmFnZXJQdWJsaWNLZXkiGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiDWtleUZhY3RvcnlDZmciGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nIgpscEFzc2V0U3RyIhBrZXlGYWN0b3J5THBMaXN0IiZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcyIUa2V5RmFjdG9yeVBvb2xXZWlnaHQiD2NvbnRyYWN0QWRkcmVzcyIYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsIgpyZWFkTHBMaXN0IhRyZWFkRmFjdG9yeUNmZ09yRmFpbCIHZmFjdG9yeSIYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsIgRmQ2ZnIhhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwiF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsIhlnZXRHd3hSZXdhcmRBZGRyZXNzT3JGYWlsIgtrZXlCb29zdENmZyIfa2V5Qm9vc3RpbmdMb2NrUGFyYW1Ub3RhbEFtb3VudCIoa2V5Qm9vc3RpbmdTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcyIaa2V5Qm9vc3RpbmdTdGF0c0xvY2tzQ291bnQiGmtleUJvb3N0aW5nU3RhdHNVc2Vyc0NvdW50IhJrZXlVc2VyMk51bU1hcHBpbmciC3VzZXJBZGRyZXNzIhJrZXlOdW0yVXNlck1hcHBpbmciA251bSIWa2V5TG9ja1BhcmFtVXNlckFtb3VudCIHdXNlck51bSIWa2V5TG9ja1BhcmFtU3RhcnRCbG9jayIUa2V5TG9ja1BhcmFtRHVyYXRpb24iDWtleUxvY2tQYXJhbUsiDWtleUxvY2tQYXJhbUIiFWtleUxvY2tQYXJhbUJ5UGVyaW9kSyIGcGVyaW9kIhVrZXlMb2NrUGFyYW1CeVBlcmlvZEIiIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMIhdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTCIYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMIiFrZXlVc2VyQm9vc3RBdmFsYWlibGVUb0NsYWltVG90YWwiE2tleVVzZXJCb29zdENsYWltZWQiEWtleVRvdGFsQ2FjaGVkR3d4Ig9rZXlTdGFrZWRCeVVzZXIiDnVzZXJBZGRyZXNzU3RyIgxscEFzc2V0SWRTdHIiDmtleVN0YWtlZFRvdGFsIhBrZXlDbGFpbWVkQnlVc2VyIhlrZXlDbGFpbWVkQnlVc2VyTWluUmV3YXJkIhtrZXlDbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQiCnJlYWRTdGFrZWQiC3N0YWtpbmdEYXBwIh5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQiIWtleUVtaXNzaW9uUmF0ZVBlckJsb2NrTWF4Q3VycmVudCIVa2V5RW1pc3Npb25TdGFydEJsb2NrIhtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MiE2tleUVtaXNzaW9uRW5kQmxvY2siDGtleUFkZG9uQWRkciIKZ2V0UG9vbEZlZSILcG9vbEFkZHJlc3MiCmZlZURlZmF1bHQiBmtleUZlZSILZmFjdG9yeURhcHAiCmZhY3RvcnlDZmciDGVtaXNzaW9uRGFwcCINZ3d4UmV3YXJkRGFwcCIMYm9vc3RpbmdEYXBwIhlpbnRlcm5hbEN1cnJlbnRSZXdhcmRSYXRlIglscEFzc2V0SWQiDnBvb2xBZGRyZXNzU3RyIg5wb29sV2VpZ2h0TXVsdCIKcG9vbFdlaWdodCISd3hFbWlzc2lvblBlckJsb2NrIhV3eEVtaXNzaW9uUGVyQmxvY2tNYXgiDWJvb3N0TWF4Q29lZmYiFnBvb2xXeEVtaXNzaW9uUGVyQmxvY2siGXBvb2xXeEVtaXNzaW9uUGVyQmxvY2tNYXgiCW1heEZhY3RvciINdG90YWxMcFN0YWtlZCIaY2FsY0d3eEFtb3VudFN0YXJ0UkVBRE9OTFkiCmxvY2tBbW91bnQiDGxvY2tEdXJhdGlvbiIPbWF4TG9ja0R1cmF0aW9uIgdjb2VmZlg4Ig5nV3hBbW91bnRTdGFydCIGZ2V0S2V5IgRhZGRyIgR0eXBlIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IgFzIh1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCILbXVzdE1hbmFnZXIiAWkiAnBkIgJwayIOZmFjdG9yeUFkZHJlc3MiC2NoZWNrQ2FsbGVyIgpyZXdhcmREYXRhIg5scFN0YWtlZEJ5VXNlciINdXNlckNsYWltSW5mbyINbWluUmV3YXJkUGFydCIPYm9vc3RSZXdhcmRQYXJ0IgVkZWJ1ZyINYm9vc3RpbmdQb3dlciILY3VycmVudEl0ZXIiEWRlbHRhV3hBbW91bnRCdWxrIhtkZWx0YUxvY2tQZXJpb2RJbkJsb2Nrc0J1bGsiEWRlbHRhTHBBbW91bnRCdWxrIhBscEFzc2V0SWRPcHRCdWxrIg51c2VyQWRkcmVzc09wdCIGcmVzQWNjIg1kZWx0YVd4QW1vdW50IhdkZWx0YUxvY2tQZXJpb2RJbkJsb2NrcyINZGVsdGFMcEFtb3VudCIMbHBBc3NldElkT3B0IgRpbmZvIgFAIgNyZXMiA2ludiIIbWF0aERhcHAiCEVNUFRZU1RSIhdtYXhMb2NrRHVyYXRpb25JbkJsb2NrcyIKdXNlck51bVN0ciIKdXNlckFtb3VudCIJbG9ja1N0YXJ0Igdsb2NrRW5kIhFyZW1haW5pbmdEdXJhdGlvbiINdXNlckFtb3VudE5ldyIPbG9ja0R1cmF0aW9uTmV3IhF1c2VyQ3VycmdXeEFtb3VudCIRZ1d4QW1vdW50U3RhcnROZXciE2dXeFBhcmFtc1Jlc3VsdExpc3QiDWdXeEFtb3VudERpZmYiAWsiAWIiGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWSIRdG90YWxDYWNoZWRHd3hLRVkiEnVzZXJNYXhCb29zdEludE5ldyIQdG90YWxNYXhCb29zdEludCIOdG90YWxDYWNoZWRHd3giBU1VTFQzIhR3eEVtaXNzaW9uUGVyQmxvY2tYMyIPc3Rha2VkQnlVc2VyS0VZIg5zdGFrZWRUb3RhbEtFWSIMc3Rha2VkQnlVc2VyIgtzdGFrZWRUb3RhbCIPc3Rha2VkQnlVc2VyTmV3Ig5zdGFrZWRUb3RhbE5ldyIYcG9vbFd4RW1pc3Npb25QZXJCbG9ja1gzIgl3eFBlckxwWDMiEHVzZXJXeFBlckJsb2NrWDMiF2Jvb3N0RW1pc3Npb25QZXJCbG9ja1gzIhZ0bXBVc2VyQm9vc3RQZXJCbG9ja1gzIhN1c2VyQm9vc3RQZXJCbG9ja1gzIgpib29zdENvZWZmIgdPTkVNVUxUIgNPTkUiEmVtaXNzaW9uU3RhcnRCbG9jayIMcGFzc2VkQmxvY2tzIg50ZWFtRW1EdXJhdGlvbiIJdGVhbUVtTWF4IgZ0ZWFtRW0iD3RvdGFsV3hSZWxlYXNlZCINdG90YWxXeExvY2tlZCIYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzIgpsb2Nrc0NvdW50IgdscEFzc2V0IgNjZmciCmFtdEFzc2V0SWQiDHByaWNlQXNzZXRJZCILaUFtdEFzc2V0SWQiDWlQcmljZUFzc2V0SWQiC2FtdEFzc2V0RGNtIg1wcmljZUFzc2V0RGNtIg1wb29sTFBCYWxhbmNlIhJhY2NBbXRBc3NldEJhbGFuY2UiFGFjY1ByaWNlQXNzZXRCYWxhbmNlIgpwcmljZXNMaXN0IghjdXJQcmljZSIPbHBBbXRBc3NldFNoYXJlIhFscFByaWNlQXNzZXRTaGFyZSIDZmVlIh5wb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiHXBvb2xPbmVUb2tlbk9wZXJhdGlvbnNFbmFibGVkIgxpbkFtQXNzZXRBbXQiDGFtQXNzZXRJZFN0ciIJYW1Bc3NldElkIgxwckFzc2V0SWRTdHIiCXByQXNzZXRJZCIKcG9vbFN0YXR1cyIOYW10QXNzZXRBbXRYMTgiEHByaWNlQXNzZXRBbXRYMTgiC2N1clByaWNlWDE4Ig9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMaW5QckFzc2V0QW10Ig0kdDAyMjcyMzIzMDc2IgljYWxjTHBBbXQiDGN1clByaWNlQ2FsYyIJYW1CYWxhbmNlIglwckJhbGFuY2UiCmxwRW1pc3Npb24iDGFtQmFsYW5jZVJhdyIMcHJCYWxhbmNlUmF3Ig9hbUJhbGFuY2VSYXdYMTgiD3ByQmFsYW5jZVJhd1gxOCINJHQwMjU2NDkyNjAwMiIQcGF5bWVudExwQXNzZXRJZCIMcGF5bWVudExwQW10Ig0kdDAyNjY5NzI3MTE0IghvdXRBbUFtdCIIb3V0UHJBbXQiD2d3eFVzZXJJbmZvTElTVCIJZ3d4QW1vdW50Ig11bnN0YWtlQW1vdW50IgpvdXRBc3NldElkIgxtaW5PdXRBbW91bnQiBGtleXMiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5XQABYQABAAFiAAgAAWMAgMLXLwABZAASAAFlCQC2AgEAgICQu7rWrfANAAFmAgJfXwABZwUBYwABaAkAtgIBAAAAAWkAAQABagACAAFrAAMAAWwABAABbQAFAAFuAAYAAW8ABwABcAAIAAFxAAkAAXIACgEBcwEBdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFAXQJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAXQCDyBpcyBub3QgZGVmaW5lZAEBdQIBdgF0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUBdgUBdAkArAICCQCsAgIJAKwCAgkArAICAgptYW5kYXRvcnkgCQClCAEFAXYCAS4FAXQCDyBpcyBub3QgZGVmaW5lZAEBdwIBdgF0CQELdmFsdWVPckVsc2UCCQCaCAIFAXYFAXQAAAEBeAIBdgF0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBdgUBdAkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUBdAIPIGlzIG5vdCBkZWZpbmVkAQF5AQF6BAFBBQF6AwkAAQIFAUECCUxpc3RbQW55XQQBQgUBQQUBQgkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEBQwEBegQBQQUBegMJAAECBQFBAgNJbnQEAUQFAUEFAUQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBAUUBAXoEAUEFAXoDCQABAgUBQQIGU3RyaW5nBAFGBQFBBQFGCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQFHAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwEBSAACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFJAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAFKAAEAAUsAAgABTAADAAFNAAQAAU4ABQABTwAGAAFQAAcAAVEACAEBUgACESVzX19mYWN0b3J5Q29uZmlnAQFTAQFUCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAVQJAMwIAgIebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQNuaWwFAWYBAVUAAhAlc19fbHBUb2tlbnNMaXN0AQFWAQFUCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAVQJAMwIAgIebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQNuaWwFAWYBAVcBAVgJALkJAgkAzAgCAgQlcyVzCQDMCAICCnBvb2xXZWlnaHQJAMwIAgUBWAUDbmlsBQFmAQFZAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAXMBCQEBRwABAVoACQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgkBAVkACQEBVQACAAUBZgECYWEBAmFiCQC1CQIJAQF1AgUCYWIJAQFSAAUBZgECYWMBAmFkCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFkBQFLAQJhZQECYWQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWQFAU4BAmFmAQJhZAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhZAUBSgECYWcBAmFkCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFkBQFRAQJhaAACCiVzX19jb25maWcBAmFpAAIeJXMlc19fc3RhdHNfX2FjdGl2ZVRvdGFsTG9ja2VkAQJhagACJSVzJXNfX3N0YXRzX19sb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MBAmFrAAIXJXMlc19fc3RhdHNfX2xvY2tzQ291bnQBAmFsAAIdJXMlc19fc3RhdHNfX2FjdGl2ZVVzZXJzQ291bnQBAmFtAQJhbgkAuQkCCQDMCAICGSVzJXMlc19fbWFwcGluZ19fdXNlcjJudW0JAMwIAgUCYW4FA25pbAUBZgECYW8BAmFwCQC5CQIJAMwIAgIZJXMlcyVzX19tYXBwaW5nX19udW0ydXNlcgkAzAgCBQJhcAUDbmlsBQFmAQJhcQECYXIJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFyCQDMCAICBmFtb3VudAUDbmlsBQFmAQJhcwECYXIJALkJAgkAzAgCAhYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQDMCAIFAmFyCQDMCAICBXN0YXJ0BQNuaWwFAWYBAmF0AQJhcgkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYXIJAMwIAgIIZHVyYXRpb24FA25pbAUBZgECYXUBAmFyCQC5CQIJAMwIAgIWJXMlZCVzX19wYXJhbUJ5VXNlck51bQkAzAgCBQJhcgkAzAgCAgFrBQNuaWwFAWYBAmF2AQJhcgkAuQkCCQDMCAICFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAMwIAgUCYXIJAMwIAgIBYgUDbmlsBQFmAQJhdwICYXICYXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCBQJhcgkAzAgCAgFrCQDMCAIFAmF4BQNuaWwFAWYBAmF5AgJhcgJheAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIFAmFyCQDMCAICAWIJAMwIAgUCYXgFA25pbAUBZgECYXoBAmFyCQC5CQIJAMwIAgIeJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50CQDMCAIFAmFyBQNuaWwFAWYBAmFBAQJhcgkAuQkCCQDMCAICESVzJWRfX21heEJvb3N0SW50CQDMCAIFAmFyBQNuaWwFAWYBAmFCAAIYJXMlc19fbWF4Qm9vc3RJbnRfX3RvdGFsAQJhQwECYXIJALkJAgkAzAgCAiQlcyVkX191c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwJAMwIAgUCYXIFA25pbAUBZgECYUQBAmFyCQC5CQIJAMwIAgIWJXMlZF9fdXNlckJvb3N0Q2xhaW1lZAkAzAgCBQJhcgUDbmlsBQFmAQJhRQACFiVzJXNfX2d3eENhY2hlZF9fdG90YWwBAmFGAgJhRwJhSAkAuQkCCQDMCAICDiVzJXMlc19fc3Rha2VkCQDMCAIFAmFHCQDMCAIFAmFIBQNuaWwFAWYBAmFJAQJhSAkArAICAhclcyVzJXNfX3N0YWtlZF9fdG90YWxfXwUCYUgBAmFKAgJhSAJhRwkAuQkCCQDMCAICDyVzJXMlc19fY2xhaW1lZAkAzAgCBQJhRwkAzAgCBQJhSAUDbmlsBQFmAQJhSwICYUgCYUcJALkJAgkAzAgCAhglcyVzJXNfX2NsYWltZWRNaW5SZXdhcmQJAMwIAgUCYUcJAMwIAgUCYUgFA25pbAUBZgECYUwCAmFIAmFHCQC5CQIJAMwIAgIaJXMlcyVzX19jbGFpbWVkQm9vc3RSZXdhcmQJAMwIAgUCYUcJAMwIAgUCYUgFA25pbAUBZgECYU0CAmFOAXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYU4FAXQAAAECYU8AAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAmFQAAIeJXMlc19fcmF0ZVBlckJsb2NrTWF4X19jdXJyZW50AQJhUQACGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQJhUgACGCVzJXNfX2VtaXNzaW9uX19kdXJhdGlvbgECYVMAAhglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAmFUAAINJXNfX2FkZG9uQWRkcgECYVUBAmFWBAJhVwkAawMACgUBYwCQTgQCYVgCByVzX19mZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYVYFAmFYBQJhVwACYVkJAQFZAAACYVoJAQJhYQEFAmFZAAJiYQkBAmFlAQUCYVoAAmFOCQECYWYBBQJhWgACYmIJAQJhZwEFAmFaAAJiYwkBAmFjAQUCYVoBAmJkAQJiZQQCYmYJAQF1AgUCYVkJAQFWAQUCYmUEAmJnBQFjBAJiaAkBEUBleHRyTmF0aXZlKDEwNTApAgUCYVkJAQFXAQUCYmYEAmJpCQEBeAIFAmJhCQECYU8ABAJiagkBAXgCBQJiYQkBAmFQAAQCYmsAAwQCYmwJAGkCCQBrAwUCYmkFAmJoBQJiZwUCYmsEAmJtCQBrAwUCYmoFAmJoBQJiZwQCYm4JAGgCBQJiawUBYwQCYm8JAQF3AgUCYU4JAQJhSQEFAmJlCQDMCAIFAmJsCQDMCAIFAmJuCQDMCAIFAmJvBQNuaWwBAmJwAwJicQJicgJicwQCYnQJAGsDBQJicgUBYwUCYnMEAmJ1CQBrAwUCYnEFAmJ0BQFjCQDMCAIFAmJ1BQNuaWwBAmJ2AwJidwF0AmJ4AwkAAAIFAmJ4AgZzdHJpbmcJARFAZXh0ck5hdGl2ZSgxMDUzKQIFAmJ3BQF0AwkAAAIFAmJ4AgdpbnRlZ2VyCQCkAwEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAmJ3BQF0AwkAAAIFAmJ4Agdib29sZWFuCQClAwEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFAmJ3BQF0CQACAQItdW5rbm93biB0eXBlLiBleHBlY3RlZCBzdHJpbmcvaW50ZWdlci9ib29sZWFuAQJieQAEAUEJAKIIAQkBAUgAAwkAAQIFAUECBlN0cmluZwQCYnoFAUEJANkEAQUCYnoDCQABAgUBQQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiQQAEAUEJAKIIAQkBAUkAAwkAAQIFAUECBlN0cmluZwQCYnoFAUEJANkEAQUCYnoDCQABAgUBQQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiQgECYkMEAmJECQACAQIRUGVybWlzc2lvbiBkZW5pZWQEAUEJAQJieQADCQABAgUBQQIKQnl0ZVZlY3RvcgQCYkUFAUEDCQAAAggFAmJDD2NhbGxlclB1YmxpY0tleQUCYkUGBQJiRAMJAAECBQFBAgRVbml0AwkAAAIIBQJiQwZjYWxsZXIFBHRoaXMGBQJiRAkAAgECC01hdGNoIGVycm9yEQJiQwELY29uc3RydWN0b3IBAmJGBAJiRwkBAmJCAQUCYkMDCQAAAgUCYkcFAmJHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFHAAUCYkYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiQwEZY3VycmVudFJld2FyZFJhdGVSRUFET05MWQECYmUEAmJICQECYmQBBQJiZQQCYmkJAJEDAgUCYkgAAAQCYm4JAJEDAgUCYkgAAQQCYm8JAJEDAgUCYkgAAgkAlAoCBQNuaWwJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQJiaQkAzAgCCQCkAwEFAmJuCQDMCAIJAKQDAQUCYm8FA25pbAUBZgJiQwEdY3VycmVudFVzZXJSZXdhcmRSYXRlUkVBRE9OTFkCAmJlAmFuBAJiSAkBAmJkAQUCYmUEAmJpCQCRAwIFAmJIAAAEAmJuCQCRAwIFAmJIAAEEAmJvCQCRAwIFAmJIAAIEAmJJCQEBdwIFAmFOCQECYUYCBQJhbgUCYmUEAmJKCQC1CQIJAQFFAQkA/AcEBQJhTgIPY2xhaW1XeFJFQURPTkxZCQDMCAIFAmJlCQDMCAIFAmFuBQNuaWwFA25pbAUBZgQCYksJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFAmJKAAUCHGNvdWxkbid0IHBhcnNlIG1pblJld2FyZFBhcnQEAmJMCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQJiSgAGAh5jb3VsZG4ndCBwYXJzZSBib29zdFJld2FyZFBhcnQEAmJNCQCRAwIFAmJKAAcEAmJOAwkAAAIFAmJMAAAJAGgCAAEFAWMJAGsDCQBkAgUCYksFAmJMBQFjBQJiSwkAlAoCBQNuaWwJALkJAgkAzAgCAgwlZCVkJWQlZCVkJXMJAMwIAgkApAMBBQJiaQkAzAgCCQCkAwEFAmJuCQDMCAIJAKQDAQUCYm8JAMwIAgkApAMBBQJiSQkAzAgCCQCkAwEFAmJOCQDMCAIFAmJNBQNuaWwFAWYCYkMBHWNhbGNCb29zdEJ1bGtJbnRlcm5hbFJFQURPTkxZBwJiTwJiUAJiUQJiUgJiUwJiVAJiVQMJAAACBQJiTwkAkAMBBQJiUAkAlAoCBQNuaWwFAmJVBAJiVgkAkQMCBQJiUAUCYk8EAmJXCQCRAwIFAmJRBQJiTwQCYlgJAJEDAgUCYlIFAmJPBAJiWQkAkQMCBQJiUwUCYk8EAmJaCgACY2EJAPwHBAUEdGhpcwIRY2FsY0Jvb3N0UkVBRE9OTFkJAMwIAgUCYlYJAMwIAgUCYlcJAMwIAgUCYlgJAMwIAgUCYlkJAMwIAgUCYlQFA25pbAUDbmlsAwkAAQIFAmNhAgZTdHJpbmcFAmNhCQACAQkArAICCQADAQUCY2ECGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwQCY2IJAM0IAgUCYlUFAmJaBAJjYwoAAmNhCQD8BwQFBHRoaXMCHWNhbGNCb29zdEJ1bGtJbnRlcm5hbFJFQURPTkxZCQDMCAIJAGQCBQJiTwABCQDMCAIFAmJQCQDMCAIFAmJRCQDMCAIFAmJSCQDMCAIFAmJTCQDMCAIFAmJUCQDMCAIFAmNiBQNuaWwFA25pbAMJAAECBQJjYQIJTGlzdFtBbnldBQJjYQkAAgEJAKwCAgkAAwEFAmNhAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUCY2MFAmNjCQCUCgIFA25pbAUCY2MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYkMBFWNhbGNCb29zdEJ1bGtSRUFET05MWQUCYlYCYlcCYlgCYlkCYlQEAmNiCQD8BwQFBHRoaXMCHWNhbGNCb29zdEJ1bGtJbnRlcm5hbFJFQURPTkxZCQDMCAIAAAkAzAgCBQJiVgkAzAgCBQJiVwkAzAgCBQJiWAkAzAgCBQJiWQkAzAgCBQJiVAkAzAgCBQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUCY2ICYkMBEWNhbGNCb29zdFJFQURPTkxZBQJiVgJiVwJiWAJiWQJiVAQCY2QFAmJiBAJjZQIFZW1wdHkEAmNmCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQEBdQIFAmJjCQECYWgABQFmAAQEAmFIAwkAAAIFAmJZAgAFAmNlBQJiWQQCYUcDCQAAAgUCYlQCAAUCY2UFAmJUBAJjZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQJiYwkBAmFtAQUCYlQFAmNlBAJjaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQJiYwkBAmFxAQUCY2cAAAQCY2kJAQt2YWx1ZU9yRWxzZQIJAJoIAgUCYmMJAQJhcwEFAmNnBQZoZWlnaHQEAmJyCQELdmFsdWVPckVsc2UCCQCaCAIFAmJjCQECYXQBBQJjZwAABAJjagkAZAIFAmNpBQJicgQCY2sJAJYDAQkAzAgCCQBlAgUCY2oFBmhlaWdodAkAzAgCAAAFA25pbAQCY2wJAGQCBQJjaAUCYlYEAmNtCQCXAwEJAMwIAgkAZAIFAmNrBQJiVwkAzAgCBQJjZgUDbmlsBAJjbgkBAUMBCQCRAwIJAQF5AQkA/AcEBQJiYwITZ3d4VXNlckluZm9SRUFET05MWQkAzAgCBQJhRwUDbmlsBQNuaWwAAAQCY28JAJEDAgkBAmJwAwUCY2wFAmNtBQJjZgAABAJjcAkBAXkBCQD8BwQFAmNkAhVjYWxjR3d4UGFyYW1zUkVBRE9OTFkJAMwIAgUCY28JAMwIAgUGaGVpZ2h0CQDMCAIFAmNtBQNuaWwFA25pbAQCY3EJAGUCBQJjbwUCY24EAmNyCQEBQwEJAJEDAgUCY3AAAAQCY3MJAQFDAQkAkQMCBQJjcAABBAJheAkApAMBCQEBQwEJAJEDAgUCY3AAAgQCY3QJAQJhQgAEAmN1CQECYUUABAJjdgkAaQIJAGgCBQJjbwUCY20AAgQCY3cJAQF3AgUCYmMFAmN0BAJjeAkBC3ZhbHVlT3JFbHNlAgkAmggCBQJiYwUCY3UAAAQCY3kA6AcEAmN6CQBoAgkBAXgCBQJiYQkBAmFPAAUCY3kEAmNBCQECYUYCBQJhRwUCYUgEAmNCCQECYUkBBQJhSAQCY0MJAQJhTQIFAmFOBQJjQQQCY0QJAQJhTQIFAmFOBQJjQgQCY0UJAGQCBQJjQwUCYlgEAmNGCQBkAgUCY0QFAmJYBAJiaAMJAQIhPQIFAmFIBQJjZQQCYmYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhWQkBAVMBBQJhSAkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmFICQERQGV4dHJOYXRpdmUoMTA1MCkCBQJhWQkBAVcBBQJiZgAABAJjRwkAawMFAmN6BQJiaAkAaAIFAWcAAwQCY0gDCQECIT0CBQJjRgAACQBrAwUCY0cFAWMFAmNGAAAEAmNJCQBrAwUCY0gFAmNFBQFjBAJjSgkAaAIFAmNHAAIEAmNLCQBrAwUCY28FAmNKCQBkAgUCY3gFAmNxBAJjTAkAlwMBCQDMCAIFAmNLCQDMCAIJAGgCBQJjSQACBQNuaWwEAmNNAwkAAAIFAmNJAAAJAGgCAAEFAWMJAGsDCQBkAgUCY0wFAmNJBQFjBQJjSQkAlAoCBQNuaWwJALkJAgkAzAgCAgYlZCVkJXMJAMwIAgkApAMBBQJjbwkAzAgCCQCkAwEFAmNNCQDMCAICAWQFA25pbAUBZgJiQwEXd3hFbWlzc2lvblN0YXRzUkVBRE9OTFkABAJjTgkApAMBBQFjBAJjTwIBMQQCYmkJAQF4AgUCYmEJAQJhTwAEAmNQCQEBeAIFAmJhCQECYVEABAJjUQMJAGYCBQJjUAUGaGVpZ2h0AAAJAGUCBQZoZWlnaHQFAmNQBAJjUgkAaAIAoAsA7QIEAmNTCQBoAgDAiOxfBQFjBAJjVAMJAGYCBQJjUQUCY1IFAmNTCQBrAwUCY1MFAmNRBQJjUgQCY1UJAGQCCQBoAgUCYmkFAmNRBQJjVAQCY1YJAQF3AgUCYmMJAQJhaQAEAmNXCQEBdwIFAmJjCQECYWoABAJjWAkBAXcCBQJiYwkBAmFrAAkAlAoCBQNuaWwJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFAmNVCQDMCAIJAKQDAQUCY1YJAMwIAgkApAMBBQJjVwkAzAgCCQCkAwEFAmNYBQNuaWwFAWYCYkMBEXBvb2xTdGF0c1JFQURPTkxZAQJjWQQCYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQF1AgUCYVkJAQFWAQUCY1kEAmNaCQEBeQEJAPwHBAUCYVYCHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsBAJiZQkA2QQBCQEBRQEJAJEDAgUCY1oFAWsEAmRhCQEBRQEJAJEDAgUCY1oFAWwEAmRiCQEBRQEJAJEDAgUCY1oFAW0EAmRjCQEBRQEJAJEDAgUCY1oFAXAEAmRkCQEBRQEJAJEDAgUCY1oFAXEEAmRlCQENcGFyc2VJbnRWYWx1ZQEJAQFFAQkAkQMCBQJjWgUBbgQCZGYJAQ1wYXJzZUludFZhbHVlAQkBAUUBCQCRAwIFAmNaBQFvBAJkZwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiZQkArAICCQCsAgICBkFzc2V0IAkA2AQBBQJiZQIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEAmRoCQEBQwEJAPwHBAUCYVYCHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUCZGEFA25pbAUDbmlsBAJkaQkBAUMBCQD8BwQFAmFWAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFAmRiBQNuaWwFA25pbAQCZGoDCQAAAgUCZGcAAAkAzAgCCQCmAwEFAWgJAMwIAgkApgMBBQFoCQDMCAIJAKYDAQUBaAUDbmlsCQEBeQEJAPwHBAUCYVYCGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkJAMwIAgUCZGgJAMwIAgUCZGkJAMwIAgUCZGcFA25pbAUDbmlsBAJkawAABAJkbAkBAUMBCQD8BwQFAmFWAhZmcm9tWDE4V3JhcHBlclJFQURPTkxZCQDMCAIJAJEDAgUCZGoAAQkAzAgCBQFjBQNuaWwFA25pbAQCZG0JAQFDAQkA/AcEBQJhVgIWZnJvbVgxOFdyYXBwZXJSRUFET05MWQkAzAgCCQCRAwIFAmRqAAIJAMwIAgUBYwUDbmlsBQNuaWwEAmJoCQERQGV4dHJOYXRpdmUoMTA1MCkCBQJhWQkBAVcBCQClCAEFAmFWBAJkbgkBAmFVAQUCYVYEAmRvCgACY2EJAPwHBAUCYVkCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQJhVgUD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bmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJDARNnZXRLZXlzQnVsa0ludGVybmFsAwJiTwJkWAJiVQMJAAACBQJiTwkAkAMBBQJkWAkAlAoCBQNuaWwFAmJVBAJjcgkAtQkCCQCRAwIFAmRYBQJiTwICKysEAmJ3CQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmNyAAAEAXQJAJEDAgUCY3IAAQQCYngJAJEDAgUCY3IAAgQBegkBAmJ2AwUCYncFAXQFAmJ4BAJjYgkAzQgCBQJiVQUBegQCY2MJAPwHBAUEdGhpcwITZ2V0S2V5c0J1bGtJbnRlcm5hbAkAzAgCCQBkAgUCYk8AAQkAzAgCBQJkWAkAzAgCBQJjYgUDbmlsBQNuaWwDCQAAAgUCY2MFAmNjCQCUCgIFA25pbAUCY2MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYkMBC2dldEtleXNCdWxrAQJkWAQCY2IJAPwHBAUEdGhpcwITZ2V0S2V5c0J1bGtJbnRlcm5hbAkAzAgCAAAJAMwIAgUCZFgJAMwIAgUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFAmNiAmJDAQpzZXRNYW5hZ2VyAQJkWQQCYkcJAQJiQgEFAmJDAwkAAAIFAmJHBQJiRwQCZFoJANkEAQUCZFkDCQAAAgUCZFoFAmRaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFJAAUCZFkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiQwEOY29uZmlybU1hbmFnZXIABAJlYQkBAmJBAAQCZWIDCQEJaXNEZWZpbmVkAQUCZWEGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmViBQJlYgQCZWMDCQAAAggFAmJDD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCZWEGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmVjBQJlYwkAzAgCCQELU3RyaW5nRW50cnkCCQEBSAAJANgEAQkBBXZhbHVlAQUCZWEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAUkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmVkAQJlZQAEAmVmBAFBCQECYnkAAwkAAQIFAUECCkJ5dGVWZWN0b3IEAmJFBQFBBQJiRQMJAAECBQFBAgRVbml0CAUCZWQPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmVkCWJvZHlCeXRlcwkAkQMCCAUCZWQGcHJvb2ZzAAAFAmVm3Wl2Gw==", "chainId": 84, "height": 2326821, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DQqwwZr61yWN1U9y8noZSczCh5jN5hfH84asf14E5JEv Next: 3HE6EamkqXWtDduxXiCyxhgDGeTeuyfPjS6czpfftNph Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let testststststst = 1
5+
46 let SCALE8 = 8
57
68 let MULT8 = 100000000
534536 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
535537 let inPrAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil))
536538 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
537- let $t02270023053 = match res {
539+ let $t02272323076 = match res {
538540 case _ =>
539541 if (if (if ($isInstanceOf($match0._1, "Int"))
540542 then if ($isInstanceOf($match0._3, "Int"))
557559 }
558560 else throw("Couldn't cast types")
559561 }
560- let calcLpAmt = $t02270023053._1
561- let curPriceCalc = $t02270023053._2
562- let amBalance = $t02270023053._3
563- let prBalance = $t02270023053._4
564- let lpEmission = $t02270023053._5
562+ let calcLpAmt = $t02272323076._1
563+ let curPriceCalc = $t02272323076._2
564+ let amBalance = $t02272323076._3
565+ let prBalance = $t02272323076._4
566+ let lpEmission = $t02272323076._5
565567 $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))
566568 }
567569
592594 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
593595 let inAmAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil))
594596 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
595- let $t02562625979 = match res {
597+ let $t02564926002 = match res {
596598 case _ =>
597599 if (if (if ($isInstanceOf($match0._1, "Int"))
598600 then if ($isInstanceOf($match0._3, "Int"))
615617 }
616618 else throw("Couldn't cast types")
617619 }
618- let calcLpAmt = $t02562625979._1
619- let curPriceCalc = $t02562625979._2
620- let amBalance = $t02562625979._3
621- let prBalance = $t02562625979._4
622- let lpEmission = $t02562625979._5
620+ let calcLpAmt = $t02564926002._1
621+ let curPriceCalc = $t02564926002._2
622+ let amBalance = $t02564926002._3
623+ let prBalance = $t02564926002._4
624+ let lpEmission = $t02564926002._5
623625 $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))
624626 }
625627
629631 func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
630632 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
631633 let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
632- let $t02667427091 = match res {
634+ let $t02669727114 = match res {
633635 case _ =>
634636 if (if (if ($isInstanceOf($match0._1, "Int"))
635637 then if ($isInstanceOf($match0._2, "Int"))
658660 }
659661 else throw("Couldn't cast types")
660662 }
661- let outAmAmt = $t02667427091._1
662- let outPrAmt = $t02667427091._2
663- let amBalance = $t02667427091._3
664- let prBalance = $t02667427091._4
665- let lpEmission = $t02667427091._5
666- let curPrice = $t02667427091._6
667- let poolStatus = $t02667427091._7
663+ let outAmAmt = $t02669727114._1
664+ let outPrAmt = $t02669727114._2
665+ let amBalance = $t02669727114._3
666+ let prBalance = $t02669727114._4
667+ let lpEmission = $t02669727114._5
668+ let curPrice = $t02669727114._6
669+ let poolStatus = $t02669727114._7
668670 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
669671 }
670672
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let testststststst = 1
5+
46 let SCALE8 = 8
57
68 let MULT8 = 100000000
79
810 let SCALE18 = 18
911
1012 let MULT18 = toBigInt(1000000000000000000)
1113
1214 let SEP = "__"
1315
1416 let POOLWEIGHTMULT = MULT8
1517
1618 let zeroBigInt = toBigInt(0)
1719
1820 let idxPoolAddress = 1
1921
2022 let idxPoolStatus = 2
2123
2224 let idxPoolLPAssetId = 3
2325
2426 let idxAmtAssetId = 4
2527
2628 let idxPriceAssetId = 5
2729
2830 let idxAmtAssetDcm = 6
2931
3032 let idxPriceAssetDcm = 7
3133
3234 let idxIAmtAssetId = 8
3335
3436 let idxIPriceAssetId = 9
3537
3638 let idxLPAssetDcm = 10
3739
3840 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3941
4042
4143 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4244
4345
4446 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
4547
4648
4749 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
4850
4951
5052 func asAnyList (val) = match val {
5153 case valAnyLyst: List[Any] =>
5254 valAnyLyst
5355 case _ =>
5456 throw("fail to cast into List[Any]")
5557 }
5658
5759
5860 func asInt (val) = match val {
5961 case valInt: Int =>
6062 valInt
6163 case _ =>
6264 throw("fail to cast into Int")
6365 }
6466
6567
6668 func asString (val) = match val {
6769 case valStr: String =>
6870 valStr
6971 case _ =>
7072 throw("fail to cast into String")
7173 }
7274
7375
7476 func keyFactoryAddress () = "%s%s__config__factoryAddress"
7577
7678
7779 func keyManagerPublicKey () = "%s__managerPublicKey"
7880
7981
8082 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
8183
8284
8385 let IdxFactoryCfgStakingDapp = 1
8486
8587 let IdxFactoryCfgBoostingDapp = 2
8688
8789 let IdxFactoryCfgIdoDapp = 3
8890
8991 let IdxFactoryCfgTeamDapp = 4
9092
9193 let IdxFactoryCfgEmissionDapp = 5
9294
9395 let IdxFactoryCfgRestDapp = 6
9496
9597 let IdxFactoryCfgSlippageDapp = 7
9698
9799 let IdxFactoryCfgGwxRewardDapp = 8
98100
99101 func keyFactoryCfg () = "%s__factoryConfig"
100102
101103
102104 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
103105
104106
105107 func keyFactoryLpList () = "%s__lpTokensList"
106108
107109
108110 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
109111
110112
111113 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
112114
113115
114116 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
115117
116118
117119 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
118120
119121
120122 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
121123
122124
123125 func getBoostingAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgBoostingDapp])
124126
125127
126128 func getEmissionAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgEmissionDapp])
127129
128130
129131 func getStakingAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgStakingDapp])
130132
131133
132134 func getGwxRewardAddressOrFail (fCfg) = addressFromStringValue(fCfg[IdxFactoryCfgGwxRewardDapp])
133135
134136
135137 func keyBoostCfg () = "%s__config"
136138
137139
138140 func keyBoostingLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
139141
140142
141143 func keyBoostingStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
142144
143145
144146 func keyBoostingStatsLocksCount () = "%s%s__stats__locksCount"
145147
146148
147149 func keyBoostingStatsUsersCount () = "%s%s__stats__activeUsersCount"
148150
149151
150152 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
151153
152154
153155 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
154156
155157
156158 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
157159
158160
159161 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
160162
161163
162164 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
163165
164166
165167 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
166168
167169
168170 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
169171
170172
171173 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
172174
173175
174176 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
175177
176178
177179 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
178180
179181
180182 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
181183
182184
183185 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
184186
185187
186188 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
187189
188190
189191 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
190192
191193
192194 func keyTotalCachedGwx () = "%s%s__gwxCached__total"
193195
194196
195197 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
196198
197199
198200 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
199201
200202
201203 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
202204
203205
204206 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
205207
206208
207209 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
208210
209211
210212 func readStaked (stakingDapp,key) = valueOrElse(getInteger(stakingDapp, key), 0)
211213
212214
213215 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
214216
215217
216218 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
217219
218220
219221 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
220222
221223
222224 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
223225
224226
225227 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
226228
227229
228230 func keyAddonAddr () = "%s__addonAddr"
229231
230232
231233 func getPoolFee (poolAddress) = {
232234 let feeDefault = fraction(10, MULT8, 10000)
233235 let keyFee = "%s__fee"
234236 valueOrElse(getInteger(poolAddress, keyFee), feeDefault)
235237 }
236238
237239
238240 let factoryDapp = readFactoryAddressOrFail()
239241
240242 let factoryCfg = readFactoryCfgOrFail(factoryDapp)
241243
242244 let emissionDapp = getEmissionAddressOrFail(factoryCfg)
243245
244246 let stakingDapp = getStakingAddressOrFail(factoryCfg)
245247
246248 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
247249
248250 let boostingDapp = getBoostingAddressOrFail(factoryCfg)
249251
250252 func internalCurrentRewardRate (lpAssetId) = {
251253 let poolAddressStr = getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
252254 let poolWeightMult = MULT8
253255 let poolWeight = getIntegerValue(factoryDapp, keyFactoryPoolWeight(poolAddressStr))
254256 let wxEmissionPerBlock = getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent())
255257 let wxEmissionPerBlockMax = getIntOrFail(emissionDapp, keyEmissionRatePerBlockMaxCurrent())
256258 let boostMaxCoeff = 3
257259 let poolWxEmissionPerBlock = (fraction(wxEmissionPerBlock, poolWeight, poolWeightMult) / boostMaxCoeff)
258260 let poolWxEmissionPerBlockMax = fraction(wxEmissionPerBlockMax, poolWeight, poolWeightMult)
259261 let maxFactor = (boostMaxCoeff * MULT8)
260262 let totalLpStaked = getIntOrZero(stakingDapp, keyStakedTotal(lpAssetId))
261263 [poolWxEmissionPerBlock, maxFactor, totalLpStaked]
262264 }
263265
264266
265267 func calcGwxAmountStartREADONLY (lockAmount,lockDuration,maxLockDuration) = {
266268 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
267269 let gWxAmountStart = fraction(lockAmount, coeffX8, MULT8)
268270 [gWxAmountStart]
269271 }
270272
271273
272274 func getKey (addr,key,type) = if ((type == "string"))
273275 then getStringValue(addr, key)
274276 else if ((type == "integer"))
275277 then toString(getIntegerValue(addr, key))
276278 else if ((type == "boolean"))
277279 then toString(getBooleanValue(addr, key))
278280 else throw("unknown type. expected string/integer/boolean")
279281
280282
281283 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
282284 case s: String =>
283285 fromBase58String(s)
284286 case _: Unit =>
285287 unit
286288 case _ =>
287289 throw("Match error")
288290 }
289291
290292
291293 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
292294 case s: String =>
293295 fromBase58String(s)
294296 case _: Unit =>
295297 unit
296298 case _ =>
297299 throw("Match error")
298300 }
299301
300302
301303 func mustManager (i) = {
302304 let pd = throw("Permission denied")
303305 match managerPublicKeyOrUnit() {
304306 case pk: ByteVector =>
305307 if ((i.callerPublicKey == pk))
306308 then true
307309 else pd
308310 case _: Unit =>
309311 if ((i.caller == this))
310312 then true
311313 else pd
312314 case _ =>
313315 throw("Match error")
314316 }
315317 }
316318
317319
318320 @Callable(i)
319321 func constructor (factoryAddress) = {
320322 let checkCaller = mustManager(i)
321323 if ((checkCaller == checkCaller))
322324 then [StringEntry(keyFactoryAddress(), factoryAddress)]
323325 else throw("Strict value is not equal to itself.")
324326 }
325327
326328
327329
328330 @Callable(i)
329331 func currentRewardRateREADONLY (lpAssetId) = {
330332 let rewardData = internalCurrentRewardRate(lpAssetId)
331333 let wxEmissionPerBlock = rewardData[0]
332334 let maxFactor = rewardData[1]
333335 let totalLpStaked = rewardData[2]
334336 $Tuple2(nil, makeString(["%d%d%d", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked)], SEP))
335337 }
336338
337339
338340
339341 @Callable(i)
340342 func currentUserRewardRateREADONLY (lpAssetId,userAddress) = {
341343 let rewardData = internalCurrentRewardRate(lpAssetId)
342344 let wxEmissionPerBlock = rewardData[0]
343345 let maxFactor = rewardData[1]
344346 let totalLpStaked = rewardData[2]
345347 let lpStakedByUser = getIntOrZero(stakingDapp, keyStakedByUser(userAddress, lpAssetId))
346348 let userClaimInfo = split(asString(invoke(stakingDapp, "claimWxREADONLY", [lpAssetId, userAddress], nil)), SEP)
347349 let minRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[5]), "couldn't parse minRewardPart")
348350 let boostRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[6]), "couldn't parse boostRewardPart")
349351 let debug = userClaimInfo[7]
350352 let boostingPower = if ((boostRewardPart == 0))
351353 then (1 * MULT8)
352354 else fraction((minRewardPart + boostRewardPart), MULT8, minRewardPart)
353355 $Tuple2(nil, makeString(["%d%d%d%d%d%s", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower), debug], SEP))
354356 }
355357
356358
357359
358360 @Callable(i)
359361 func calcBoostBulkInternalREADONLY (currentIter,deltaWxAmountBulk,deltaLockPeriodInBlocksBulk,deltaLpAmountBulk,lpAssetIdOptBulk,userAddressOpt,resAcc) = if ((currentIter == size(deltaWxAmountBulk)))
360362 then $Tuple2(nil, resAcc)
361363 else {
362364 let deltaWxAmount = deltaWxAmountBulk[currentIter]
363365 let deltaLockPeriodInBlocks = deltaLockPeriodInBlocksBulk[currentIter]
364366 let deltaLpAmount = deltaLpAmountBulk[currentIter]
365367 let lpAssetIdOpt = lpAssetIdOptBulk[currentIter]
366368 let info = {
367369 let @ = invoke(this, "calcBoostREADONLY", [deltaWxAmount, deltaLockPeriodInBlocks, deltaLpAmount, lpAssetIdOpt, userAddressOpt], nil)
368370 if ($isInstanceOf(@, "String"))
369371 then @
370372 else throw(($getType(@) + " couldn't be cast to String"))
371373 }
372374 let res = (resAcc :+ info)
373375 let inv = {
374376 let @ = invoke(this, "calcBoostBulkInternalREADONLY", [(currentIter + 1), deltaWxAmountBulk, deltaLockPeriodInBlocksBulk, deltaLpAmountBulk, lpAssetIdOptBulk, userAddressOpt, res], nil)
375377 if ($isInstanceOf(@, "List[Any]"))
376378 then @
377379 else throw(($getType(@) + " couldn't be cast to List[Any]"))
378380 }
379381 if ((inv == inv))
380382 then $Tuple2(nil, inv)
381383 else throw("Strict value is not equal to itself.")
382384 }
383385
384386
385387
386388 @Callable(i)
387389 func calcBoostBulkREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
388390 let res = invoke(this, "calcBoostBulkInternalREADONLY", [0, deltaWxAmount, deltaLockPeriodInBlocks, deltaLpAmount, lpAssetIdOpt, userAddressOpt, nil], nil)
389391 $Tuple2(nil, res)
390392 }
391393
392394
393395
394396 @Callable(i)
395397 func calcBoostREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
396398 let mathDapp = gwxRewardDapp
397399 let EMPTYSTR = "empty"
398400 let maxLockDurationInBlocks = parseIntValue(split(getStringByAddressOrFail(boostingDapp, keyBoostCfg()), SEP)[4])
399401 let lpAssetIdStr = if ((lpAssetIdOpt == ""))
400402 then EMPTYSTR
401403 else lpAssetIdOpt
402404 let userAddressStr = if ((userAddressOpt == ""))
403405 then EMPTYSTR
404406 else userAddressOpt
405407 let userNumStr = valueOrElse(getString(boostingDapp, keyUser2NumMapping(userAddressOpt)), EMPTYSTR)
406408 let userAmount = valueOrElse(getInteger(boostingDapp, keyLockParamUserAmount(userNumStr)), 0)
407409 let lockStart = valueOrElse(getInteger(boostingDapp, keyLockParamStartBlock(userNumStr)), height)
408410 let lockDuration = valueOrElse(getInteger(boostingDapp, keyLockParamDuration(userNumStr)), 0)
409411 let lockEnd = (lockStart + lockDuration)
410412 let remainingDuration = max([(lockEnd - height), 0])
411413 let userAmountNew = (userAmount + deltaWxAmount)
412414 let lockDurationNew = min([(remainingDuration + deltaLockPeriodInBlocks), maxLockDurationInBlocks])
413415 let userCurrgWxAmount = asInt(asAnyList(invoke(boostingDapp, "gwxUserInfoREADONLY", [userAddressStr], nil))[0])
414416 let gWxAmountStartNew = calcGwxAmountStartREADONLY(userAmountNew, lockDurationNew, maxLockDurationInBlocks)[0]
415417 let gWxParamsResultList = asAnyList(invoke(mathDapp, "calcGwxParamsREADONLY", [gWxAmountStartNew, height, lockDurationNew], nil))
416418 let gWxAmountDiff = (gWxAmountStartNew - userCurrgWxAmount)
417419 let k = asInt(gWxParamsResultList[0])
418420 let b = asInt(gWxParamsResultList[1])
419421 let period = toString(asInt(gWxParamsResultList[2]))
420422 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
421423 let totalCachedGwxKEY = keyTotalCachedGwx()
422424 let userMaxBoostIntNew = ((gWxAmountStartNew * lockDurationNew) / 2)
423425 let totalMaxBoostInt = getIntOrZero(boostingDapp, totalMaxBoostIntegralKEY)
424426 let totalCachedGwx = valueOrElse(getInteger(boostingDapp, totalCachedGwxKEY), 0)
425427 let MULT3 = 1000
426428 let wxEmissionPerBlockX3 = (getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent()) * MULT3)
427429 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
428430 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
429431 let stakedByUser = readStaked(stakingDapp, stakedByUserKEY)
430432 let stakedTotal = readStaked(stakingDapp, stakedTotalKEY)
431433 let stakedByUserNew = (stakedByUser + deltaLpAmount)
432434 let stakedTotalNew = (stakedTotal + deltaLpAmount)
433435 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
434436 then {
435437 let poolAddressStr = valueOrErrorMessage(getString(factoryDapp, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
436438 getIntegerValue(factoryDapp, keyFactoryPoolWeight(poolAddressStr))
437439 }
438440 else 0
439441 let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
440442 let wxPerLpX3 = if ((stakedTotalNew != 0))
441443 then fraction(poolWxEmissionPerBlockX3, MULT8, stakedTotalNew)
442444 else 0
443445 let userWxPerBlockX3 = fraction(wxPerLpX3, stakedByUserNew, MULT8)
444446 let boostEmissionPerBlockX3 = (poolWxEmissionPerBlockX3 * 2)
445447 let tmpUserBoostPerBlockX3 = fraction(gWxAmountStartNew, boostEmissionPerBlockX3, (totalCachedGwx + gWxAmountDiff))
446448 let userBoostPerBlockX3 = min([tmpUserBoostPerBlockX3, (userWxPerBlockX3 * 2)])
447449 let boostCoeff = if ((userWxPerBlockX3 == 0))
448450 then (1 * MULT8)
449451 else fraction((userBoostPerBlockX3 + userWxPerBlockX3), MULT8, userWxPerBlockX3)
450452 $Tuple2(nil, makeString(["%d%d%s", toString(gWxAmountStartNew), toString(boostCoeff), "d"], SEP))
451453 }
452454
453455
454456
455457 @Callable(i)
456458 func wxEmissionStatsREADONLY () = {
457459 let ONEMULT = toString(MULT8)
458460 let ONE = "1"
459461 let wxEmissionPerBlock = getIntOrFail(emissionDapp, keyEmissionRatePerBlockCurrent())
460462 let emissionStartBlock = getIntOrFail(emissionDapp, keyEmissionStartBlock())
461463 let passedBlocks = if ((emissionStartBlock > height))
462464 then 0
463465 else (height - emissionStartBlock)
464466 let teamEmDuration = (1440 * 365)
465467 let teamEmMax = (201000000 * MULT8)
466468 let teamEm = if ((passedBlocks > teamEmDuration))
467469 then teamEmMax
468470 else fraction(teamEmMax, passedBlocks, teamEmDuration)
469471 let totalWxReleased = ((wxEmissionPerBlock * passedBlocks) + teamEm)
470472 let totalWxLocked = getIntOrZero(boostingDapp, keyBoostingLockParamTotalAmount())
471473 let locksDurationSumInBlocks = getIntOrZero(boostingDapp, keyBoostingStatsLocksDurationSumInBlocks())
472474 let locksCount = getIntOrZero(boostingDapp, keyBoostingStatsLocksCount())
473475 $Tuple2(nil, makeString(["%d%d%d%d", toString(totalWxReleased), toString(totalWxLocked), toString(locksDurationSumInBlocks), toString(locksCount)], SEP))
474476 }
475477
476478
477479
478480 @Callable(i)
479481 func poolStatsREADONLY (lpAsset) = {
480482 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
481483 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
482484 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
483485 let amtAssetId = asString(cfg[idxAmtAssetId])
484486 let priceAssetId = asString(cfg[idxPriceAssetId])
485487 let iAmtAssetId = asString(cfg[idxIAmtAssetId])
486488 let iPriceAssetId = asString(cfg[idxIPriceAssetId])
487489 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
488490 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
489491 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
490492 let accAmtAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil))
491493 let accPriceAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil))
492494 let pricesList = if ((poolLPBalance == 0))
493495 then [toString(zeroBigInt), toString(zeroBigInt), toString(zeroBigInt)]
494496 else asAnyList(invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil))
495497 let curPrice = 0
496498 let lpAmtAssetShare = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil))
497499 let lpPriceAssetShare = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil))
498500 let poolWeight = getIntegerValue(factoryDapp, keyFactoryPoolWeight(toString(poolAddress)))
499501 let fee = getPoolFee(poolAddress)
500502 let poolOneTokenOperationsDisabled = {
501503 let @ = invoke(factoryDapp, "isPoolOneTokenOperationsDisabledREADONLY", [toString(poolAddress)], nil)
502504 if ($isInstanceOf(@, "Boolean"))
503505 then @
504506 else throw(($getType(@) + " couldn't be cast to Boolean"))
505507 }
506508 let poolOneTokenOperationsEnabled = !(poolOneTokenOperationsDisabled)
507509 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%s", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight), toString(fee), toString(poolOneTokenOperationsEnabled)], SEP))
508510 }
509511
510512
511513
512514 @Callable(i)
513515 func poolEvaluatePutByAmountAssetREADONLY (lpAsset,inAmAssetAmt) = {
514516 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
515517 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
516518 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
517519 let amAssetIdStr = asString(cfg[idxAmtAssetId])
518520 let amAssetId = fromBase58String(amAssetIdStr)
519521 let prAssetIdStr = asString(cfg[idxPriceAssetId])
520522 let prAssetId = fromBase58String(prAssetIdStr)
521523 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
522524 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
523525 let poolStatus = asString(cfg[idxPoolStatus])
524526 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
525527 let accAmtAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil))
526528 let accPriceAssetBalance = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil))
527529 let amtAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [accAmtAssetBalance, amtAssetDcm], nil)))
528530 let priceAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [accPriceAssetBalance, priceAssetDcm], nil)))
529531 let curPriceX18 = if ((poolLPBalance == 0))
530532 then zeroBigInt
531533 else parseBigIntValue(asString(invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(priceAssetAmtX18), toString(amtAssetAmtX18)], nil)))
532534 let curPrice = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil))
533535 let inAmAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [inAmAssetAmt, amtAssetDcm], nil)))
534536 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
535537 let inPrAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil))
536538 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
537- let $t02270023053 = match res {
539+ let $t02272323076 = match res {
538540 case _ =>
539541 if (if (if ($isInstanceOf($match0._1, "Int"))
540542 then if ($isInstanceOf($match0._3, "Int"))
541543 then if ($isInstanceOf($match0._4, "Int"))
542544 then if ($isInstanceOf($match0._5, "Int"))
543545 then $isInstanceOf($match0._6, "Int")
544546 else false
545547 else false
546548 else false
547549 else false)
548550 then (size($match0) == 13)
549551 else false)
550552 then {
551553 let calcLpAmt = $match0._1
552554 let curPriceCalc = $match0._3
553555 let amBalance = $match0._4
554556 let prBalance = $match0._5
555557 let lpEmission = $match0._6
556558 $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
557559 }
558560 else throw("Couldn't cast types")
559561 }
560- let calcLpAmt = $t02270023053._1
561- let curPriceCalc = $t02270023053._2
562- let amBalance = $t02270023053._3
563- let prBalance = $t02270023053._4
564- let lpEmission = $t02270023053._5
562+ let calcLpAmt = $t02272323076._1
563+ let curPriceCalc = $t02272323076._2
564+ let amBalance = $t02272323076._3
565+ let prBalance = $t02272323076._4
566+ let lpEmission = $t02272323076._5
565567 $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))
566568 }
567569
568570
569571
570572 @Callable(i)
571573 func poolEvaluatePutByPriceAssetREADONLY (lpAsset,inPrAssetAmt) = {
572574 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
573575 let cfg = asAnyList(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil))
574576 let lpAssetId = fromBase58String(asString(cfg[idxPoolLPAssetId]))
575577 let amAssetIdStr = asString(cfg[idxAmtAssetId])
576578 let amAssetId = fromBase58String(amAssetIdStr)
577579 let prAssetIdStr = asString(cfg[idxPriceAssetId])
578580 let prAssetId = fromBase58String(prAssetIdStr)
579581 let amtAssetDcm = parseIntValue(asString(cfg[idxAmtAssetDcm]))
580582 let priceAssetDcm = parseIntValue(asString(cfg[idxPriceAssetDcm]))
581583 let poolStatus = asString(cfg[idxPoolStatus])
582584 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
583585 let amBalanceRaw = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil))
584586 let prBalanceRaw = asInt(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil))
585587 let amBalanceRawX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [amBalanceRaw, amtAssetDcm], nil)))
586588 let prBalanceRawX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [prBalanceRaw, priceAssetDcm], nil)))
587589 let curPriceX18 = if ((poolLPBalance == 0))
588590 then zeroBigInt
589591 else parseBigIntValue(asString(invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(prBalanceRawX18), toString(amBalanceRawX18)], nil)))
590592 let curPrice = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil))
591593 let inPrAssetAmtX18 = parseBigIntValue(asString(invoke(poolAddress, "toX18WrapperREADONLY", [inPrAssetAmt, priceAssetDcm], nil)))
592594 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
593595 let inAmAssetAmt = asInt(invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil))
594596 let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
595- let $t02562625979 = match res {
597+ let $t02564926002 = match res {
596598 case _ =>
597599 if (if (if ($isInstanceOf($match0._1, "Int"))
598600 then if ($isInstanceOf($match0._3, "Int"))
599601 then if ($isInstanceOf($match0._4, "Int"))
600602 then if ($isInstanceOf($match0._5, "Int"))
601603 then $isInstanceOf($match0._6, "Int")
602604 else false
603605 else false
604606 else false
605607 else false)
606608 then (size($match0) == 13)
607609 else false)
608610 then {
609611 let calcLpAmt = $match0._1
610612 let curPriceCalc = $match0._3
611613 let amBalance = $match0._4
612614 let prBalance = $match0._5
613615 let lpEmission = $match0._6
614616 $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
615617 }
616618 else throw("Couldn't cast types")
617619 }
618- let calcLpAmt = $t02562625979._1
619- let curPriceCalc = $t02562625979._2
620- let amBalance = $t02562625979._3
621- let prBalance = $t02562625979._4
622- let lpEmission = $t02562625979._5
620+ let calcLpAmt = $t02564926002._1
621+ let curPriceCalc = $t02564926002._2
622+ let amBalance = $t02564926002._3
623+ let prBalance = $t02564926002._4
624+ let lpEmission = $t02564926002._5
623625 $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))
624626 }
625627
626628
627629
628630 @Callable(i)
629631 func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
630632 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryDapp, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
631633 let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
632- let $t02667427091 = match res {
634+ let $t02669727114 = match res {
633635 case _ =>
634636 if (if (if ($isInstanceOf($match0._1, "Int"))
635637 then if ($isInstanceOf($match0._2, "Int"))
636638 then if ($isInstanceOf($match0._5, "Int"))
637639 then if ($isInstanceOf($match0._6, "Int"))
638640 then if ($isInstanceOf($match0._7, "Int"))
639641 then if ($isInstanceOf($match0._8, "String"))
640642 then $isInstanceOf($match0._9, "String")
641643 else false
642644 else false
643645 else false
644646 else false
645647 else false
646648 else false)
647649 then (size($match0) == 10)
648650 else false)
649651 then {
650652 let outAmAmt = $match0._1
651653 let outPrAmt = $match0._2
652654 let amBalance = $match0._5
653655 let prBalance = $match0._6
654656 let lpEmission = $match0._7
655657 let curPrice = $match0._8
656658 let poolStatus = $match0._9
657659 $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
658660 }
659661 else throw("Couldn't cast types")
660662 }
661- let outAmAmt = $t02667427091._1
662- let outPrAmt = $t02667427091._2
663- let amBalance = $t02667427091._3
664- let prBalance = $t02667427091._4
665- let lpEmission = $t02667427091._5
666- let curPrice = $t02667427091._6
667- let poolStatus = $t02667427091._7
663+ let outAmAmt = $t02669727114._1
664+ let outPrAmt = $t02669727114._2
665+ let amBalance = $t02669727114._3
666+ let prBalance = $t02669727114._4
667+ let lpEmission = $t02669727114._5
668+ let curPrice = $t02669727114._6
669+ let poolStatus = $t02669727114._7
668670 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
669671 }
670672
671673
672674
673675 @Callable(i)
674676 func gwxUserInfoREADONLY (userAddress) = {
675677 let gwxUserInfoLIST = asAnyList(invoke(boostingDapp, "gwxUserInfoREADONLY", [userAddress], nil))
676678 let gwxAmount = asInt(gwxUserInfoLIST[0])
677679 $Tuple2(nil, makeString(["%d", toString(gwxAmount)], SEP))
678680 }
679681
680682
681683
682684 @Callable(i)
683685 func unstakeAndGetOneTknV2 (poolAddress,unstakeAmount,outAssetId,minOutAmount) = {
684686 let inv = invoke(addressFromStringValue(poolAddress), "unstakeAndGetOneTknV2", [unstakeAmount, outAssetId, minOutAmount], nil)
685687 if ((inv == inv))
686688 then $Tuple2(nil, unit)
687689 else throw("Strict value is not equal to itself.")
688690 }
689691
690692
691693
692694 @Callable(i)
693695 func getKeysBulkInternal (currentIter,keys,resAcc) = if ((currentIter == size(keys)))
694696 then $Tuple2(nil, resAcc)
695697 else {
696698 let k = split(keys[currentIter], "++")
697699 let addr = addressFromStringValue(k[0])
698700 let key = k[1]
699701 let type = k[2]
700702 let val = getKey(addr, key, type)
701703 let res = (resAcc :+ val)
702704 let inv = invoke(this, "getKeysBulkInternal", [(currentIter + 1), keys, res], nil)
703705 if ((inv == inv))
704706 then $Tuple2(nil, inv)
705707 else throw("Strict value is not equal to itself.")
706708 }
707709
708710
709711
710712 @Callable(i)
711713 func getKeysBulk (keys) = {
712714 let res = invoke(this, "getKeysBulkInternal", [0, keys, nil], nil)
713715 $Tuple2(nil, res)
714716 }
715717
716718
717719
718720 @Callable(i)
719721 func setManager (pendingManagerPublicKey) = {
720722 let checkCaller = mustManager(i)
721723 if ((checkCaller == checkCaller))
722724 then {
723725 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
724726 if ((checkManagerPublicKey == checkManagerPublicKey))
725727 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
726728 else throw("Strict value is not equal to itself.")
727729 }
728730 else throw("Strict value is not equal to itself.")
729731 }
730732
731733
732734
733735 @Callable(i)
734736 func confirmManager () = {
735737 let pm = pendingManagerPublicKeyOrUnit()
736738 let hasPM = if (isDefined(pm))
737739 then true
738740 else throw("No pending manager")
739741 if ((hasPM == hasPM))
740742 then {
741743 let checkPM = if ((i.callerPublicKey == value(pm)))
742744 then true
743745 else throw("You are not pending manager")
744746 if ((checkPM == checkPM))
745747 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
746748 else throw("Strict value is not equal to itself.")
747749 }
748750 else throw("Strict value is not equal to itself.")
749751 }
750752
751753
752754 @Verifier(tx)
753755 func verify () = {
754756 let targetPublicKey = match managerPublicKeyOrUnit() {
755757 case pk: ByteVector =>
756758 pk
757759 case _: Unit =>
758760 tx.senderPublicKey
759761 case _ =>
760762 throw("Match error")
761763 }
762764 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
763765 }
764766

github/deemru/w8io/169f3d6 
79.80 ms