tx · Djz7ee27LvVChWjoBCadUpWCKSCUBWaybYSjtGtfcEVH

3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz:  -0.02400000 Waves

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

{ "type": 13, "id": "Djz7ee27LvVChWjoBCadUpWCKSCUBWaybYSjtGtfcEVH", "fee": 2400000, "feeAssetId": null, "timestamp": 1683027177495, "version": 2, "chainId": 84, "sender": "3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz", "senderPublicKey": "D28XoueZWsMfm8Y5pa6C5ZFuYoWgre2Wm8tzJANJgMnq", "proofs": [ "2iEmDhnkauHcJJAfmchocDPh2LD9yHB3gbyPnLfCamHQNhHq81oS8P538oGZwuNF1S2znid1TXYWWcvNK9rDZi9Q" ], "script": "base64:BgKSIAgCEgMKAQgSAwoBCBIDCgEIEgASABIDCgEIEgQKAggBEgYKBAIBAgISAwoBCBIDCgEIEgUKAwgIBBIGCgQBGAgYEgQKAhgIEgQKAggIEgQKAggIEgMKAQgSAwoBCBIECgIICCIGU0NBTEU4IgVNVUxUMyIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIDU0VQIg5QT09MV0VJR0hUTVVMVCIKemVyb0JpZ0ludCIJb25lQmlnSW50Igd3cmFwRXJyIgNtc2ciCHRocm93RXJyIglhc0FueUxpc3QiA3ZhbCIHJG1hdGNoMCIKdmFsQW55THlzdCIFYXNJbnQiBnZhbEludCIIYXNTdHJpbmciBnZhbFN0ciIMYXNCeXRlVmVjdG9yIgZ2YWxCaW4iD2dldFN0cmluZ09yRmFpbCIHYWRkcmVzcyIDa2V5IhhnZXRTdHJpbmdCeUFkZHJlc3NPckZhaWwiDGdldEludE9yWmVybyIPZ2V0SW50T3JEZWZhdWx0IgpkZWZhdWx0VmFsIgxnZXRJbnRPckZhaWwiGWdldEJpZ0ludEZyb21TdHJpbmdPclplcm8iHGdldEJpZ0ludEZyb21TdHJpbmdPckRlZmF1bHQiAXMiBXRvWDE4IgdvcmlnVmFsIg1vcmlnU2NhbGVNdWx0Igdmcm9tWDE4Ig9yZXN1bHRTY2FsZU11bHQiEWtleUZhY3RvcnlBZGRyZXNzIhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCINa2V5RmFjdG9yeUNmZyITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nIgpscEFzc2V0U3RyIhBrZXlGYWN0b3J5THBMaXN0IiZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcyIUa2V5RmFjdG9yeVBvb2xXZWlnaHQiD2NvbnRyYWN0QWRkcmVzcyIKcmVhZExwTGlzdCIHZmFjdG9yeSIUcmVhZEZhY3RvcnlDZmdPckZhaWwiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50IiFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQiFWtleUVtaXNzaW9uU3RhcnRCbG9jayIba2V5RW1pc3Npb25EdXJhdGlvbkluQmxvY2tzIhNrZXlFbWlzc2lvbkVuZEJsb2NrIg9rZXlTdGFrZWRCeVVzZXIiDnVzZXJBZGRyZXNzU3RyIgxscEFzc2V0SWRTdHIiDmtleVN0YWtlZFRvdGFsIhBrZXlDbGFpbWVkQnlVc2VyIhlrZXlDbGFpbWVkQnlVc2VyTWluUmV3YXJkIhtrZXlDbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQiD2tleUNsYWltZWRUb3RhbCIKcmVhZFN0YWtlZCIVa2V5TGFzdFRvdGFsTHBCYWxhbmNlIglscEFzc2V0SWQiFGtleUxhc3RVc2VyTHBCYWxhbmNlIgt1c2VyQWRkcmVzcyIZa2V5VG90YWxMcEJhbGFuY2VJbnRlZ3JhbCIYa2V5VXNlckxwQmFsYW5jZUludGVncmFsIiZrZXlUb3RhbExwQmFsYW5jZUludGVncmFsTGFzdFVwZEhlaWdodCIla2V5VXNlckxwQmFsYW5jZUludGVncmFsTGFzdFVwZEhlaWdodCISa2V5V3hQZXJMcEludGVncmFsIh9rZXlXeFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0IhBrZXlXeFRvQ2xhaW1Vc2VyIiNrZXlXeFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodCIKa2V5V3hQZXJMcCINa2V5V3hQZXJMcFgxOCIaa2V5V3hQZXJMcEludGVncmFsVXNlckxhc3QiGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQiBHR5cGUiBnR4SWQ1OCITZm9ybWF0SGlzdG9yeVJlY29yZCIGYW1vdW50IhVPcGVyYXRpb25IaXN0b3J5RW50cnkiBHR4SWQiDmZhY3RvcnlBZGRyZXNzIg9mYWN0b3J5Q29udHJhY3QiEGVtaXNzaW9uQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiCmJvb3N0Q29lZmYiAUAiFmxwU3Rha2luZ1Bvb2xzQ29udHJhY3QiC2tleU5leHRVc2VyIhBnZXRVc2Vyc0xpc3ROYW1lIgtrZXlMaXN0SGVhZCIIbGlzdE5hbWUiC2tleUxpc3RTaXplIgtrZXlMaXN0UHJldiICaWQiC2tleUxpc3ROZXh0Igxjb250YWluc05vZGUiCmhlYWRPclVuaXQiCnByZXZPclVuaXQiCm5leHRPclVuaXQiEWluc2VydE5vZGVBY3Rpb25zIghsaXN0U2l6ZSIJY2hlY2tOb2RlIhFkZWxldGVOb2RlQWN0aW9ucyIbY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0IgxzdGFrZWRCeVVzZXIiJnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0T3JaZXJvIhJ3eFBlckxwSW50ZWdyYWxOZXciGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZIhRyZWZyZXNoUG9vbElOVEVHUkFMUyIOcG9vbEFkZHJlc3NTdHIiDWxwRGVsdGFBbW91bnQiDnN0YWtlZFRvdGFsS0VZIgtzdGFrZWRUb3RhbCISbm9uWmVyb1N0YWtlZFRvdGFsIgpwb29sV2VpZ2h0IhJlbWlzc2lvblN0YXJ0QmxvY2siFHd4RW1pc3Npb25QZXJCbG9ja1gzIhhwb29sV3hFbWlzc2lvblBlckJsb2NrWDMiEnd4UGVyTHBJbnRlZ3JhbEtFWSIfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWSIKd3hQZXJMcEtFWSIcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodCIPd3hQZXJMcEludGVncmFsIg93eFBlckxwT3JaZXJvWDMiAmRoIgl3eFBlckxwWDMiDnN0YWtlZFRvdGFsTmV3IhVub25aZXJvU3Rha2VkVG90YWxOZXciDHd4UGVyTHBYM05ldyIfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodE5ldyIFZGVidWciEHJlZnJlc2hJTlRFR1JBTFMiDSR0MDE0NzIzMTQ4NDUiEXBvb2xJbnRlZ3JhbFNUQVRFIglwb29sREVCVUciD3N0YWtlZEJ5VXNlcktFWSIQd3hUb0NsYWltVXNlcktFWSIjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkiDXd4VG9DbGFpbVVzZXIiF3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0IgZNVUxUMTEiEHd4VG9DbGFpbVVzZXJOZXciGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0TmV3IiN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE5ldyIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiFXBlcm1pc3Npb25EZW5pZWRFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIMc3Rha2VBY3Rpb25zIgtwb29sQWRkcmVzcyIRcmVmcmVzaFN0YWtlZFZvdGUiDSR0MDE4MDY0MTgxODEiDWludGVncmFsU1RBVEUiC2xpc3RBY3Rpb25zIg51bnN0YWtlQWN0aW9ucyIXbHBBc3NldFJlY2lwaWVudEFkZHJlc3MiFmNsYWltZWRCeVVzZXJNaW5SZXdhcmQiEGF2YWlsYWJsZVRvQ2xhaW0iFXRocm93SWZOb3RoaW5nVG9DbGFpbSIBciIRZmFjdG9yeUFkZHJlc3NTdHIiC2NoZWNrQ2FsbGVyIhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IgVjaGVrcyIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFWNoZWNrTWFuYWdlclB1YmxpY0tleSICcG0iBWhhc1BNIgdjaGVja1BNIgNwbXQiCWNhbGxlclN0ciIGcmVzdWx0IhBjbGFpbWVkQnlVc2VyS0VZIg9jbGFpbWVkVG90YWxLRVkiGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkiG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWSINY2xhaW1lZEJ5VXNlciIYY2xhaW1lZEJ5VXNlckJvb3N0UmV3YXJkIgxjbGFpbWVkVG90YWwiDSR0MDI1OTk3MjYxMDkiEnd4QW1vdW50Qm9vc3RUb3RhbCINbWluUmV3YXJkUGFydCIPYm9vc3RSZXdhcmRQYXJ0Igt0b3RhbFJld2FyZCIJd3hBc3NldElkIgllbWl0Qm9vc3QiEmNsYWltZWRCeVVzZXJWYWx1ZSIeY2xhaW1lZEJ5VXNlck1pblJld2FyZFBsdXNQYXJ0IitjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmRQbHVzQm9vc3RSZXdhcmRQYXJ0IiBjbGFpbWVkVG90YWxQbHVzQXZhaWxhYmxlVG9DbGFpbSILY3VycmVudEl0ZXIiCmxwQXNzZXRJZHMiBnJlc0FjYyIEaW5mbyIJdW5jbGFpbWVkIgdjbGFpbWVkIhF1c2VyVm90ZUZpbmFsaXplZCIDcmVzIgNpbnYiEnd4RW1pc3Npb25QZXJCbG9jayIMcGFzc2VkQmxvY2tzIg5wb29sV3hFbWlzc2lvbiIMdXNlcld4UmV3YXJkIg0kdDAzMDE2MDMwMjcyIg5ib29zdEludlJlc3VsdCIKYm9vc3REZWJ1ZyIKdXNlck9yVW5pdCIHJG1hdGNoMSIEaGVhZCIObmV4dFVzZXJPclVuaXQiCG5leHRVc2VyIg0kdDAzMzA2MjMzMTcyIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXljAAFhAAgAAWIA6AcAAWMAgMLXLwABZAASAAFlCQC2AgEAgICQu7rWrfANAAFmAgJfXwABZwUBYwABaAkAtgIBAAAAAWkJALYCAQABAQFqAQFrCQC5CQIJAMwIAgINc3Rha2luZy5yaWRlOgkAzAgCCQClCAEFBHRoaXMJAMwIAgUBawUDbmlsAgEgAQFsAQFrCQACAQkBAWoBBQFrAQFtAQFuBAFvBQFuAwkAAQIFAW8CCUxpc3RbQW55XQQBcAUBbwUBcAkBAWwBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BAXEBAW4EAW8FAW4DCQABAgUBbwIDSW50BAFyBQFvBQFyCQEBbAECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEBcwEBbgQBbwUBbgMJAAECBQFvAgZTdHJpbmcEAXQFAW8FAXQJAQFsAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQF1AQFuBAFvBQFuAwkAAQIFAW8CCkJ5dGVWZWN0b3IEAXYFAW8FAXYJAQFsAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQF3AgF4AXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQF4BQF5CQEBagEJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAXkCDyBpcyBub3QgZGVmaW5lZAEBegIBeAF5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUBeAUBeQkBAWoBCQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUBeAIBLgUBeQIPIGlzIG5vdCBkZWZpbmVkAQFBAgF4AXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBeAUBeQAAAQFCAwF4AXkBQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQF4BQF5BQFDAQFEAgF4AXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQF4BQF5CQEBagEJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FAXkCDyBpcyBub3QgZGVmaW5lZAEBRQIBeAF5CQEFdmFsdWUBCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUBeAUBeQIBMAEBRgMBeAF5AUMEAW8JAJ0IAgUBeAUBeQMJAAECBQFvAgZTdHJpbmcEAUcFAW8JAQV2YWx1ZQEJAKgDAQUBRwMJAAECBQFvAgRVbml0BQFDCQACAQILTWF0Y2ggZXJyb3IBAUgCAUkBSgkAvAIDCQC2AgEFAUkFAWUJALYCAQUBSgEBSwIBbgFMCQCgAwEJALwCAwUBbgkAtgIBBQFMBQFlAQFNAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwEBTgACGiVzX192b3RpbmdFbWlzc2lvbkNvbnRyYWN0AAFPAAEAAVAAAgABUQADAAFSAAQAAVMABQABVAAGAAFVAAcBAVYAAhElc19fZmFjdG9yeUNvbmZpZwEBVwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFYAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFZAQFaCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAVoJAMwIAgIebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQNuaWwFAWYBAmFhAAIQJXNfX2xwVG9rZW5zTGlzdAECYWIBAVoJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUBWgkAzAgCAh5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFA25pbAUBZgECYWMBAmFkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgpwb29sV2VpZ2h0CQDMCAIFAmFkBQNuaWwFAWYBAmFlAQJhZgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFAmFmCQECYWEAAgAFAWYBAmFnAQJhZgkAtQkCCQEBegIFAmFmCQEBVgAFAWYBAmFoAQJhaQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhaQUBUAECYWoBAmFpCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFpBQFTAQJhawECYWkJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYWkFAU8BAmFsAAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQJhbQACHiVzJXNfX3JhdGVQZXJCbG9ja01heF9fY3VycmVudAECYW4AAholcyVzX19lbWlzc2lvbl9fc3RhcnRCbG9jawECYW8AAhglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAmFwAAIYJXMlc19fZW1pc3Npb25fX2VuZEJsb2NrAQJhcQICYXICYXMJALkJAgkAzAgCAg4lcyVzJXNfX3N0YWtlZAkAzAgCBQJhcgkAzAgCBQJhcwUDbmlsBQFmAQJhdAECYXMJAKwCAgIXJXMlcyVzX19zdGFrZWRfX3RvdGFsX18FAmFzAQJhdQICYXMCYXIJALkJAgkAzAgCAg8lcyVzJXNfX2NsYWltZWQJAMwIAgUCYXIJAMwIAgUCYXMFA25pbAUBZgECYXYCAmFzAmFyCQC5CQIJAMwIAgIYJXMlcyVzX19jbGFpbWVkTWluUmV3YXJkCQDMCAIFAmFyCQDMCAIFAmFzBQNuaWwFAWYBAmF3AgJhcwJhcgkAuQkCCQDMCAICGiVzJXMlc19fY2xhaW1lZEJvb3N0UmV3YXJkCQDMCAIFAmFyCQDMCAIFAmFzBQNuaWwFAWYBAmF4AQJhcwkAuQkCCQDMCAICFiVzJXMlc19fY2xhaW1lZF9fdG90YWwJAMwIAgUCYXMFA25pbAUBZgECYXkBAXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBeQAAAQJhegECYUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYUEJAMwIAgIFdG90YWwJAMwIAgIDYmFsBQNuaWwFAWYBAmFCAgJhQQJhQwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJhQQkAzAgCBQJhQwkAzAgCAgNiYWwFA25pbAUBZgECYUQBAmFBCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFAmFBCQDMCAICBXRvdGFsCQDMCAICBmJhbElOVAUDbmlsBQFmAQJhRQICYUECYUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgUCYUEJAMwIAgUCYUMJAMwIAgIGYmFsSU5UBQNuaWwFAWYBAmFGAQJhQQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJhQQkAzAgCAgV0b3RhbAkAzAgCAgdsYXN0VXBkBQNuaWwFAWYBAmFHAgJhQQJhQwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJhQQkAzAgCBQJhQwkAzAgCAgdsYXN0VXBkBQNuaWwFAWYBAmFIAQJhQQkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmFBCQDMCAICBmNvbW1vbgkAzAgCAgVscEludAUDbmlsBQFmAQJhSQECYUEJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCBQJhQQkAzAgCAgZjb21tb24JAMwIAgIGbHBJbnRIBQNuaWwFAWYBAmFKAgJhQQJhQwkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmFBCQDMCAIFAmFDCQDMCAICBWxwSW50BQNuaWwFAWYBAmFLAgJhQQJhQwkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmFBCQDMCAIFAmFDCQDMCAICBmxwSW50SAUDbmlsBQFmAQJhTAECYUEJALkJAgkAzAgCAgIlcwkAzAgCBQJhQQkAzAgCAgd3eFBlckxwBQNuaWwFAWYBAmFNAQJhQQkAuQkCCQDMCAICAiVzCQDMCAIFAmFBCQDMCAICCnd4UGVyTHBYMTgFA25pbAUBZgECYU4CAmFBAmFDCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgUCYUEJAMwIAgUCYUMJAMwIAgIFdUludEwFA25pbAUBZgECYU8DAmFQAmFDAmFRCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUCYVAJAMwIAgUCYUMJAMwIAgUCYVEFA25pbAUBZgECYVIEAmFDAmFBAmFQAmFTCQC5CQIJAMwIAgIMJXMlcyVzJWQlZCVkCQDMCAIFAmFDCQDMCAIFAmFBCQDMCAIFAmFQCQDMCAIJAKQDAQUGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQJhUwUDbmlsBQFmAQJhVAUCYVACYUMCYUECYVMCYVUJAQtTdHJpbmdFbnRyeQIJAQJhTwMFAmFQBQJhQwkA2AQBBQJhVQkBAmFSBAUCYUMFAmFBBQJhUAUCYVMAAmFWCQEBdwIFBHRoaXMJAQFNAAACYVcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFWAAJhaQkBAmFnAQUCYVcAAmFYCQECYWoBBQJhaQACYVkJAQJhaAEFAmFpAAJhWgoAAmJhCQD8BwQFAmFYAhVnZXRCb29zdENvZWZmUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJhAgNJbnQFAmJhCQACAQkArAICCQADAQUCYmECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAACYmIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkAuQkCCQDMCAICAiVzCQDMCAICFmxwU3Rha2luZ1Bvb2xzQ29udHJhY3QFA25pbAUBZgkBAWoBAi5scF9zdGFraW5nX3Bvb2xzIGNvbnRyYWN0IGFkZHJlc3MgaXMgdW5kZWZpbmVkCQEBagECKWludmFsaWQgbHBfc3Rha2luZ19wb29scyBjb250cmFjdCBhZGRyZXNzAQJiYwECYUEJALkJAgkAzAgCAgQlcyVzCQDMCAIFAmFBCQDMCAICCG5leHRVc2VyBQNuaWwFAWYBAmJkAQJhQQkAuQkCCQDMCAICBXVzZXJzCQDMCAIFAmFBBQNuaWwFAWYBAmJlAQJiZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJiZgkAzAgCAgRoZWFkBQNuaWwFAWYBAmJnAQJiZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQJiZgkAzAgCAgRzaXplBQNuaWwFAWYBAmJoAgJiZgJiaQkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAIFAmJmCQDMCAIFAmJpCQDMCAICBHByZXYFA25pbAUBZgECYmoCAmJmAmJpCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgUCYmYJAMwIAgUCYmkJAMwIAgIEbmV4dAUDbmlsBQFmAQJiawICYmYCYmkEAmJsCQCdCAIFBHRoaXMJAQJiZQEFAmJmBAJibQkAnQgCBQR0aGlzCQECYmgCBQJiZgUCYmkEAmJuCQCdCAIFBHRoaXMJAQJiagIFAmJmBQJiaQMDCQAAAgUCYmkJAQt2YWx1ZU9yRWxzZQIFAmJsAgAGCQECIT0CBQJibQUEdW5pdAYJAQIhPQIFAmJuBQR1bml0AQJibwICYmYCYmkEAmJsCQCdCAIFBHRoaXMJAQJiZQEFAmJmBAJicAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYmcBBQJiZgAABAJicQMJAQEhAQkBAmJrAgUCYmYFAmJpBgkBAWwBAgtOb2RlIGV4aXN0cwMJAAACBQJicQUCYnEJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYmcBBQJiZgkAZAIFAmJwAAEFA25pbAMJAQIhPQIFAmJsBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiagIFAmJmBQJiaQkBBXZhbHVlAQUCYmwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJoAgUCYmYJAQV2YWx1ZQEFAmJsBQJiaQUDbmlsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJlAQUCYmYFAmJpBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJyAgJiZgJiaQQCYmwJAJ0IAgUEdGhpcwkBAmJlAQUCYmYEAmJwCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJiZwEFAmJmAAAEAmJtCQCdCAIFBHRoaXMJAQJiaAIFAmJmBQJiaQQCYm4JAJ0IAgUEdGhpcwkBAmJqAgUCYmYFAmJpCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJiZwEFAmJmCQBlAgUCYnAAAQUDbmlsAwMJAQIhPQIFAmJtBQR1bml0CQECIT0CBQJibgUEdW5pdAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJqAgUCYmYJAQV2YWx1ZQEFAmJtCQEFdmFsdWUBBQJibgkAzAgCCQELU3RyaW5nRW50cnkCCQECYmgCBQJiZgkBBXZhbHVlAQUCYm4JAQV2YWx1ZQEFAmJtCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJiaAIFAmJmBQJiaQkAzAgCCQELRGVsZXRlRW50cnkBCQECYmoCBQJiZgUCYmkFA25pbAMJAQIhPQIFAmJuBQR1bml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJiZQEFAmJmCQEFdmFsdWUBBQJibgkAzAgCCQELRGVsZXRlRW50cnkBCQECYmoCBQJiZgUCYmkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJoAgUCYmYJAQV2YWx1ZQEFAmJuBQNuaWwDCQECIT0CBQJibQUEdW5pdAkAzAgCCQELRGVsZXRlRW50cnkBCQECYmgCBQJiZgUCYmkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJqAgUCYmYJAQV2YWx1ZQEFAmJtBQNuaWwDCQAAAgUCYmkJAQt2YWx1ZU9yRWxzZQIFAmJsAgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJlAQUCYmYFA25pbAkBAWwBCQCsAgIJAKwCAgkArAICAg5pbnZhbGlkIG5vZGU6IAUCYmYCAS4FAmJpAQJicwQCYnQCYnUCYnYCYncDAwkAAAIFAmJ1BQFoCQC/AgIFAmJ0BQFoBwUBaAMJAAACBQJidAUBaAUCYnYDAwkAvwICBQJidQUBaAkAvwICBQJidAUBaAcJAQV2YWx1ZQEJAKgDAQkBAXcCBQR0aGlzBQJidwkBAWwBAi1jYWxjV3hQZXJMcEludGVncmFsVXNlckxhc3Q6IHVuZXhwZWN0ZWQgc3RhdGUBAmJ4AwJhcwJieQJiegQCYkEJAQJhdAEFAmFzBAJiQgkAtgIBCQECYXkBBQJiQQQCYkMDCQAAAgUCYkIFAWgFAWkFAmJCBAJiRAkBEUBleHRyTmF0aXZlKDEwNTApAgUCYVcJAQJhYwEFAmJ5BAJiRQkBAUQCBQJhWAkBAmFuAAQCYkYJAGgCCQEBRAIFAmFYCQECYWwABQFiBAJiRwkAawMFAmJGBQJiRAkAaAIFAWcFAmFaBAJiSAkBAmFIAQUCYXMEAmJJCQECYUkBBQJhcwQCYkoJAQJhTAEFAmFzBAJiSwkBAUIDBQR0aGlzBQJiSQUCYkUEAmJMCQEBRQIFBHRoaXMFAmJIBAJiTQAABAJiTgkAlgMBCQDMCAIJAGUCBQZoZWlnaHQFAmJLCQDMCAIAAAUDbmlsBAJiTwMJAQIhPQIFAmJNAAAJALYCAQUCYk0JALwCAwkAtgIBBQJiRwkAtgIBBQFjBQJiQwQCYlAJALcCAgUCYkIJALYCAQUCYnoEAmJRAwkAAAIFAmJQBQFoBQFpBQJiUAQCYnYJALcCAgUCYkwJALkCAgUCYk8JALYCAQUCYk4EAmJSCQC6AgIJALYCAQUCYkcFAmJRBAJiUwUGaGVpZ2h0BAJiVAkAuQkCCQDMCAIJAKYDAQUCYnYJAMwIAgkApAMBBQJiTgkAzAgCCQCmAwEFAmJPCQDMCAIJAKYDAQUCYkIJAMwIAgkApAMBBQJiRwkAzAgCCQCkAwEFAmJGCQDMCAIJAKQDAQUCYkQFA25pbAICOjoJAJUKAwUCYnYJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYkgJAKYDAQUCYnYJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJJBQJiUwkAzAgCCQELU3RyaW5nRW50cnkCBQJiSgkApgMBBQJiUgUDbmlsBQJiVAECYlUEAmFzAmFyAmJ5AmJ6BAJiVgkBAmJ4AwUCYXMFAmJ5BQJiegQCYnYIBQJiVgJfMQQCYlcIBQJiVgJfMgQCYlgIBQJiVgJfMwQCYlkJAQJhcQIFAmFyBQJhcwQCYnQJAQJheQEFAmJZBAJiWgkBAmFKAgUCYXMFAmFyBAJjYQkBAmFLAgUCYXMFAmFyBAJidwkBAmFOAgUCYXMFAmFyBAJjYgkBAUUCBQR0aGlzBQJiWgQCYnUJAQFBAgUEdGhpcwUCY2EEAmNjCQECYnMECQC2AgEFAmJ0CQC2AgEFAmJ1BQJidgUCYncEAmNkCQBoAgUBYwUBYgQCY2UJAJgDAQkAzAgCCQC3AgIFAmNiCQC8AgMJALgCAgUCYnYFAmNjCQC2AgEFAmJ0CQC2AgEFAmNkCQDMCAIFAWgFA25pbAQCY2YFAmJ2BAJjZwUGaGVpZ2h0BAJiVAkAuQkCCQDMCAIJAKYDAQUCY2IJAMwIAgkApgMBBQJjYwkAzAgCCQCkAwEFAmJ0CQDMCAIFAmJYCQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAjo6CQCVCgMFAmNlCQDOCAIFAmJXCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmJaCQCmAwEFAmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJjYQUCY2cJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYncJAKYDAQUCY2YFA25pbAUCYlQBAmNoAAQBbwkAoggBCQEBVwADCQABAgUBbwIGU3RyaW5nBAFHBQFvCQDZBAEFAUcDCQABAgUBbwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJjaQAEAW8JAKIIAQkBAVgAAwkAAQIFAW8CBlN0cmluZwQBRwUBbwkA2QQBBQFHAwkAAQIFAW8CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACY2oJAQFsAQIRUGVybWlzc2lvbiBkZW5pZWQBAmNrAQJjbAMJAAACCAUCY2wGY2FsbGVyBQR0aGlzBgUCY2oBAmNtAQJjbAQBbwkBAmNoAAMJAAECBQFvAgpCeXRlVmVjdG9yBAJjbgUBbwMJAAACCAUCY2wPY2FsbGVyUHVibGljS2V5BQJjbgYFAmNqAwkAAQIFAW8CBFVuaXQDCQAAAggFAmNsBmNhbGxlcgUEdGhpcwYFAmNqCQACAQILTWF0Y2ggZXJyb3IBAmNvBQJjbAJhQQJjcAJhQwJhUwQCYXIJAKUIAQUCYUMEAmFzCQDYBAEFAmFBBAJieQkApQgBBQJjcAQCYlkJAQJhcQIFAmFyBQJhcwQCYkEJAQJhdAEFAmFzBAJidAkBAmF5AQUCYlkEAmNxAwkAAAIFAmJ0AAAJAPwHBAUCYVkCEm9uU3Rha2VkVm90ZVVwZGF0ZQkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCBgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY3EFAmNxBAJiQgkBAmF5AQUCYkEEAmNyCQECYlUEBQJhcwUCYXIFAmJ5BQJhUwQCY2UIBQJjcgJfMQQCY3MIBQJjcgJfMgQCYlQIBQJjcgJfMwQCYmYJAQJiZAEFAmFzBAJjdAMJAQJiawIFAmJmBQJhcgUDbmlsCQECYm8CBQJiZgUCYXIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiWQkAZAIFAmJ0BQJhUwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYkEJAGQCBQJiQgUCYVMJAMwIAgkBAmFUBQIFc3Rha2UFAmFyBQJhcwUCYVMIBQJjbA10cmFuc2FjdGlvbklkBQNuaWwFAmNzBQJjdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY3UGAmNsAmFBAmNwAmFDAmN2AmFTBAJhcgkApQgBBQJhQwQCYXMJANgEAQUCYUEEAmJ5CQClCAEFAmNwBAJiWQkBAmFxAgUCYXIFAmFzBAJiQQkBAmF0AQUCYXMEAmJ0CQECYXkBBQJiWQQCYkIJAQJheQEFAmJBBAJjcwgJAQJiVQQFAmFzBQJhcgUCYnkJAQEtAQUCYVMCXzIEAmJmCQECYmQBBQJhcwQCY3QDAwkBAmJrAgUCYmYFAmFyCQAAAgUCYVMFAmJ0BwkBAmJyAgUCYmYFAmFyBQNuaWwEAmNxAwkAAAIFAmFTBQJidAkA/AcEBQJhWQISb25TdGFrZWRWb3RlVXBkYXRlCQDMCAIFAmFzCQDMCAIFAmFyCQDMCAIHBQNuaWwFA25pbAUEdW5pdAMJAAACBQJjcQUCY3EEAmN3CQEBRQIFBHRoaXMJAQJhdgIFAmFzBQJhcgQCY2UICQECYlUEBQJhcwUCYXIFAmJ5AAACXzEEAmN4CQC4AgIFAmNlBQJjdwQCY3kGBAJjegMJAL8CAgUCY3gFAWgJAPwHBAUEdGhpcwIPY2xhaW1XeElOVEVSTkFMCQDMCAIFAmFzCQDMCAIFAmFyCQDMCAIFAmN5BQNuaWwFA25pbAUEdW5pdAMJAAACBQJjegUCY3oDCQBmAgUCYVMFAmJ0CQEBbAEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOcGFzc2VkIGFtb3VudD0JAKQDAQUCYVMCGyBpcyBncmVhdGVyIHRoYW4gYXZhaWxhYmxlPQkApAMBBQJidAIMLiBscEFzc2V0SWQ9BQJhcwISLiBzdGFrZWRCeVVzZXJLRVk9BQJiWQkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmJZCQBlAgUCYnQFAmFTCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJiQQkAZQIFAmJCBQJhUwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjdgUCYVMFAmFBCQDMCAIJAQJhVAUCB3Vuc3Rha2UFAmFyBQJhcwUCYVMIBQJjbA10cmFuc2FjdGlvbklkBQNuaWwFAmNzBQJjdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhICY2wBC2NvbnN0cnVjdG9yAQJjQQQCY0IJAQJjbQEFAmNsAwkAAAIFAmNCBQJjQgkAzAgCCQELU3RyaW5nRW50cnkCCQEBTQAFAmNBBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2wBDWNvbnN0cnVjdG9yVjIBAmNDBAJjRAkAzAgCCQECY20BBQJjbAkAzAgCAwkBAiE9AgkApggBBQJjQwUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjRAUCY0QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJjQwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNsAQpzZXRNYW5hZ2VyAQJjRQQCY0IJAQJjbQEFAmNsAwkAAAIFAmNCBQJjQgQCY0YJANkEAQUCY0UDCQAAAgUCY0YFAmNGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAAUCY0UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjbAEOY29uZmlybU1hbmFnZXIABAJjRwkBAmNpAAQCY0gDCQEJaXNEZWZpbmVkAQUCY0cGCQEBbAECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjSAUCY0gEAmNJAwkAAAIIBQJjbA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNHBgkBAWwBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCY0kFAmNJCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFXAAkA2AQBCQEFdmFsdWUBBQJjRwkAzAgCCQELRGVsZXRlRW50cnkBCQEBWAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjbAEFc3Rha2UAAwkBAiE9AgkAkAMBCAUCY2wIcGF5bWVudHMAAQkBAWwBAjRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAJjSgkAkQMCCAUCY2wIcGF5bWVudHMAAAQCYUEJAQV2YWx1ZQEIBQJjSgdhc3NldElkBAJhcwkA2AQBBQJhQQQCYVMIBQJjSgZhbW91bnQEAmJ5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVcJAQFZAQUCYXMJAQFqAQkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmFzBAJjcAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYnkEAmFDAwkAAAIIBQJjbAZjYWxsZXIFAmNwCAUCY2wMb3JpZ2luQ2FsbGVyCAUCY2wGY2FsbGVyCQECY28FBQJjbAUCYUEFAmNwBQJhQwUCYVMCY2wBCHN0YWtlRm9yAQJhcgMJAQIhPQIJAJADAQgFAmNsCHBheW1lbnRzAAEJAQFsAQI0aW52YWxpZCBwYXltZW50IC0gZXhhY3Qgb25lIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQCY0oJAJEDAggFAmNsCHBheW1lbnRzAAAEAmFBCQEFdmFsdWUBCAUCY0oHYXNzZXRJZAQCYXMJANgEAQUCYUEEAmFTCAUCY0oGYW1vdW50BAJieQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFXCQEBWQEFAmFzCQEBagEJAKwCAgIVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQJhcwQCY3AJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmJ5BAJhQwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAmFyCQEBagECFGludmFsaWQgdXNlciBhZGRyZXNzCQECY28FBQJjbAUCYUEFAmNwBQJhQwUCYVMCY2wBB3Vuc3Rha2UCAmFzAmFTBAJhQQkA2QQBBQJhcwQCYnkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhVwkBAVkBBQJhcwkBAWoBCQCsAgICFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUCYXMEAmNwCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieQQCY0sJAKUIAQgFAmNsBmNhbGxlcgQCYUMDCQAAAgUCY0sFAmJ5CAUCY2wMb3JpZ2luQ2FsbGVyCAUCY2wGY2FsbGVyBAJjdggFAmNsBmNhbGxlcgkBAmN1BgUCY2wFAmFBBQJjcAUCYUMFAmN2BQJhUwJjbAEPdW5zdGFrZUlOVEVSTkFMBAJhQQJhUwJhQwJjdgQCYXMJANgEAQUCYUEEAmNwCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVcJAQFZAQUCYXMJAQFqAQkArAICAhV1bnN1cHBvcnRlZCBscCBhc3NldCAFAmFzBAJjQgMJAAACCAUCY2wGY2FsbGVyBQJjcAYFAmNqAwkAAAIFAmNCBQJjQgkBAmN1BgUCY2wFAmFBBQJjcAkBB0FkZHJlc3MBBQJhQwkBB0FkZHJlc3MBBQJjdgUCYVMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2wBB2NsYWltV3gBAmFzBAJhcgkApQgBCAUCY2wGY2FsbGVyBAJjeQYEAmNMCQD8BwQFBHRoaXMCD2NsYWltV3hJTlRFUk5BTAkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCBQJjeQUDbmlsBQNuaWwJAJQKAgUDbmlsBQJjTAJjbAERY2xhaW1XeERvTm90VGhyb3cBAmFzBAJhcgkApQgBCAUCY2wGY2FsbGVyBAJjeQcEAmNMCQD8BwQFBHRoaXMCD2NsYWltV3hJTlRFUk5BTAkAzAgCBQJhcwkAzAgCBQJhcgkAzAgCBQJjeQUDbmlsBQNuaWwJAJQKAgUDbmlsBQJjTAJjbAEPY2xhaW1XeElOVEVSTkFMAwJhcwJhcgJjeQQCY0IJAQJjawEFAmNsAwkAAAIFAmNCBQJjQgQCYUMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQJhcgkBAWoBAiVjbGFpbVd4SU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzBAJieQkBAXoCBQJhVwkBAmFiAQUCYXMEAmNNCQECYXUCBQJhcwUCYXIEAmNOCQECYXgBBQJhcwQCY08JAQJhdgIFAmFzBQJhcgQCY1AJAQJhdwIFAmFzBQJhcgQCY1EJAQFFAgUEdGhpcwUCY00EAmN3CQEBRQIFBHRoaXMFAmNPBAJjUgkBAUUCBQR0aGlzBQJjUAQCY1MJAQFFAgUEdGhpcwUCY04EAmNUCQECYlUEBQJhcwUCYXIFAmJ5AAAEAmNlCAUCY1QCXzEEAmNzCAUCY1QCXzIEAmJUCAUCY1QCXzMEAmN4CQCYAwEJAMwIAgkAuAICBQJjZQUCY3cJAMwIAgUBaAUDbmlsAwkAwAICBQFoBQJjeAMFAmN5CQEBbAECEG5vdGhpbmcgdG8gY2xhaW0JAJQKAgUDbmlsAAAEAmNVCQCWAwEJAMwIAgkBAXEBCQCRAwIJAQFtAQkA/AcEBQJhWQIMY2xhaW1XeEJvb3N0CQDMCAIFAmFzCQDMCAIFAmFyBQNuaWwFA25pbAAACQDMCAIAAAUDbmlsBAJjVgUCY3gEAmNXCQCZAwEJAMwIAgkAuQICBQJjVgkAtgIBCQBlAgUCYVoAAQkAzAgCCQC2AgEFAmNVBQNuaWwEAmNYCQC3AgIFAmNWBQJjVwQCY1kJAQF1AQkAkQMCCQEBbQEJAPwHBAUCYVgCBGVtaXQJAMwIAgkAoAMBBQJjVgUDbmlsBQNuaWwAAAQCY1oJAQFtAQkA/AcEBQJhWAIEZW1pdAkAzAgCCQCgAwEFAmNXBQNuaWwFA25pbAMJAAACBQJjWgUCY1oEAmRhCQC3AgIJALcCAgUCY1EFAmNWBQJjVwQCZGIJALcCAgUCY3cFAmNWBAJkYwkAtwICBQJjUgUCY1cEAmRkCQC3AgIFAmNTBQJjeAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNNCQCmAwEFAmRhCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNPCQCmAwEFAmRiCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNQCQCmAwEFAmRjCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmNOCQCmAwEFAmRkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFDCQCgAwEFAmNWBQJjWQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhQwkAoAMBBQJjVwUCY1kJAMwIAgkBAmFUBQIFY2xhaW0FAmFyBQJhcwkAoAMBBQJjeAgFAmNsDXRyYW5zYWN0aW9uSWQFA25pbAkAoAMBBQJjWAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjbAEbY2xhaW1XeEJ1bGtJbnRlcm5hbFJFQURPTkxZBAJkZQJkZgJhcgJkZwMJAAACBQJkZQkAkAMBBQJkZgkAlAoCBQNuaWwFAmRnBAJhQQkAkQMCBQJkZgUCZGUEAmRoCQC1CQIKAAJiYQkA/AcEBQR0aGlzAg9jbGFpbVd4UkVBRE9OTFkJAMwIAgUCYUEJAMwIAgUCYXIFA25pbAUDbmlsAwkAAQIFAmJhAgZTdHJpbmcFAmJhCQACAQkArAICCQADAQUCYmECGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwUBZgQCZGkJAJEDAgUCZGgAAwQCZGoJAJEDAgUCZGgABAQCZGsKAAJiYQkA/AcEBQJhWQIcZ2V0VXNlclZvdGVGaW5hbGl6ZWRSRUFET05MWQkAzAgCBQJhQQkAzAgCBQJhcgUDbmlsBQNuaWwDCQABAgUCYmECA0ludAUCYmEJAAIBCQCsAgIJAAMBBQJiYQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJkbAkAzQgCBQJkZwkAuQkCCQDMCAICBiVkJWQlZAkAzAgCBQJkaQkAzAgCBQJkagkAzAgCCQCkAwEFAmRrBQNuaWwFAWYEAmRtCgACYmEJAPwHBAUEdGhpcwIbY2xhaW1XeEJ1bGtJbnRlcm5hbFJFQURPTkxZCQDMCAIJAGQCBQJkZQABCQDMCAIFAmRmCQDMCAIFAmFyCQDMCAIFAmRsBQNuaWwFA25pbAMJAAECBQJiYQIJTGlzdFtBbnldBQJiYQkAAgEJAKwCAgkAAwEFAmJhAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUCZG0FAmRtCQCUCgIFA25pbAUCZG0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY2wBE2NsYWltV3hCdWxrUkVBRE9OTFkCAmRmAmFyBAJkbAkA/AcEBQR0aGlzAhtjbGFpbVd4QnVsa0ludGVybmFsUkVBRE9OTFkJAMwIAgAACQDMCAIFAmRmCQDMCAIFAmFyCQDMCAIFA25pbAUDbmlsBQNuaWwJAJQKAgUDbmlsBQJkbAJjbAEPY2xhaW1XeFJFQURPTkxZAgJhcwJhcgQCYlkJAQJhcQIFAmFyBQJhcwQCYkEJAQJhdAEFAmFzBAJjTQkBAmF1AgUCYXMFAmFyBAJjTwkBAmF2AgUCYXMFAmFyBAJidAkBAmF5AQUCYlkEAmJCCQECYXkBBQJiQQQCY1EJAQFFAgUEdGhpcwUCY00EAmN3CQEBRQIFBHRoaXMFAmNPBAJieQkBAXoCBQJhVwkBAmFiAQUCYXMEAmJECQERQGV4dHJOYXRpdmUoMTA1MCkCBQJhVwkBAmFjAQUCYnkEAmRuCQEBRAIFAmFYCQECYWwABAJiRQkBAUQCBQJhWAkBAmFuAAQCZG8DCQBmAgUCYkUFBmhlaWdodAAACQBlAgUGaGVpZ2h0BQJiRQQCZHAJAGsDCQBoAgUCZG4FAmRvBQJiRAUBZwQCZHEJAGsDBQJkcAUCYnQFAmJCBAJkcgkBAmJVBAUCYXMFAmFyBQJieQAABAJjZQgFAmRyAl8xBAJjcwgFAmRyAl8yBAJiVAgFAmRyAl8zBAJjeAkAmAMBCQDMCAIJALgCAgUCY2UFAmN3CQDMCAIFAWgFA25pbAQCZHMJAQFtAQkA/AcEBQJhWQIUY2xhaW1XeEJvb3N0UkVBRE9OTFkJAMwIAgUCYXMJAMwIAgUCYXIFA25pbAUDbmlsBAJjVQkAlgMBCQDMCAIJAQFxAQkAkQMCBQJkcwAACQDMCAIAAAUDbmlsBAJkdAkBAXMBCQCRAwIFAmRzAAEEAmNWBQJjeAQCY1cJAJkDAQkAzAgCCQC5AgIFAmNWCQC2AgEJAGUCBQJhWgABCQDMCAIJALYCAQUCY1UFA25pbAQCY1gJALcCAgUCY1YFAmNXCQCUCgIFA25pbAkAuQkCCQDMCAICDiVzJXMlZCVkJWQlZCVzCQDMCAIFAmFzCQDMCAIFAmFyCQDMCAIJAKYDAQUCY1gJAMwIAgkApgMBBQJjUQkAzAgCCQCmAwEFAmNWCQDMCAIJAKYDAQUCY1cJAMwIAgIEc29vbgUDbmlsBQFmAmNsARRzdGFrZWRCeVVzZXJSRUFET05MWQICYXMCYXIEAmJ0CQELdmFsdWVPckVsc2UCCQCfCAEJAQJhcQIFAmFyBQJhcwAACQCUCgIFA25pbAUCYnQCY2wBE3N0YWtlZFRvdGFsUkVBRE9OTFkBAmFzBAJiQgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYXQBBQJhcwAACQCUCgIFA25pbAUCYkICY2wBEnVzZXJzTGlzdFRyYXZlcnNhbAECYUEEAmNCAwkAAAIJANgEAQgIBQJjbAZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAU4AAgAGCQECY20BBQJjbAMJAAACBQJjQgUCY0IEAmJmCQECYmQBBQJhQQQCZHUJAKIIAQkBAmJjAQUCYUEEAmJsCQCiCAEJAQJiZQEFAmJmBAFvBQJkdQMJAAECBQFvAgRVbml0BAJkdgUCYmwDCQABAgUCZHYCBFVuaXQJAJQKAgUDbmlsBwMJAAECBQJkdgIGU3RyaW5nBAJkdwUCZHYJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYmMBBQJhQQUCZHcFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQFvAgZTdHJpbmcEAmFDBQFvBAJjdwkBAUUCBQR0aGlzCQECYXYCBQJhQQUCYUMEAmNwCQEBegIFAmFXCQECYWIBBQJhQQQCY2UICQECYlUEBQJhQQUCYUMFAmNwAAACXzEEAmN4CQC4AgIFAmNlBQJjdwQCY3kGBAJjegMJAL8CAgUCY3gFAWgJAPwHBAUEdGhpcwIPY2xhaW1XeElOVEVSTkFMCQDMCAIFAmFBCQDMCAIFAmFDCQDMCAIFAmN5BQNuaWwFA25pbAUEdW5pdAMJAAACBQJjegUCY3oEAmR4CQCiCAEJAQJiagIFAmJmBQJhQwQCZHYFAmR4AwkAAQIFAmR2AgRVbml0CQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmJjAQUCYUEFA25pbAcDCQABAgUCZHYCBlN0cmluZwQCZHkFAmR2CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmJjAQUCYUEFAmR5BQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjbAEOb25Nb2RpZnlXZWlnaHQCAmFzAmJ5AwkBAiE9AggFAmNsBmNhbGxlcgUCYVcJAQFsAQIScGVybWlzc2lvbnMgZGVuaWVkBAJkegkBAmJ4AwUCYXMFAmJ5AAAEAmJ2CAUCZHoCXzEEAmJXCAUCZHoCXzIEAmJYCAUCZHoCXzMFAmJXAQJkQQECZEIABAJkQwQBbwkBAmNoAAMJAAECBQFvAgpCeXRlVmVjdG9yBAJjbgUBbwUCY24DCQABAgUBbwIEVW5pdAgFAmRBD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJkQQlib2R5Qnl0ZXMJAJEDAggFAmRBBnByb29mcwAABQJkQxeqLFg=", "height": 2560086, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fxy6e2QGkatqZU7QT6sx8HAKTopY12XGXkVVoVtvm2Lm Next: 4vzT63LRv1LELbTyZ6kyXMNVSTqMRb2e4P95sd3nc3K2 Diff:
OldNewDifferences
118118
119119
120120 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
121-
122-
123-func keyStablePoolAddonAddr () = "%s__stablePoolAddonAddr"
124-
125-
126-func keyAddonAddr () = "%s__addonAddr"
127121
128122
129123 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
365359
366360
367361 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
368- let $t01481914941 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
369- let wxPerLpIntegralNew = $t01481914941._1
370- let poolIntegralSTATE = $t01481914941._2
371- let poolDEBUG = $t01481914941._3
362+ let $t01472314845 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
363+ let wxPerLpIntegralNew = $t01472314845._1
364+ let poolIntegralSTATE = $t01472314845._2
365+ let poolDEBUG = $t01472314845._3
372366 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
373367 let stakedByUser = readStaked(stakedByUserKEY)
374368 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
440434 if ((refreshStakedVote == refreshStakedVote))
441435 then {
442436 let stakedTotal = readStaked(stakedTotalKEY)
443- let $t01816018277 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
444- let wxToClaimUserNew = $t01816018277._1
445- let integralSTATE = $t01816018277._2
446- let debug = $t01816018277._3
437+ let $t01806418181 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
438+ let wxToClaimUserNew = $t01806418181._1
439+ let integralSTATE = $t01806418181._2
440+ let debug = $t01806418181._3
447441 let listName = getUsersListName(lpAssetIdStr)
448442 let listActions = if (containsNode(listName, userAddressStr))
449443 then nil
587581 let lpAssetId = fromBase58String(lpAssetIdStr)
588582 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr)))
589583 let poolAddress = addressFromStringValue(poolAddressStr)
590- let poolAddon = valueOrElse(getString(poolAddress, keyAddonAddr()), poolAddressStr)
591584 let callerStr = toString(i.caller)
592- let userAddress = if (if ((callerStr == poolAddressStr))
593- then true
594- else (callerStr == poolAddon))
585+ let userAddress = if ((callerStr == poolAddressStr))
595586 then i.originCaller
596587 else i.caller
597588 let lpAssetRecipientAddress = i.caller
649640 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
650641 let claimedByUserBoostReward = getBigIntFromStringOrZero(this, claimedByUserBoostRewardKEY)
651642 let claimedTotal = getBigIntFromStringOrZero(this, claimedTotalKEY)
652- let $t02631426426 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
653- let wxToClaimUserNew = $t02631426426._1
654- let integralSTATE = $t02631426426._2
655- let debug = $t02631426426._3
643+ let $t02599726109 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
644+ let wxToClaimUserNew = $t02599726109._1
645+ let integralSTATE = $t02599726109._2
646+ let debug = $t02599726109._3
656647 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
657648 if ((zeroBigInt >= availableToClaim))
658649 then if (throwIfNothingToClaim)
741732 else (height - emissionStartBlock)
742733 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
743734 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
744- let $t03047730589 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
745- let wxToClaimUserNew = $t03047730589._1
746- let integralSTATE = $t03047730589._2
747- let debug = $t03047730589._3
735+ let $t03016030272 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
736+ let wxToClaimUserNew = $t03016030272._1
737+ let integralSTATE = $t03016030272._2
738+ let debug = $t03016030272._3
748739 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
749740 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
750741 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
828819 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
829820 then throwErr("permissions denied")
830821 else {
831- let $t03337933489 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
832- let wxPerLpIntegralNew = $t03337933489._1
833- let poolIntegralSTATE = $t03337933489._2
834- let poolDEBUG = $t03337933489._3
822+ let $t03306233172 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
823+ let wxPerLpIntegralNew = $t03306233172._1
824+ let poolIntegralSTATE = $t03306233172._2
825+ let poolDEBUG = $t03306233172._3
835826 poolIntegralSTATE
836827 }
837828
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT3 = 1000
77
88 let MULT8 = 100000000
99
1010 let SCALE18 = 18
1111
1212 let MULT18 = toBigInt(1000000000000000000)
1313
1414 let SEP = "__"
1515
1616 let POOLWEIGHTMULT = MULT8
1717
1818 let zeroBigInt = toBigInt(0)
1919
2020 let oneBigInt = toBigInt(1)
2121
2222 func wrapErr (msg) = makeString(["staking.ride:", toString(this), msg], " ")
2323
2424
2525 func throwErr (msg) = throw(wrapErr(msg))
2626
2727
2828 func asAnyList (val) = match val {
2929 case valAnyLyst: List[Any] =>
3030 valAnyLyst
3131 case _ =>
3232 throwErr("fail to cast into List[Any]")
3333 }
3434
3535
3636 func asInt (val) = match val {
3737 case valInt: Int =>
3838 valInt
3939 case _ =>
4040 throwErr("fail to cast into Int")
4141 }
4242
4343
4444 func asString (val) = match val {
4545 case valStr: String =>
4646 valStr
4747 case _ =>
4848 throwErr("fail to cast into Int")
4949 }
5050
5151
5252 func asByteVector (val) = match val {
5353 case valBin: ByteVector =>
5454 valBin
5555 case _ =>
5656 throwErr("fail to cast into Int")
5757 }
5858
5959
6060 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((("mandatory this." + key) + " is not defined")))
6161
6262
6363 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((((("mandatory " + toString(address)) + ".") + key) + " is not defined")))
6464
6565
6666 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
6767
6868
6969 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
7070
7171
7272 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), wrapErr((("mandatory this." + key) + " is not defined")))
7373
7474
7575 func getBigIntFromStringOrZero (address,key) = value(parseBigInt(valueOrElse(getString(address, key), "0")))
7676
7777
7878 func getBigIntFromStringOrDefault (address,key,defaultVal) = match getString(address, key) {
7979 case s: String =>
8080 value(parseBigInt(s))
8181 case _: Unit =>
8282 defaultVal
8383 case _ =>
8484 throw("Match error")
8585 }
8686
8787
8888 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
8989
9090
9191 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
9292
9393
9494 func keyFactoryAddress () = "%s%s__config__factoryAddress"
9595
9696
9797 func keyVotingEmissionContract () = "%s__votingEmissionContract"
9898
9999
100100 let IdxFactoryCfgStakingDapp = 1
101101
102102 let IdxFactoryCfgBoostingDapp = 2
103103
104104 let IdxFactoryCfgIdoDapp = 3
105105
106106 let IdxFactoryCfgTeamDapp = 4
107107
108108 let IdxFactoryCfgEmissionDapp = 5
109109
110110 let IdxFactoryCfgRestDapp = 6
111111
112112 let IdxFactoryCfgSlippageDapp = 7
113113
114114 func keyFactoryCfg () = "%s__factoryConfig"
115115
116116
117117 func keyManagerPublicKey () = "%s__managerPublicKey"
118118
119119
120120 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
121-
122-
123-func keyStablePoolAddonAddr () = "%s__stablePoolAddonAddr"
124-
125-
126-func keyAddonAddr () = "%s__addonAddr"
127121
128122
129123 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
130124
131125
132126 func keyFactoryLpList () = "%s__lpTokensList"
133127
134128
135129 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
136130
137131
138132 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
139133
140134
141135 func readLpList (factory) = split(valueOrElse(getString(factory, keyFactoryLpList()), ""), SEP)
142136
143137
144138 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
145139
146140
147141 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
148142
149143
150144 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
151145
152146
153147 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
154148
155149
156150 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
157151
158152
159153 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
160154
161155
162156 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
163157
164158
165159 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
166160
167161
168162 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
169163
170164
171165 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
172166
173167
174168 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
175169
176170
177171 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
178172
179173
180174 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
181175
182176
183177 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
184178
185179
186180 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed__total", lpAssetIdStr], SEP)
187181
188182
189183 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
190184
191185
192186 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
193187
194188
195189 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
196190
197191
198192 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
199193
200194
201195 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
202196
203197
204198 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
205199
206200
207201 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
208202
209203
210204 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
211205
212206
213207 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
214208
215209
216210 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
217211
218212
219213 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
220214
221215
222216 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
223217
224218
225219 func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
226220
227221
228222 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
229223
230224
231225 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
232226
233227
234228 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
235229
236230
237231 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
238232
239233
240234 let factoryAddress = getStringOrFail(this, keyFactoryAddress())
241235
242236 let factoryContract = addressFromStringValue(factoryAddress)
243237
244238 let factoryCfg = readFactoryCfgOrFail(factoryContract)
245239
246240 let emissionContract = getEmissionAddressOrFail(factoryCfg)
247241
248242 let boostingContract = getBoostingAddressOrFail(factoryCfg)
249243
250244 let boostCoeff = {
251245 let @ = invoke(emissionContract, "getBoostCoeffREADONLY", nil, nil)
252246 if ($isInstanceOf(@, "Int"))
253247 then @
254248 else throw(($getType(@) + " couldn't be cast to Int"))
255249 }
256250
257251 let lpStakingPoolsContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(makeString(["%s", "lpStakingPoolsContract"], SEP)), wrapErr("lp_staking_pools contract address is undefined"))), wrapErr("invalid lp_staking_pools contract address"))
258252
259253 func keyNextUser (lpAssetId) = makeString(["%s%s", lpAssetId, "nextUser"], SEP)
260254
261255
262256 func getUsersListName (lpAssetId) = makeString(["users", lpAssetId], SEP)
263257
264258
265259 func keyListHead (listName) = makeString(["%s%s%s", listName, "head"], SEP)
266260
267261
268262 func keyListSize (listName) = makeString(["%s%s%s", listName, "size"], SEP)
269263
270264
271265 func keyListPrev (listName,id) = makeString(["%s%s%s%s", listName, id, "prev"], SEP)
272266
273267
274268 func keyListNext (listName,id) = makeString(["%s%s%s%s", listName, id, "next"], SEP)
275269
276270
277271 func containsNode (listName,id) = {
278272 let headOrUnit = getString(this, keyListHead(listName))
279273 let prevOrUnit = getString(this, keyListPrev(listName, id))
280274 let nextOrUnit = getString(this, keyListNext(listName, id))
281275 if (if ((id == valueOrElse(headOrUnit, "")))
282276 then true
283277 else (prevOrUnit != unit))
284278 then true
285279 else (nextOrUnit != unit)
286280 }
287281
288282
289283 func insertNodeActions (listName,id) = {
290284 let headOrUnit = getString(this, keyListHead(listName))
291285 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
292286 let checkNode = if (!(containsNode(listName, id)))
293287 then true
294288 else throwErr("Node exists")
295289 if ((checkNode == checkNode))
296290 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
297291 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
298292 else nil)) ++ [StringEntry(keyListHead(listName), id)])
299293 else throw("Strict value is not equal to itself.")
300294 }
301295
302296
303297 func deleteNodeActions (listName,id) = {
304298 let headOrUnit = getString(this, keyListHead(listName))
305299 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
306300 let prevOrUnit = getString(this, keyListPrev(listName, id))
307301 let nextOrUnit = getString(this, keyListNext(listName, id))
308302 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
309303 then (nextOrUnit != unit)
310304 else false)
311305 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
312306 else if ((nextOrUnit != unit))
313307 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
314308 else if ((prevOrUnit != unit))
315309 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
316310 else if ((id == valueOrElse(headOrUnit, "")))
317311 then [DeleteEntry(keyListHead(listName))]
318312 else throwErr(((("invalid node: " + listName) + ".") + id))))
319313 }
320314
321315
322316 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == zeroBigInt))
323317 then (stakedByUser > zeroBigInt)
324318 else false)
325319 then zeroBigInt
326320 else if ((stakedByUser == zeroBigInt))
327321 then wxPerLpIntegralNew
328322 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > zeroBigInt))
329323 then (stakedByUser > zeroBigInt)
330324 else false)
331325 then value(parseBigInt(getStringOrFail(this, wxPerLpIntegralUserLastKEY)))
332326 else throwErr("calcWxPerLpIntegralUserLast: unexpected state")
333327
334328
335329 func refreshPoolINTEGRALS (lpAssetIdStr,poolAddressStr,lpDeltaAmount) = {
336330 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
337331 let stakedTotal = toBigInt(readStaked(stakedTotalKEY))
338332 let nonZeroStakedTotal = if ((stakedTotal == zeroBigInt))
339333 then oneBigInt
340334 else stakedTotal
341335 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
342336 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
343337 let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
344338 let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * boostCoeff))
345339 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
346340 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
347341 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
348342 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
349343 let wxPerLpIntegral = getBigIntFromStringOrZero(this, wxPerLpIntegralKEY)
350344 let wxPerLpOrZeroX3 = 0
351345 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
352346 let wxPerLpX3 = if ((wxPerLpOrZeroX3 != 0))
353347 then toBigInt(wxPerLpOrZeroX3)
354348 else fraction(toBigInt(poolWxEmissionPerBlockX3), toBigInt(MULT8), nonZeroStakedTotal)
355349 let stakedTotalNew = (stakedTotal + toBigInt(lpDeltaAmount))
356350 let nonZeroStakedTotalNew = if ((stakedTotalNew == zeroBigInt))
357351 then oneBigInt
358352 else stakedTotalNew
359353 let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX3 * toBigInt(dh)))
360354 let wxPerLpX3New = (toBigInt(poolWxEmissionPerBlockX3) / nonZeroStakedTotalNew)
361355 let wxPerLpIntegralLastUpdHeightNew = height
362356 let debug = makeString([toString(wxPerLpIntegralNew), toString(dh), toString(wxPerLpX3), toString(stakedTotal), toString(poolWxEmissionPerBlockX3), toString(wxEmissionPerBlockX3), toString(poolWeight)], "::")
363357 $Tuple3(wxPerLpIntegralNew, [StringEntry(wxPerLpIntegralKEY, toString(wxPerLpIntegralNew)), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), StringEntry(wxPerLpKEY, toString(wxPerLpX3New))], debug)
364358 }
365359
366360
367361 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
368- let $t01481914941 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
369- let wxPerLpIntegralNew = $t01481914941._1
370- let poolIntegralSTATE = $t01481914941._2
371- let poolDEBUG = $t01481914941._3
362+ let $t01472314845 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
363+ let wxPerLpIntegralNew = $t01472314845._1
364+ let poolIntegralSTATE = $t01472314845._2
365+ let poolDEBUG = $t01472314845._3
372366 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
373367 let stakedByUser = readStaked(stakedByUserKEY)
374368 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
375369 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
376370 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
377371 let wxToClaimUser = getBigIntFromStringOrZero(this, wxToClaimUserKEY)
378372 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
379373 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(toBigInt(stakedByUser), toBigInt(wxPerLpIntegralUserLastUpdHeightOrZero), wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
380374 let MULT11 = (MULT8 * MULT3)
381375 let wxToClaimUserNew = max([(wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), toBigInt(stakedByUser), toBigInt(MULT11))), zeroBigInt])
382376 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
383377 let wxPerLpIntegralUserLastUpdHeightNew = height
384378 let debug = makeString([toString(wxToClaimUser), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
385379 $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [StringEntry(wxToClaimUserKEY, toString(wxToClaimUserNew)), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), StringEntry(wxPerLpIntegralUserLastKEY, toString(wxPerLpIntegralUserLastNew))]), debug)
386380 }
387381
388382
389383 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
390384 case s: String =>
391385 fromBase58String(s)
392386 case _: Unit =>
393387 unit
394388 case _ =>
395389 throw("Match error")
396390 }
397391
398392
399393 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
400394 case s: String =>
401395 fromBase58String(s)
402396 case _: Unit =>
403397 unit
404398 case _ =>
405399 throw("Match error")
406400 }
407401
408402
409403 let permissionDeniedError = throwErr("Permission denied")
410404
411405 func mustThis (i) = if ((i.caller == this))
412406 then true
413407 else permissionDeniedError
414408
415409
416410 func mustManager (i) = match managerPublicKeyOrUnit() {
417411 case pk: ByteVector =>
418412 if ((i.callerPublicKey == pk))
419413 then true
420414 else permissionDeniedError
421415 case _: Unit =>
422416 if ((i.caller == this))
423417 then true
424418 else permissionDeniedError
425419 case _ =>
426420 throw("Match error")
427421 }
428422
429423
430424 func stakeActions (i,lpAssetId,poolAddress,userAddress,amount) = {
431425 let userAddressStr = toString(userAddress)
432426 let lpAssetIdStr = toBase58String(lpAssetId)
433427 let poolAddressStr = toString(poolAddress)
434428 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
435429 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
436430 let stakedByUser = readStaked(stakedByUserKEY)
437431 let refreshStakedVote = if ((stakedByUser == 0))
438432 then invoke(boostingContract, "onStakedVoteUpdate", [lpAssetIdStr, userAddressStr, true], nil)
439433 else unit
440434 if ((refreshStakedVote == refreshStakedVote))
441435 then {
442436 let stakedTotal = readStaked(stakedTotalKEY)
443- let $t01816018277 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
444- let wxToClaimUserNew = $t01816018277._1
445- let integralSTATE = $t01816018277._2
446- let debug = $t01816018277._3
437+ let $t01806418181 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
438+ let wxToClaimUserNew = $t01806418181._1
439+ let integralSTATE = $t01806418181._2
440+ let debug = $t01806418181._3
447441 let listName = getUsersListName(lpAssetIdStr)
448442 let listActions = if (containsNode(listName, userAddressStr))
449443 then nil
450444 else insertNodeActions(listName, userAddressStr)
451445 (([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
452446 }
453447 else throw("Strict value is not equal to itself.")
454448 }
455449
456450
457451 func unstakeActions (i,lpAssetId,poolAddress,userAddress,lpAssetRecipientAddress,amount) = {
458452 let userAddressStr = toString(userAddress)
459453 let lpAssetIdStr = toBase58String(lpAssetId)
460454 let poolAddressStr = toString(poolAddress)
461455 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
462456 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
463457 let stakedByUser = readStaked(stakedByUserKEY)
464458 let stakedTotal = readStaked(stakedTotalKEY)
465459 let integralSTATE = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))._2
466460 let listName = getUsersListName(lpAssetIdStr)
467461 let listActions = if (if (containsNode(listName, userAddressStr))
468462 then (amount == stakedByUser)
469463 else false)
470464 then deleteNodeActions(listName, userAddressStr)
471465 else nil
472466 let refreshStakedVote = if ((amount == stakedByUser))
473467 then invoke(boostingContract, "onStakedVoteUpdate", [lpAssetIdStr, userAddressStr, false], nil)
474468 else unit
475469 if ((refreshStakedVote == refreshStakedVote))
476470 then {
477471 let claimedByUserMinReward = getBigIntFromStringOrZero(this, keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr))
478472 let wxToClaimUserNew = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)._1
479473 let availableToClaim = (wxToClaimUserNew - claimedByUserMinReward)
480474 let throwIfNothingToClaim = true
481475 let r = if ((availableToClaim > zeroBigInt))
482476 then invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr, throwIfNothingToClaim], nil)
483477 else unit
484478 if ((r == r))
485479 then if ((amount > stakedByUser))
486480 then throwErr(((((((("passed amount=" + toString(amount)) + " is greater than available=") + toString(stakedByUser)) + ". lpAssetId=") + lpAssetIdStr) + ". stakedByUserKEY=") + stakedByUserKEY))
487481 else (([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(lpAssetRecipientAddress, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE) ++ listActions)
488482 else throw("Strict value is not equal to itself.")
489483 }
490484 else throw("Strict value is not equal to itself.")
491485 }
492486
493487
494488 @Callable(i)
495489 func constructor (factoryAddressStr) = {
496490 let checkCaller = mustManager(i)
497491 if ((checkCaller == checkCaller))
498492 then [StringEntry(keyFactoryAddress(), factoryAddressStr)]
499493 else throw("Strict value is not equal to itself.")
500494 }
501495
502496
503497
504498 @Callable(i)
505499 func constructorV2 (votingEmissionContract) = {
506500 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
507501 then true
508502 else "invalid voting emission contract address"]
509503 if ((cheks == cheks))
510504 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract)]
511505 else throw("Strict value is not equal to itself.")
512506 }
513507
514508
515509
516510 @Callable(i)
517511 func setManager (pendingManagerPublicKey) = {
518512 let checkCaller = mustManager(i)
519513 if ((checkCaller == checkCaller))
520514 then {
521515 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
522516 if ((checkManagerPublicKey == checkManagerPublicKey))
523517 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
524518 else throw("Strict value is not equal to itself.")
525519 }
526520 else throw("Strict value is not equal to itself.")
527521 }
528522
529523
530524
531525 @Callable(i)
532526 func confirmManager () = {
533527 let pm = pendingManagerPublicKeyOrUnit()
534528 let hasPM = if (isDefined(pm))
535529 then true
536530 else throwErr("No pending manager")
537531 if ((hasPM == hasPM))
538532 then {
539533 let checkPM = if ((i.callerPublicKey == value(pm)))
540534 then true
541535 else throwErr("You are not pending manager")
542536 if ((checkPM == checkPM))
543537 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
544538 else throw("Strict value is not equal to itself.")
545539 }
546540 else throw("Strict value is not equal to itself.")
547541 }
548542
549543
550544
551545 @Callable(i)
552546 func stake () = if ((size(i.payments) != 1))
553547 then throwErr("invalid payment - exact one payment must be attached")
554548 else {
555549 let pmt = i.payments[0]
556550 let lpAssetId = value(pmt.assetId)
557551 let lpAssetIdStr = toBase58String(lpAssetId)
558552 let amount = pmt.amount
559553 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr)))
560554 let poolAddress = addressFromStringValue(poolAddressStr)
561555 let userAddress = if ((i.caller == poolAddress))
562556 then i.originCaller
563557 else i.caller
564558 stakeActions(i, lpAssetId, poolAddress, userAddress, amount)
565559 }
566560
567561
568562
569563 @Callable(i)
570564 func stakeFor (userAddressStr) = if ((size(i.payments) != 1))
571565 then throwErr("invalid payment - exact one payment must be attached")
572566 else {
573567 let pmt = i.payments[0]
574568 let lpAssetId = value(pmt.assetId)
575569 let lpAssetIdStr = toBase58String(lpAssetId)
576570 let amount = pmt.amount
577571 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr)))
578572 let poolAddress = addressFromStringValue(poolAddressStr)
579573 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("invalid user address"))
580574 stakeActions(i, lpAssetId, poolAddress, userAddress, amount)
581575 }
582576
583577
584578
585579 @Callable(i)
586580 func unstake (lpAssetIdStr,amount) = {
587581 let lpAssetId = fromBase58String(lpAssetIdStr)
588582 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr)))
589583 let poolAddress = addressFromStringValue(poolAddressStr)
590- let poolAddon = valueOrElse(getString(poolAddress, keyAddonAddr()), poolAddressStr)
591584 let callerStr = toString(i.caller)
592- let userAddress = if (if ((callerStr == poolAddressStr))
593- then true
594- else (callerStr == poolAddon))
585+ let userAddress = if ((callerStr == poolAddressStr))
595586 then i.originCaller
596587 else i.caller
597588 let lpAssetRecipientAddress = i.caller
598589 unstakeActions(i, lpAssetId, poolAddress, userAddress, lpAssetRecipientAddress, amount)
599590 }
600591
601592
602593
603594 @Callable(i)
604595 func unstakeINTERNAL (lpAssetId,amount,userAddress,lpAssetRecipientAddress) = {
605596 let lpAssetIdStr = toBase58String(lpAssetId)
606597 let poolAddress = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), wrapErr(("unsupported lp asset " + lpAssetIdStr))))
607598 let checkCaller = if ((i.caller == poolAddress))
608599 then true
609600 else permissionDeniedError
610601 if ((checkCaller == checkCaller))
611602 then unstakeActions(i, lpAssetId, poolAddress, Address(userAddress), Address(lpAssetRecipientAddress), amount)
612603 else throw("Strict value is not equal to itself.")
613604 }
614605
615606
616607
617608 @Callable(i)
618609 func claimWx (lpAssetIdStr) = {
619610 let userAddressStr = toString(i.caller)
620611 let throwIfNothingToClaim = true
621612 let result = invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr, throwIfNothingToClaim], nil)
622613 $Tuple2(nil, result)
623614 }
624615
625616
626617
627618 @Callable(i)
628619 func claimWxDoNotThrow (lpAssetIdStr) = {
629620 let userAddressStr = toString(i.caller)
630621 let throwIfNothingToClaim = false
631622 let result = invoke(this, "claimWxINTERNAL", [lpAssetIdStr, userAddressStr, throwIfNothingToClaim], nil)
632623 $Tuple2(nil, result)
633624 }
634625
635626
636627
637628 @Callable(i)
638629 func claimWxINTERNAL (lpAssetIdStr,userAddressStr,throwIfNothingToClaim) = {
639630 let checkCaller = mustThis(i)
640631 if ((checkCaller == checkCaller))
641632 then {
642633 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), wrapErr("claimWxINTERNAL: invalid user address"))
643634 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
644635 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
645636 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
646637 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
647638 let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
648639 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
649640 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
650641 let claimedByUserBoostReward = getBigIntFromStringOrZero(this, claimedByUserBoostRewardKEY)
651642 let claimedTotal = getBigIntFromStringOrZero(this, claimedTotalKEY)
652- let $t02631426426 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
653- let wxToClaimUserNew = $t02631426426._1
654- let integralSTATE = $t02631426426._2
655- let debug = $t02631426426._3
643+ let $t02599726109 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
644+ let wxToClaimUserNew = $t02599726109._1
645+ let integralSTATE = $t02599726109._2
646+ let debug = $t02599726109._3
656647 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
657648 if ((zeroBigInt >= availableToClaim))
658649 then if (throwIfNothingToClaim)
659650 then throwErr("nothing to claim")
660651 else $Tuple2(nil, 0)
661652 else {
662653 let wxAmountBoostTotal = max([asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [lpAssetIdStr, userAddressStr], nil))[0]), 0])
663654 let minRewardPart = availableToClaim
664655 let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
665656 let totalReward = (minRewardPart + boostRewardPart)
666657 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [toInt(minRewardPart)], nil))[0])
667658 let emitBoost = asAnyList(invoke(emissionContract, "emit", [toInt(boostRewardPart)], nil))
668659 if ((emitBoost == emitBoost))
669660 then {
670661 let claimedByUserValue = ((claimedByUser + minRewardPart) + boostRewardPart)
671662 let claimedByUserMinRewardPlusPart = (claimedByUserMinReward + minRewardPart)
672663 let claimedByUserBoostRewardPlusBoostRewardPart = (claimedByUserBoostReward + boostRewardPart)
673664 let claimedTotalPlusAvailableToClaim = (claimedTotal + availableToClaim)
674665 $Tuple2([StringEntry(claimedByUserKEY, toString(claimedByUserValue)), StringEntry(claimedByUserMinRewardKEY, toString(claimedByUserMinRewardPlusPart)), StringEntry(claimedByUserBoostRewardKEY, toString(claimedByUserBoostRewardPlusBoostRewardPart)), StringEntry(claimedTotalKEY, toString(claimedTotalPlusAvailableToClaim)), ScriptTransfer(userAddress, toInt(minRewardPart), wxAssetId), ScriptTransfer(userAddress, toInt(boostRewardPart), wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, toInt(availableToClaim), i.transactionId)], toInt(totalReward))
675666 }
676667 else throw("Strict value is not equal to itself.")
677668 }
678669 }
679670 else throw("Strict value is not equal to itself.")
680671 }
681672
682673
683674
684675 @Callable(i)
685676 func claimWxBulkInternalREADONLY (currentIter,lpAssetIds,userAddressStr,resAcc) = if ((currentIter == size(lpAssetIds)))
686677 then $Tuple2(nil, resAcc)
687678 else {
688679 let lpAssetId = lpAssetIds[currentIter]
689680 let info = split({
690681 let @ = invoke(this, "claimWxREADONLY", [lpAssetId, userAddressStr], nil)
691682 if ($isInstanceOf(@, "String"))
692683 then @
693684 else throw(($getType(@) + " couldn't be cast to String"))
694685 }, SEP)
695686 let unclaimed = info[3]
696687 let claimed = info[4]
697688 let userVoteFinalized = {
698689 let @ = invoke(boostingContract, "getUserVoteFinalizedREADONLY", [lpAssetId, userAddressStr], nil)
699690 if ($isInstanceOf(@, "Int"))
700691 then @
701692 else throw(($getType(@) + " couldn't be cast to Int"))
702693 }
703694 let res = (resAcc :+ makeString(["%d%d%d", unclaimed, claimed, toString(userVoteFinalized)], SEP))
704695 let inv = {
705696 let @ = invoke(this, "claimWxBulkInternalREADONLY", [(currentIter + 1), lpAssetIds, userAddressStr, res], nil)
706697 if ($isInstanceOf(@, "List[Any]"))
707698 then @
708699 else throw(($getType(@) + " couldn't be cast to List[Any]"))
709700 }
710701 if ((inv == inv))
711702 then $Tuple2(nil, inv)
712703 else throw("Strict value is not equal to itself.")
713704 }
714705
715706
716707
717708 @Callable(i)
718709 func claimWxBulkREADONLY (lpAssetIds,userAddressStr) = {
719710 let res = invoke(this, "claimWxBulkInternalREADONLY", [0, lpAssetIds, userAddressStr, nil], nil)
720711 $Tuple2(nil, res)
721712 }
722713
723714
724715
725716 @Callable(i)
726717 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
727718 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
728719 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
729720 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
730721 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
731722 let stakedByUser = readStaked(stakedByUserKEY)
732723 let stakedTotal = readStaked(stakedTotalKEY)
733724 let claimedByUser = getBigIntFromStringOrZero(this, claimedByUserKEY)
734725 let claimedByUserMinReward = getBigIntFromStringOrZero(this, claimedByUserMinRewardKEY)
735726 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
736727 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
737728 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
738729 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
739730 let passedBlocks = if ((emissionStartBlock > height))
740731 then 0
741732 else (height - emissionStartBlock)
742733 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
743734 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
744- let $t03047730589 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
745- let wxToClaimUserNew = $t03047730589._1
746- let integralSTATE = $t03047730589._2
747- let debug = $t03047730589._3
735+ let $t03016030272 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
736+ let wxToClaimUserNew = $t03016030272._1
737+ let integralSTATE = $t03016030272._2
738+ let debug = $t03016030272._3
748739 let availableToClaim = max([(wxToClaimUserNew - claimedByUserMinReward), zeroBigInt])
749740 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
750741 let wxAmountBoostTotal = max([asInt(boostInvResult[0]), 0])
751742 let boostDebug = asString(boostInvResult[1])
752743 let minRewardPart = availableToClaim
753744 let boostRewardPart = min([(minRewardPart * toBigInt((boostCoeff - 1))), toBigInt(wxAmountBoostTotal)])
754745 let totalReward = (minRewardPart + boostRewardPart)
755746 $Tuple2(nil, makeString(["%s%s%d%d%d%d%s", lpAssetIdStr, userAddressStr, toString(totalReward), toString(claimedByUser), toString(minRewardPart), toString(boostRewardPart), "soon"], SEP))
756747 }
757748
758749
759750
760751 @Callable(i)
761752 func stakedByUserREADONLY (lpAssetIdStr,userAddressStr) = {
762753 let stakedByUser = valueOrElse(getInteger(keyStakedByUser(userAddressStr, lpAssetIdStr)), 0)
763754 $Tuple2(nil, stakedByUser)
764755 }
765756
766757
767758
768759 @Callable(i)
769760 func stakedTotalREADONLY (lpAssetIdStr) = {
770761 let stakedTotal = valueOrElse(getInteger(keyStakedTotal(lpAssetIdStr)), 0)
771762 $Tuple2(nil, stakedTotal)
772763 }
773764
774765
775766
776767 @Callable(i)
777768 func usersListTraversal (lpAssetId) = {
778769 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
779770 then true
780771 else mustManager(i)
781772 if ((checkCaller == checkCaller))
782773 then {
783774 let listName = getUsersListName(lpAssetId)
784775 let userOrUnit = getString(keyNextUser(lpAssetId))
785776 let headOrUnit = getString(keyListHead(listName))
786777 match userOrUnit {
787778 case _: Unit =>
788779 match headOrUnit {
789780 case _: Unit =>
790781 $Tuple2(nil, false)
791782 case head: String =>
792783 $Tuple2([StringEntry(keyNextUser(lpAssetId), head)], true)
793784 case _ =>
794785 throw("Match error")
795786 }
796787 case userAddress: String =>
797788 let claimedByUserMinReward = getBigIntFromStringOrZero(this, keyClaimedByUserMinReward(lpAssetId, userAddress))
798789 let poolAddress = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
799790 let wxToClaimUserNew = refreshINTEGRALS(lpAssetId, userAddress, poolAddress, 0)._1
800791 let availableToClaim = (wxToClaimUserNew - claimedByUserMinReward)
801792 let throwIfNothingToClaim = true
802793 let r = if ((availableToClaim > zeroBigInt))
803794 then invoke(this, "claimWxINTERNAL", [lpAssetId, userAddress, throwIfNothingToClaim], nil)
804795 else unit
805796 if ((r == r))
806797 then {
807798 let nextUserOrUnit = getString(keyListNext(listName, userAddress))
808799 match nextUserOrUnit {
809800 case _: Unit =>
810801 $Tuple2([DeleteEntry(keyNextUser(lpAssetId))], false)
811802 case nextUser: String =>
812803 $Tuple2([StringEntry(keyNextUser(lpAssetId), nextUser)], true)
813804 case _ =>
814805 throw("Match error")
815806 }
816807 }
817808 else throw("Strict value is not equal to itself.")
818809 case _ =>
819810 throw("Match error")
820811 }
821812 }
822813 else throw("Strict value is not equal to itself.")
823814 }
824815
825816
826817
827818 @Callable(i)
828819 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
829820 then throwErr("permissions denied")
830821 else {
831- let $t03337933489 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
832- let wxPerLpIntegralNew = $t03337933489._1
833- let poolIntegralSTATE = $t03337933489._2
834- let poolDEBUG = $t03337933489._3
822+ let $t03306233172 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
823+ let wxPerLpIntegralNew = $t03306233172._1
824+ let poolIntegralSTATE = $t03306233172._2
825+ let poolDEBUG = $t03306233172._3
835826 poolIntegralSTATE
836827 }
837828
838829
839830 @Verifier(tx)
840831 func verify () = {
841832 let targetPublicKey = match managerPublicKeyOrUnit() {
842833 case pk: ByteVector =>
843834 pk
844835 case _: Unit =>
845836 tx.senderPublicKey
846837 case _ =>
847838 throw("Match error")
848839 }
849840 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
850841 }
851842

github/deemru/w8io/3ef1775 
126.20 ms