tx · 5XUQ8XwGfMuAPs4McdvBAJAKsnoKQyN3BXUXYqoF97Ef

3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ:  -0.03700000 Waves

2023.02.04 14:52 [2434846] smart account 3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ > SELF 0.00000000 Waves

{ "type": 13, "id": "5XUQ8XwGfMuAPs4McdvBAJAKsnoKQyN3BXUXYqoF97Ef", "fee": 3700000, "feeAssetId": null, "timestamp": 1675511564829, "version": 2, "chainId": 84, "sender": "3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ", "senderPublicKey": "2NgVCitn1k18yzwhrzdQXHDEygzSkjbXS4A1koTt14db", "proofs": [ "5qSBVmRxE5Pfxu1edoXgoaKWJJq9kjTxN1LZMrFCpGMoyjPex7HiAjhsSA8Zqs5BSudqwH3bDVJjMMwX7iBGgLiB" ], "script": "base64:BgIxCAISAwoBCBIAEgMKAQESABIAEgASAwoBARIDCgEBEgASABIDCgEIEgMKAQgSAwoBCFQADWtfdG90YWxTdXBwbHkCDWtfdG90YWxTdXBwbHkAD2tfcmV3YXJkQmFsYW5jZQIPa19yZXdhcmRCYWxhbmNlAA9rX2xvY2tlZEJhbGFuY2UCD2tfbG9ja2VkQmFsYW5jZQANa19mcmVlQmFsYW5jZQINa19mcmVlQmFsYW5jZQAGa19yYXRlAgZrX3JhdGUAEGtfbGFzdFVwZGF0ZVRpbWUCEGtfbGFzdFVwZGF0ZVRpbWUAFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQCFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQADGtfcmV3YXJkUmF0ZQIMa19yZXdhcmRSYXRlAA5rX3BlcmlvZEZpbmlzaAIOa19wZXJpb2RGaW5pc2gAFGtfdXNlclJld2FyZFBlclRva2VuAhRrX3VzZXJSZXdhcmRQZXJUb2tlbgAMa191c2VyUmV3YXJkAgxrX3VzZXJSZXdhcmQACWtfYmFsYW5jZQIJa19iYWxhbmNlAA5rX2F2ZXJhZ2VfcmF0ZQIOa19hdmVyYWdlX3JhdGUAEGtfd2l0aGRyYXdfbGltaXQCEGtfd2l0aGRyYXdfbGltaXQAFGtfbGFzdF93aXRoZHJhd19kYXRlAhRrX2xhc3Rfd2l0aGRyYXdfZGF0ZQAUa193aXRoZHJhd19pbl9wZXJpb2QCFGtfd2l0aGRyYXdfaW5fcGVyaW9kAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MABWtfYW1tAgVrX2FtbQASa19nb3Zlcm5hbmNlX2Fzc2V0AgtrX2dvdl9hc3NldAANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MAEWtfbWFuYWdlcl9hZGRyZXNzAhFrX21hbmFnZXJfYWRkcmVzcwAUa19jb2xsYXRlcmFsX2FkZHJlc3MCFGtfY29sbGF0ZXJhbF9hZGRyZXNzAQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwITQ29vcmRpbmF0b3Igbm90IHNldAELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzCQELdmFsdWVPckVsc2UCCQCbCAIJAQtjb29yZGluYXRvcgAJAQ50b0NvbXBvc2l0ZUtleQIFBWtfYW1tBQhfYWRkcmVzcwcBD2dvdmVybmFuY2VBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19nb3Zlcm5hbmNlX2Fzc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ9rX2FkbWluX2FkZHJlc3MCFUFkbWluIGFkZHJlc3Mgbm90IHNldAEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEObWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19tYW5hZ2VyX2FkZHJlc3MCD01hbmFnZXIgbm90IHNldAAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAKAAoACERVUkFUSU9OCQBoAgkAaAIJAGgCAAcAPAA8ABgACk5PX0FERFJFU1MCAAAJTk9fU1RBS0VSAAABEHVzZG5Gcm9tRGVjaW1hbHMBB19hbW91bnQJAGkCBQdfYW1vdW50AGQBDnVzZG5Ub0RlY2ltYWxzAQdfYW1vdW50CQBoAgUHX2Ftb3VudABkAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBG1pbnYCAl94Al95AwkAZgIFAl94BQJfeQUCX3kFAl94AA9XSVRIRFJBV19QRVJJT0QJAGgCAICjBQDoBwATV0lUSERSQVdfUEVSX1BFUklPRAkBBGRpdmQCCQBoAgABBQxERUNJTUFMX1VOSVQJAGgCAAQFDERFQ0lNQUxfVU5JVAEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQRpbnQwAQFrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAWsAAAEEaW50MQEBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrBQxERUNJTUFMX1VOSVQBC3RvdGFsU3VwcGx5AAkBBGludDABBQ1rX3RvdGFsU3VwcGx5AQRyYXRlAAkBBGludDEBBQZrX3JhdGUBCWJhbGFuY2VPZgEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBQlrX2JhbGFuY2UFB19zdGFrZXIBC2F2ZXJhZ2VSYXRlAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFDmtfYXZlcmFnZV9yYXRlBQdfc3Rha2VyAQ13aXRoZHJhd0xpbWl0AQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfd2l0aGRyYXdfbGltaXQFB19zdGFrZXIBEXdpdGhkcmF3bkluUGVyaW9kAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFFGtfd2l0aGRyYXdfaW5fcGVyaW9kBQdfc3Rha2VyARFsYXN0V2l0aGRyYXduRGF0ZQEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRRrX2xhc3Rfd2l0aGRyYXdfZGF0ZQUHX3N0YWtlcgELZnJlZUJhbGFuY2UACQEEaW50MAEFDWtfZnJlZUJhbGFuY2UBDWxvY2tlZEJhbGFuY2UACQEEaW50MAEFD2tfbG9ja2VkQmFsYW5jZQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQACQEEaW50MAEFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQBDmxhc3RVcGRhdGVUaW1lAAkBBGludDABBRBrX2xhc3RVcGRhdGVUaW1lAQpyZXdhcmRSYXRlAAkBBGludDABBQxrX3Jld2FyZFJhdGUBDHBlcmlvZEZpbmlzaAAJAQRpbnQwAQUOa19wZXJpb2RGaW5pc2gBDXJld2FyZEJhbGFuY2UACQEEaW50MAEFD2tfcmV3YXJkQmFsYW5jZQEHcmV3YXJkcwEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBQxrX3VzZXJSZXdhcmQFB19zdGFrZXIBFnVzZXJSZXdhcmRQZXJUb2tlblBhaWQBB19zdGFrZXIJAQRpbnQwAQkBDnRvQ29tcG9zaXRlS2V5AgUUa191c2VyUmV3YXJkUGVyVG9rZW4FB19zdGFrZXIBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEQY3VycmVudFRpbWVzdGFtcAAIBQlsYXN0QmxvY2sJdGltZXN0YW1wARNjdXJyZW50VGltZXN0YW1wU2VjAAkAaQIJARBjdXJyZW50VGltZXN0YW1wAADoBwEUZ2V0V2l0aGRyYXdMaW1pdExlZnQBB19zdGFrZXIEC2N1cnJlbnREYXRlCQEQY3VycmVudFRpbWVzdGFtcAAEEGxhc3RXaXRoZHJhd0RhdGUJARFsYXN0V2l0aGRyYXduRGF0ZQEFB19zdGFrZXIECyR0MDQ5NjQ1MjI4AwkAZgIJAGUCBQtjdXJyZW50RGF0ZQUQbGFzdFdpdGhkcmF3RGF0ZQUPV0lUSERSQVdfUEVSSU9ECQCUCgIFC2N1cnJlbnREYXRlCQENd2l0aGRyYXdMaW1pdAEFB19zdGFrZXIJAJQKAgUQbGFzdFdpdGhkcmF3RGF0ZQkAZQIJAQ13aXRoZHJhd0xpbWl0AQUHX3N0YWtlcgkBEXdpdGhkcmF3bkluUGVyaW9kAQUHX3N0YWtlcgQUbmV3TGFzdFdpdGhkcmF3bkRhdGUIBQskdDA0OTY0NTIyOAJfMQQRd2l0aGRyYXdMaW1pdExlZnQIBQskdDA0OTY0NTIyOAJfMgkAlAoCBRRuZXdMYXN0V2l0aGRyYXduRGF0ZQURd2l0aGRyYXdMaW1pdExlZnQBDmNvbXB1dGVOZXdSYXRlARNfYW1vdW50T2ZRdW90ZUFzc2V0BAduZXdSYXRlAwkAZgIJAQt0b3RhbFN1cHBseQAAAAkBBGRpdmQCCQBkAgkBC2ZyZWVCYWxhbmNlAAUTX2Ftb3VudE9mUXVvdGVBc3NldAkBC3RvdGFsU3VwcGx5AAUMREVDSU1BTF9VTklUBQduZXdSYXRlARhsYXN0VGltZVJld2FyZEFwcGxpY2FibGUACQEEbWludgIJARNjdXJyZW50VGltZXN0YW1wU2VjAAkBDHBlcmlvZEZpbmlzaAABDnJld2FyZFBlclRva2VuAQ1fYmFsYW5jZURlbHRhAwkAAAIJAGQCCQELdG90YWxTdXBwbHkABQ1fYmFsYW5jZURlbHRhAAAJARRyZXdhcmRQZXJUb2tlblN0b3JlZAAEDHRpbWVJbnRlcnZhbAkAZQIJARhsYXN0VGltZVJld2FyZEFwcGxpY2FibGUACQEObGFzdFVwZGF0ZVRpbWUABBJhY3R1YWxUaW1lSW50ZXJ2YWwDCQBmAgAABQx0aW1lSW50ZXJ2YWwAAAUMdGltZUludGVydmFsBARkaWZmCQEEZGl2ZAIJAGgCCQEKcmV3YXJkUmF0ZQAFEmFjdHVhbFRpbWVJbnRlcnZhbAkAZAIJAQt0b3RhbFN1cHBseQAFDV9iYWxhbmNlRGVsdGEJAGQCCQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQABQRkaWZmAQZlYXJuZWQCB19zdGFrZXINX2JhbGFuY2VEZWx0YQQLcmV3YXJkRGVsdGEJAGUCCQEOcmV3YXJkUGVyVG9rZW4BBQ1fYmFsYW5jZURlbHRhCQEWdXNlclJld2FyZFBlclRva2VuUGFpZAEFB19zdGFrZXIJAGQCCQEEbXVsZAIJAGQCCQEJYmFsYW5jZU9mAQUHX3N0YWtlcgUNX2JhbGFuY2VEZWx0YQULcmV3YXJkRGVsdGEJAQdyZXdhcmRzAQUHX3N0YWtlcgEMdXBkYXRlUmV3YXJkAgdfc3Rha2VyDV9iYWxhbmNlRGVsdGEEF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEOcmV3YXJkUGVyVG9rZW4BBQ1fYmFsYW5jZURlbHRhBBFuZXdMYXN0VXBkYXRlVGltZQkBE2N1cnJlbnRUaW1lc3RhbXBTZWMABAskdDA2NDI0NjYxNgMJAQIhPQIFB19zdGFrZXICAAkAlAoCCQEGZWFybmVkAgUHX3N0YWtlcgUNX2JhbGFuY2VEZWx0YQUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAJQKAgAAAAAEDHN0YWtlckVhcm5lZAgFCyR0MDY0MjQ2NjE2Al8xBBhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQIBQskdDA2NDI0NjYxNgJfMgkAlgoEBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAURbmV3TGFzdFVwZGF0ZVRpbWUFDHN0YWtlckVhcm5lZAUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkARF1cGRhdGVVc2VyQmFsYW5jZQIFX3VzZXIHX2NoYW5nZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUJa19iYWxhbmNlBQVfdXNlcgkAZAIJAQliYWxhbmNlT2YBBQVfdXNlcgUHX2NoYW5nZQUDbmlsARRzZXRVc2VyV2l0aGRyYXdMaW1pdAIFX3VzZXIFX3JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfd2l0aGRyYXdfbGltaXQFBV91c2VyBQVfcmF0ZQUDbmlsARJzZXRVc2VyQXZlcmFnZVJhdGUCBV91c2VyBV9yYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ5rX2F2ZXJhZ2VfcmF0ZQUFX3VzZXIFBV9yYXRlBQNuaWwBEXVwZGF0ZUZyZWVCYWxhbmNlAQdfY2hhbmdlBAdiYWxhbmNlCQELZnJlZUJhbGFuY2UAAwkAZwIJAGQCBQdiYWxhbmNlBQdfY2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfZnJlZUJhbGFuY2UJAGQCBQdiYWxhbmNlBQdfY2hhbmdlBQNuaWwJAAIBCQCsAgIJAKwCAgkArAICAi1WYXVsdDogY2FuIG5vdCB1cGRhdGUgZnJlZSBiYWxhbmNlLiBCYWxhbmNlOiAJAKQDAQUHYmFsYW5jZQIJIGNoYW5nZTogCQCkAwEFB19jaGFuZ2UBE3VwZGF0ZUxvY2tlZEJhbGFuY2UBB19jaGFuZ2UEB2JhbGFuY2UJAQ1sb2NrZWRCYWxhbmNlAAMJAGcCCQBkAgUHYmFsYW5jZQUHX2NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rX2xvY2tlZEJhbGFuY2UJAGQCBQdiYWxhbmNlBQdfY2hhbmdlBQNuaWwJAAIBCQCsAgIJAKwCAgkArAICAi9WYXVsdDogY2FuIG5vdCB1cGRhdGUgbG9ja2VkIGJhbGFuY2UuIEJhbGFuY2U6IAkApAMBBQdiYWxhbmNlAgkgY2hhbmdlOiAJAKQDAQUHX2NoYW5nZQERdXBkYXRlVG90YWxTdXBwbHkBB19jaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfdG90YWxTdXBwbHkJAGQCCQELdG90YWxTdXBwbHkABQdfY2hhbmdlBQNuaWwBCnVwZGF0ZVJhdGUBBV9yYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrX3JhdGUFBV9yYXRlBQNuaWwBFXNldFVzZXJXaXRoZHJhd1BhcmFtcwMFX3VzZXIRX2xhc3RXaXRoZHJhd0RhdGUKX3dpdGhkcmF3bgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa19sYXN0X3dpdGhkcmF3X2RhdGUFBV91c2VyBRFfbGFzdFdpdGhkcmF3RGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa193aXRoZHJhd19pbl9wZXJpb2QFBV91c2VyBQpfd2l0aGRyYXduBQNuaWwBE3VwZGF0ZVJld2FyZEJhbGFuY2UBBl9kZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19yZXdhcmRCYWxhbmNlCQBkAgkBDXJld2FyZEJhbGFuY2UABQZfZGVsdGEFA25pbAEQdXBkYXRlUmV3YXJkUmF0ZQELX3Jld2FyZFJhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtfcmV3YXJkUmF0ZQULX3Jld2FyZFJhdGUFA25pbAEKdXBkYXRlVGltZQIPX2xhc3RVcGRhdGVUaW1lDV9wZXJpb2RGaW5pc2gJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbGFzdFVwZGF0ZVRpbWUFD19sYXN0VXBkYXRlVGltZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa19wZXJpb2RGaW5pc2gFDV9wZXJpb2RGaW5pc2gFA25pbAEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBFV9yZXdhcmRQZXJUb2tlblN0b3JlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa19yZXdhcmRQZXJUb2tlblN0b3JlZAUVX3Jld2FyZFBlclRva2VuU3RvcmVkBQNuaWwBEXVwZGF0ZVVzZXJSZXdhcmRzAwdfc3Rha2VyB19yZXdhcmQTX3VzZXJSZXdhcmRQZXJUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUMa191c2VyUmV3YXJkBQdfc3Rha2VyBQdfcmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRRrX3VzZXJSZXdhcmRQZXJUb2tlbgUHX3N0YWtlcgUTX3VzZXJSZXdhcmRQZXJUb2tlbgUDbmlsDQFpAQppbml0aWFsaXplAQxfY29vcmRpbmF0b3IDAwkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFVuYWJsZSB0byBpbml0aWFsaXplCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQxfY29vcmRpbmF0b3ICG0ludmFsaWQgY29vcmRpbmF0b3IgYWRkcmVzcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpAQVzdGFrZQAEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyBAdfYW1vdW50CQEOdXNkblRvRGVjaW1hbHMBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEKcXVvdGVBc3NldAAGCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAhVJbnZhbGlkIGNhbGwgdG8gc3Rha2UEDCR0MDk4NjkxMDA5OAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQwkdDA5ODY5MTAwOTgCXzEEEW5ld0xhc3RVcGRhdGVUaW1lCAUMJHQwOTg2OTEwMDk4Al8yBAxzdGFrZXJFYXJuZWQIBQwkdDA5ODY5MTAwOTgCXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFDCR0MDk4NjkxMDA5OAJfNAQLY3VycmVudFJhdGUJAQRyYXRlAAQPcHJldkF2ZXJhZ2VSYXRlCQELYXZlcmFnZVJhdGUBBQdfc3Rha2VyBAd2QW1vdW50CQEEZGl2ZAIFB19hbW91bnQFC2N1cnJlbnRSYXRlBA5uZXdBdmVyYWdlUmF0ZQkBBGRpdmQCCQBkAgkBBG11bGQCBQd2QW1vdW50BQtjdXJyZW50UmF0ZQkBBG11bGQCCQEJYmFsYW5jZU9mAQUHX3N0YWtlcgUPcHJldkF2ZXJhZ2VSYXRlCQBkAgUHdkFtb3VudAkBCWJhbGFuY2VPZgEFB19zdGFrZXIED25ld1RvdGFsQmFsYW5jZQkAZAIFB3ZBbW91bnQJAQliYWxhbmNlT2YBBQdfc3Rha2VyBBBuZXdXaXRoZHJhd0xpbWl0CQEEbXVsZAIFD25ld1RvdGFsQmFsYW5jZQUTV0lUSERSQVdfUEVSX1BFUklPRAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJARB1c2RuRnJvbURlY2ltYWxzAQUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQERdXBkYXRlVXNlclJld2FyZHMDBQdfc3Rha2VyBQxzdGFrZXJFYXJuZWQFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAQUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQp1cGRhdGVUaW1lAgURbmV3TGFzdFVwZGF0ZVRpbWUJAQxwZXJpb2RGaW5pc2gACQERdXBkYXRlRnJlZUJhbGFuY2UBBQdfYW1vdW50CQERdXBkYXRlVXNlckJhbGFuY2UCBQdfc3Rha2VyBQd2QW1vdW50CQESc2V0VXNlckF2ZXJhZ2VSYXRlAgUHX3N0YWtlcgUObmV3QXZlcmFnZVJhdGUJARRzZXRVc2VyV2l0aGRyYXdMaW1pdAIFB19zdGFrZXIFEG5ld1dpdGhkcmF3TGltaXQJARF1cGRhdGVUb3RhbFN1cHBseQEFB3ZBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5TdGFrZQEHX2Ftb3VudAQHX3N0YWtlcgkApQgBCAUBaQZjYWxsZXIEEmFtb3VudE9mUXVvdGVBc3NldAkBDnVzZG5Ub0RlY2ltYWxzAQUHX2Ftb3VudAMDAwkBAiE9AggFAWkIcGF5bWVudHMFA25pbAYJAGcCAAAFEmFtb3VudE9mUXVvdGVBc3NldAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECF0ludmFsaWQgY2FsbCB0byB1blN0YWtlBA0kdDAxMTQ1MTExNjY3CQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFDSR0MDExNDUxMTE2NjcCXzEEEW5ld0xhc3RVcGRhdGVUaW1lCAUNJHQwMTE0NTExMTY2NwJfMgQMc3Rha2VyRWFybmVkCAUNJHQwMTE0NTExMTY2NwJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUNJHQwMTE0NTExMTY2NwJfNAQNJHQwMTE2NzQxMTgxNQkBFGdldFdpdGhkcmF3TGltaXRMZWZ0AQUHX3N0YWtlcgQUbmV3TGFzdFdpdGhkcmF3bkRhdGUIBQ0kdDAxMTY3NDExODE1Al8xBBF3aXRoZHJhd0xpbWl0TGVmdAgFDSR0MDExNjc0MTE4MTUCXzIEB3ZBbW91bnQJAQRkaXZkAgUSYW1vdW50T2ZRdW90ZUFzc2V0CQEEcmF0ZQADCQBmAgUHdkFtb3VudAURd2l0aGRyYXdMaW1pdExlZnQJAAIBAixJbnZhbGlkIGNhbGwgdG8gdW5TdGFrZTogd2l0aGRyYXcgb3ZlciBsaW1pdAQUbmV3V2l0aGRyYXduSW5QZXJpb2QJAGQCCQERd2l0aGRyYXduSW5QZXJpb2QBBQdfc3Rha2VyBQd2QW1vdW50AwkAZgIFEmFtb3VudE9mUXVvdGVBc3NldAkBC2ZyZWVCYWxhbmNlAAkAAgECKEludmFsaWQgY2FsbCB0byB1blN0YWtlOiBiYWxhbmNlIHRvbyBsb3cEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgkBEHVzZG5Gcm9tRGVjaW1hbHMBBRJhbW91bnRPZlF1b3RlQXNzZXQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgUMc3Rha2VyRWFybmVkBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBEXVwZGF0ZUZyZWVCYWxhbmNlAQkBAS0BBRJhbW91bnRPZlF1b3RlQXNzZXQJARF1cGRhdGVVc2VyQmFsYW5jZQIFB19zdGFrZXIJAQEtAQUHdkFtb3VudAkBEXVwZGF0ZVRvdGFsU3VwcGx5AQkBAS0BBQd2QW1vdW50CQEVc2V0VXNlcldpdGhkcmF3UGFyYW1zAwUHX3N0YWtlcgUUbmV3TGFzdFdpdGhkcmF3bkRhdGUFFG5ld1dpdGhkcmF3bkluUGVyaW9kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkBEHVzZG5Gcm9tRGVjaW1hbHMBBRJhbW91bnRPZlF1b3RlQXNzZXQJAQpxdW90ZUFzc2V0AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3dpdGhkcmF3UmV3YXJkcwAEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyBA0kdDAxMzE1MzEzMjk4CQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFDSR0MDEzMTUzMTMyOTgCXzEEEW5ld0xhc3RVcGRhdGVUaW1lCAUNJHQwMTMxNTMxMzI5OAJfMgQMc3Rha2VyRWFybmVkCAUNJHQwMTMxNTMxMzI5OAJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUNJHQwMTMxNTMxMzI5OAJfNAMDCQBnAgAABQxzdGFrZXJFYXJuZWQGCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAhBObyByZXdhcmQ6IFZhdWx0CQDOCAIJAM4IAgkAzggCCQDOCAIJARF1cGRhdGVVc2VyUmV3YXJkcwMFB19zdGFrZXIAAAUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBCnVwZGF0ZVRpbWUCBRFuZXdMYXN0VXBkYXRlVGltZQkBDHBlcmlvZEZpbmlzaAAJARN1cGRhdGVSZXdhcmRCYWxhbmNlAQkBAS0BBQxzdGFrZXJFYXJuZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQxzdGFrZXJFYXJuZWQJAQ9nb3Zlcm5hbmNlQXNzZXQABQNuaWwBaQEHYWRkRnJlZQAEB19hbW91bnQJAQ51c2RuVG9EZWNpbWFscwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEKcXVvdGVBc3NldAAGCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEDCQELaXNXaGl0ZWxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAAACCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIWSW52YWxpZCBhZGRGcmVlIHBhcmFtcwQHbmV3UmF0ZQkBDmNvbXB1dGVOZXdSYXRlAQUHX2Ftb3VudAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJARB1c2RuRnJvbURlY2ltYWxzAQUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAzggCCQERdXBkYXRlRnJlZUJhbGFuY2UBBQdfYW1vdW50CQEKdXBkYXRlUmF0ZQEFB25ld1JhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYWRkTG9ja2VkAAQHX2Ftb3VudAkBDnVzZG5Ub0RlY2ltYWxzAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQMJAQtpc1doaXRlbGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkAAAIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhhJbnZhbGlkIGFkZExvY2tlZCBwYXJhbXMEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJARB1c2RuRnJvbURlY2ltYWxzAQUHX2Ftb3VudAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJARN1cGRhdGVMb2NrZWRCYWxhbmNlAQUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVleGNoYW5nZUZyZWVBbmRMb2NrZWQBB19hbW91bnQDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQELaXNXaGl0ZWxpc3QBCQClCAEIBQFpBmNhbGxlcgkAAgECJEludmFsaWQgZXhjaGFuZ2VGcmVlQW5kTG9ja2VkIHBhcmFtcwQSYW1vdW50T2ZRdW90ZUFzc2V0CQEOdXNkblRvRGVjaW1hbHMBBQdfYW1vdW50BAduZXdSYXRlCQEOY29tcHV0ZU5ld1JhdGUBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkAzggCCQDOCAIJARN1cGRhdGVMb2NrZWRCYWxhbmNlAQUSYW1vdW50T2ZRdW90ZUFzc2V0CQERdXBkYXRlRnJlZUJhbGFuY2UBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkBCnVwZGF0ZVJhdGUBBQduZXdSYXRlAWkBDndpdGhkcmF3TG9ja2VkAQdfYW1vdW50AwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQBnAgAABQdfYW1vdW50BgkBASEBCQELaXNXaGl0ZWxpc3QBCQClCAEIBQFpBmNhbGxlcgkAAgECHUludmFsaWQgd2l0aGRyYXdMb2NrZWQgcGFyYW1zBBJhbW91bnRPZlF1b3RlQXNzZXQJAQ51c2RuVG9EZWNpbWFscwEFB19hbW91bnQEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgkBEHVzZG5Gcm9tRGVjaW1hbHMBBRJhbW91bnRPZlF1b3RlQXNzZXQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAM4IAgkBE3VwZGF0ZUxvY2tlZEJhbGFuY2UBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJARB1c2RuRnJvbURlY2ltYWxzAQUSYW1vdW50T2ZRdW90ZUFzc2V0CQEKcXVvdGVBc3NldAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQphZGRSZXdhcmRzAAMDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEPZ292ZXJuYW5jZUFzc2V0AAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECGUludmFsaWQgYWRkUmV3YXJkcyBwYXJhbXMEB19yZXdhcmQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgJAQx1cGRhdGVSZXdhcmQCBQpOT19BRERSRVNTBQlOT19TVEFLRVICXzEECXRpbWVzdGFtcAkBE2N1cnJlbnRUaW1lc3RhbXBTZWMABA1uZXdSZXdhcmRSYXRlAwkAZgIFCXRpbWVzdGFtcAkBDHBlcmlvZEZpbmlzaAAJAGkCBQdfcmV3YXJkBQhEVVJBVElPTgQNcmVtYWluaW5nVGltZQkAZQIJAQxwZXJpb2RGaW5pc2gABQl0aW1lc3RhbXAECGxlZnRvdmVyCQBoAgkBCnJld2FyZFJhdGUABQ1yZW1haW5pbmdUaW1lCQBpAgkAZAIFB19yZXdhcmQFCGxlZnRvdmVyBQhEVVJBVElPTgkAzggCCQDOCAIJAM4IAgkBEHVwZGF0ZVJld2FyZFJhdGUBBQ1uZXdSZXdhcmRSYXRlCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBE3VwZGF0ZVJld2FyZEJhbGFuY2UBBQdfcmV3YXJkCQEKdXBkYXRlVGltZQIFCXRpbWVzdGFtcAkAZAIFCXRpbWVzdGFtcAUIRFVSQVRJT04BaQEKYWNrUmV3YXJkcwAECnByb2ZpdFJlc3AJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAILY2xhaW1Qcm9maXQJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAFA25pbAUDbmlsAwkAAAIFCnByb2ZpdFJlc3AFCnByb2ZpdFJlc3AEBnByb2ZpdAQHJG1hdGNoMAUKcHJvZml0UmVzcAMJAAECBQckbWF0Y2gwAgNJbnQEAXAFByRtYXRjaDAJAQ51c2RuVG9EZWNpbWFscwEFAXAJAAIBAhxJbnZhbGlkIGNsYWltUHJvZml0IHJlc3BvbnNlBAZyZXN1bHQDCQBmAgUGcHJvZml0AAAEB25ld1JhdGUJAQ5jb21wdXRlTmV3UmF0ZQEFBnByb2ZpdAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJARB1c2RuRnJvbURlY2ltYWxzAQUGcHJvZml0BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQDOCAIJARF1cGRhdGVGcmVlQmFsYW5jZQEFBnByb2ZpdAkBCnVwZGF0ZVJhdGUBBQduZXdSYXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2aWV3X3Jld2FyZAEHX3N0YWtlcgQHYmFsYW5jZQkBCWJhbGFuY2VPZgEFB19zdGFrZXIED2RlcG9zaXRlZEFtb3VudAkBBG11bGQCCQELYXZlcmFnZVJhdGUBBQdfc3Rha2VyBQdiYWxhbmNlBA1jdXJyZW50QW1vdW50CQEEbXVsZAIJAQRyYXRlAAUHYmFsYW5jZQQLZWFybmVkUXVvdGUJAGUCBQ1jdXJyZW50QW1vdW50BQ9kZXBvc2l0ZWRBbW91bnQJAAIBCQCkAwEFC2Vhcm5lZFF1b3RlAWkBEnZpZXdfc3Rha2luZ1Jld2FyZAEHX3N0YWtlcgQMc3Rha2VyRWFybmVkCAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAJfMwkAAgEJAKQDAQkBEHVzZG5Gcm9tRGVjaW1hbHMBBQxzdGFrZXJFYXJuZWQBaQESdmlld193aXRoZHJhd0xpbWl0AQdfc3Rha2VyBBF3aXRoZHJhd0xpbWl0TGVmdAgJARRnZXRXaXRoZHJhd0xpbWl0TGVmdAEFB19zdGFrZXICXzIEC2xpbWl0SW5Vc2RuCQEQdXNkbkZyb21EZWNpbWFscwEJAQRtdWxkAgURd2l0aGRyYXdMaW1pdExlZnQJAQRyYXRlAAkAAgEJAKQDAQULbGltaXRJblVzZG4BAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V500Az4A==", "height": 2434846, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bh8RgxmQUbRHiuegHa8RsXfW5ks4By6MtphUCMkrEokV Next: FZPZdns2cWgvkQjdyteNN77MTtKLjxnJosJeijrK53zZ Diff:
OldNewDifferences
4343
4444 let k_quote_asset = "k_quote_asset"
4545
46-let k_admin_public_key = "k_admin_public_key"
47-
4846 let k_admin_address = "k_admin_address"
4947
5048 let k_manager_address = "k_manager_address"
5856
5957
6058 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
61-
62-
63-func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
6459
6560
6661 func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
178173 func getWithdrawLimitLeft (_staker) = {
179174 let currentDate = currentTimestamp()
180175 let lastWithdrawDate = lastWithdrawnDate(_staker)
181- let $t051085372 = if (((currentDate - lastWithdrawDate) > WITHDRAW_PERIOD))
176+ let $t049645228 = if (((currentDate - lastWithdrawDate) > WITHDRAW_PERIOD))
182177 then $Tuple2(currentDate, withdrawLimit(_staker))
183178 else $Tuple2(lastWithdrawDate, (withdrawLimit(_staker) - withdrawnInPeriod(_staker)))
184- let newLastWithdrawnDate = $t051085372._1
185- let withdrawLimitLeft = $t051085372._2
179+ let newLastWithdrawnDate = $t049645228._1
180+ let withdrawLimitLeft = $t049645228._2
186181 $Tuple2(newLastWithdrawnDate, withdrawLimitLeft)
187182 }
188183
219214 func updateReward (_staker,_balanceDelta) = {
220215 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
221216 let newLastUpdateTime = currentTimestampSec()
222- let $t065686760 = if ((_staker != ""))
217+ let $t064246616 = if ((_staker != ""))
223218 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
224219 else $Tuple2(0, 0)
225- let stakerEarned = $t065686760._1
226- let stakerRewardPerTokenPaid = $t065686760._2
220+ let stakerEarned = $t064246616._1
221+ let stakerRewardPerTokenPaid = $t064246616._2
227222 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
228223 }
229224
237232 func setUserAverageRate (_user,_rate) = [IntegerEntry(toCompositeKey(k_average_rate, _user), _rate)]
238233
239234
240-func updateFreeBalance (_change) = [IntegerEntry(k_freeBalance, (freeBalance() + _change))]
235+func updateFreeBalance (_change) = {
236+ let balance = freeBalance()
237+ if (((balance + _change) >= 0))
238+ then [IntegerEntry(k_freeBalance, (balance + _change))]
239+ else throw(((("Vault: can not update free balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
240+ }
241241
242242
243243 func updateLockedBalance (_change) = {
245245 if (((balance + _change) >= 0))
246246 then [IntegerEntry(k_lockedBalance, (balance + _change))]
247247 else throw(((("Vault: can not update locked balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
248- }
249-
250-
251-func updateLockedBalanceUnchecked (_change) = {
252- let balance = lockedBalance()
253- if (((balance + _change) >= 0))
254- then [IntegerEntry(k_lockedBalance, (balance + _change))]
255- else [IntegerEntry(k_lockedBalance, 0)]
256248 }
257249
258250
281273
282274
283275 @Callable(i)
284-func initialize (_coordinator) = if (initialized())
285- then throw("Already initialized")
286- else [StringEntry(k_coordinatorAddress, _coordinator), BooleanEntry(k_initialized, true)]
276+func initialize (_coordinator) = if (if (initialized())
277+ then true
278+ else (i.caller != this))
279+ then throw("Unable to initialize")
280+ else [StringEntry(k_coordinatorAddress, toString(valueOrErrorMessage(addressFromString(_coordinator), "Invalid coordinator address"))), BooleanEntry(k_initialized, true)]
287281
288282
289283
291285 func stake () = {
292286 let _staker = toString(i.caller)
293287 let _amount = usdnToDecimals(i.payments[0].amount)
294- if (if ((i.payments[0].assetId != quoteAsset()))
288+ if (if (if ((i.payments[0].assetId != quoteAsset()))
289+ then true
290+ else (size(i.payments) != 1))
295291 then true
296292 else !(initialized()))
297293 then throw("Invalid call to stake")
298294 else {
299- let $t0994610175 = updateReward(_staker, 0)
300- let newRewardPerTokenStored = $t0994610175._1
301- let newLastUpdateTime = $t0994610175._2
302- let stakerEarned = $t0994610175._3
303- let stakerRewardPerTokenPaid = $t0994610175._4
295+ let $t0986910098 = updateReward(_staker, 0)
296+ let newRewardPerTokenStored = $t0986910098._1
297+ let newLastUpdateTime = $t0986910098._2
298+ let stakerEarned = $t0986910098._3
299+ let stakerRewardPerTokenPaid = $t0986910098._4
304300 let currentRate = rate()
305301 let prevAverageRate = averageRate(_staker)
306302 let vAmount = divd(_amount, currentRate)
320316 func unStake (_amount) = {
321317 let _staker = toString(i.caller)
322318 let amountOfQuoteAsset = usdnToDecimals(_amount)
323- if (if ((i.payments != nil))
319+ if (if (if ((i.payments != nil))
320+ then true
321+ else (0 >= amountOfQuoteAsset))
324322 then true
325323 else !(initialized()))
326324 then throw("Invalid call to unStake")
327325 else {
328- let $t01149511711 = updateReward(_staker, 0)
329- let newRewardPerTokenStored = $t01149511711._1
330- let newLastUpdateTime = $t01149511711._2
331- let stakerEarned = $t01149511711._3
332- let stakerRewardPerTokenPaid = $t01149511711._4
333- let $t01171811859 = getWithdrawLimitLeft(_staker)
334- let newLastWithdrawnDate = $t01171811859._1
335- let withdrawLimitLeft = $t01171811859._2
326+ let $t01145111667 = updateReward(_staker, 0)
327+ let newRewardPerTokenStored = $t01145111667._1
328+ let newLastUpdateTime = $t01145111667._2
329+ let stakerEarned = $t01145111667._3
330+ let stakerRewardPerTokenPaid = $t01145111667._4
331+ let $t01167411815 = getWithdrawLimitLeft(_staker)
332+ let newLastWithdrawnDate = $t01167411815._1
333+ let withdrawLimitLeft = $t01167411815._2
336334 let vAmount = divd(amountOfQuoteAsset, rate())
337335 if ((vAmount > withdrawLimitLeft))
338336 then throw("Invalid call to unStake: withdraw over limit")
355353 @Callable(i)
356354 func withdrawRewards () = {
357355 let _staker = toString(i.caller)
358- let $t01319713342 = updateReward(_staker, 0)
359- let newRewardPerTokenStored = $t01319713342._1
360- let newLastUpdateTime = $t01319713342._2
361- let stakerEarned = $t01319713342._3
362- let stakerRewardPerTokenPaid = $t01319713342._4
356+ let $t01315313298 = updateReward(_staker, 0)
357+ let newRewardPerTokenStored = $t01315313298._1
358+ let newLastUpdateTime = $t01315313298._2
359+ let stakerEarned = $t01315313298._3
360+ let stakerRewardPerTokenPaid = $t01315313298._4
363361 if (if ((0 >= stakerEarned))
364362 then true
365363 else !(initialized()))
372370 @Callable(i)
373371 func addFree () = {
374372 let _amount = usdnToDecimals(i.payments[0].amount)
375- if (if (if ((i.payments[0].assetId != quoteAsset()))
373+ if (if (if (if ((i.payments[0].assetId != quoteAsset()))
374+ then true
375+ else (size(i.payments) != 1))
376376 then true
377377 else !(initialized()))
378378 then true
381381 else (i.caller == adminAddress())))
382382 then throw("Invalid addFree params")
383383 else {
384- let newRate = if ((totalSupply() > 0))
385- then divd((freeBalance() + _amount), totalSupply())
386- else DECIMAL_UNIT
387- let unstake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
388- if ((unstake == unstake))
384+ let newRate = computeNewRate(_amount)
385+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
386+ if ((stake == stake))
389387 then (updateFreeBalance(_amount) ++ updateRate(newRate))
390388 else throw("Strict value is not equal to itself.")
391389 }
396394 @Callable(i)
397395 func addLocked () = {
398396 let _amount = usdnToDecimals(i.payments[0].amount)
399- if (if (if ((i.payments[0].assetId != quoteAsset()))
397+ if (if (if (if ((i.payments[0].assetId != quoteAsset()))
398+ then true
399+ else (size(i.payments) != 1))
400400 then true
401401 else !(initialized()))
402402 then true
417417 @Callable(i)
418418 func exchangeFreeAndLocked (_amount) = if (if (!(initialized()))
419419 then true
420- else !(if (isWhitelist(toString(i.caller)))
421- then true
422- else (i.caller == adminAddress())))
420+ else !(isWhitelist(toString(i.caller))))
423421 then throw("Invalid exchangeFreeAndLocked params")
424422 else {
425423 let amountOfQuoteAsset = usdnToDecimals(_amount)
426- let freeUpdate = -(amountOfQuoteAsset)
427- let newRate = computeNewRate(freeUpdate)
428- ((updateLockedBalanceUnchecked(amountOfQuoteAsset) ++ updateFreeBalance(freeUpdate)) ++ updateRate(newRate))
424+ let newRate = computeNewRate(-(amountOfQuoteAsset))
425+ ((updateLockedBalance(amountOfQuoteAsset) ++ updateFreeBalance(-(amountOfQuoteAsset))) ++ updateRate(newRate))
429426 }
430427
431428
441438 let amountOfQuoteAsset = usdnToDecimals(_amount)
442439 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), usdnFromDecimals(amountOfQuoteAsset)], nil)
443440 if ((unstake == unstake))
444- then {
445- let lockBalanceNow = lockedBalance()
446- let $t01624316436 = if ((amountOfQuoteAsset > lockBalanceNow))
447- then $Tuple2(lockBalanceNow, (amountOfQuoteAsset - lockBalanceNow))
448- else $Tuple2(amountOfQuoteAsset, 0)
449- let fromLocked = $t01624316436._1
450- let fromFree = $t01624316436._2
451- (((if ((fromFree > 0))
452- then {
453- let newRate = computeNewRate(-(fromFree))
454- (updateFreeBalance(-(fromFree)) ++ updateRate(newRate))
455- }
456- else nil) ++ updateLockedBalance(-(fromLocked))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(amountOfQuoteAsset), quoteAsset())])
457- }
441+ then (updateLockedBalance(-(amountOfQuoteAsset)) ++ [ScriptTransfer(i.caller, usdnFromDecimals(amountOfQuoteAsset), quoteAsset())])
458442 else throw("Strict value is not equal to itself.")
459443 }
460444
461445
462446
463447 @Callable(i)
464-func addRewards () = if (if ((i.payments[0].assetId != governanceAsset()))
448+func addRewards () = if (if (if ((i.payments[0].assetId != governanceAsset()))
449+ then true
450+ else (size(i.payments) != 1))
465451 then true
466452 else !(initialized()))
467453 then throw("Invalid addRewards params")
478464 }
479465 (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
480466 }
467+
468+
469+
470+@Callable(i)
471+func ackRewards () = {
472+ let profitResp = invoke(managerAddress(), "claimProfit", [toBase58String(quoteAsset())], nil)
473+ if ((profitResp == profitResp))
474+ then {
475+ let profit = match profitResp {
476+ case p: Int =>
477+ usdnToDecimals(p)
478+ case _ =>
479+ throw("Invalid claimProfit response")
480+ }
481+ let result = if ((profit > 0))
482+ then {
483+ let newRate = computeNewRate(profit)
484+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(profit))])
485+ if ((stake == stake))
486+ then (updateFreeBalance(profit) ++ updateRate(newRate))
487+ else throw("Strict value is not equal to itself.")
488+ }
489+ else nil
490+ if ((result == result))
491+ then result
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
481496
482497
483498
509524
510525
511526 @Verifier(tx)
512-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
527+func verify () = {
528+ let coordinatorStr = getString(this, k_coordinatorAddress)
529+ if (isDefined(coordinatorStr))
530+ then {
531+ let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
532+ if (isDefined(admin))
533+ then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
534+ else throw("unable to verify: admin not set in coordinator")
535+ }
536+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
537+ }
513538
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_totalSupply = "k_totalSupply"
55
66 let k_rewardBalance = "k_rewardBalance"
77
88 let k_lockedBalance = "k_lockedBalance"
99
1010 let k_freeBalance = "k_freeBalance"
1111
1212 let k_rate = "k_rate"
1313
1414 let k_lastUpdateTime = "k_lastUpdateTime"
1515
1616 let k_rewardPerTokenStored = "k_rewardPerTokenStored"
1717
1818 let k_rewardRate = "k_rewardRate"
1919
2020 let k_periodFinish = "k_periodFinish"
2121
2222 let k_userRewardPerToken = "k_userRewardPerToken"
2323
2424 let k_userReward = "k_userReward"
2525
2626 let k_balance = "k_balance"
2727
2828 let k_average_rate = "k_average_rate"
2929
3030 let k_withdraw_limit = "k_withdraw_limit"
3131
3232 let k_last_withdraw_date = "k_last_withdraw_date"
3333
3434 let k_withdraw_in_period = "k_withdraw_in_period"
3535
3636 let k_initialized = "k_initialized"
3737
3838 let k_coordinatorAddress = "k_coordinatorAddress"
3939
4040 let k_amm = "k_amm"
4141
4242 let k_governance_asset = "k_gov_asset"
4343
4444 let k_quote_asset = "k_quote_asset"
4545
46-let k_admin_public_key = "k_admin_public_key"
47-
4846 let k_admin_address = "k_admin_address"
4947
5048 let k_manager_address = "k_manager_address"
5149
5250 let k_collateral_address = "k_collateral_address"
5351
5452 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
5553
5654
5755 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
5856
5957
6058 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
61-
62-
63-func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
6459
6560
6661 func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
6762
6863
6964 func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
7065
7166
7267 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
7368
7469
7570 func managerAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_manager_address)), "Manager not set")
7671
7772
7873 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
7974
8075 let DURATION = (((7 * 60) * 60) * 24)
8176
8277 let NO_ADDRESS = ""
8378
8479 let NO_STAKER = 0
8580
8681 func usdnFromDecimals (_amount) = (_amount / 100)
8782
8883
8984 func usdnToDecimals (_amount) = (_amount * 100)
9085
9186
9287 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
9388
9489
9590 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
9691
9792
9893 func abs (_x) = if ((_x > 0))
9994 then _x
10095 else -(_x)
10196
10297
10398 func minv (_x,_y) = if ((_x > _y))
10499 then _y
105100 else _x
106101
107102
108103 let WITHDRAW_PERIOD = (86400 * 1000)
109104
110105 let WITHDRAW_PER_PERIOD = divd((1 * DECIMAL_UNIT), (4 * DECIMAL_UNIT))
111106
112107 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
113108
114109
115110 func int0 (k) = valueOrElse(getInteger(this, k), 0)
116111
117112
118113 func int1 (k) = valueOrElse(getInteger(this, k), DECIMAL_UNIT)
119114
120115
121116 func totalSupply () = int0(k_totalSupply)
122117
123118
124119 func rate () = int1(k_rate)
125120
126121
127122 func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
128123
129124
130125 func averageRate (_staker) = int0(toCompositeKey(k_average_rate, _staker))
131126
132127
133128 func withdrawLimit (_staker) = int0(toCompositeKey(k_withdraw_limit, _staker))
134129
135130
136131 func withdrawnInPeriod (_staker) = int0(toCompositeKey(k_withdraw_in_period, _staker))
137132
138133
139134 func lastWithdrawnDate (_staker) = int0(toCompositeKey(k_last_withdraw_date, _staker))
140135
141136
142137 func freeBalance () = int0(k_freeBalance)
143138
144139
145140 func lockedBalance () = int0(k_lockedBalance)
146141
147142
148143 func rewardPerTokenStored () = int0(k_rewardPerTokenStored)
149144
150145
151146 func lastUpdateTime () = int0(k_lastUpdateTime)
152147
153148
154149 func rewardRate () = int0(k_rewardRate)
155150
156151
157152 func periodFinish () = int0(k_periodFinish)
158153
159154
160155 func rewardBalance () = int0(k_rewardBalance)
161156
162157
163158 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
164159
165160
166161 func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
167162
168163
169164 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
170165
171166
172167 func currentTimestamp () = lastBlock.timestamp
173168
174169
175170 func currentTimestampSec () = (currentTimestamp() / 1000)
176171
177172
178173 func getWithdrawLimitLeft (_staker) = {
179174 let currentDate = currentTimestamp()
180175 let lastWithdrawDate = lastWithdrawnDate(_staker)
181- let $t051085372 = if (((currentDate - lastWithdrawDate) > WITHDRAW_PERIOD))
176+ let $t049645228 = if (((currentDate - lastWithdrawDate) > WITHDRAW_PERIOD))
182177 then $Tuple2(currentDate, withdrawLimit(_staker))
183178 else $Tuple2(lastWithdrawDate, (withdrawLimit(_staker) - withdrawnInPeriod(_staker)))
184- let newLastWithdrawnDate = $t051085372._1
185- let withdrawLimitLeft = $t051085372._2
179+ let newLastWithdrawnDate = $t049645228._1
180+ let withdrawLimitLeft = $t049645228._2
186181 $Tuple2(newLastWithdrawnDate, withdrawLimitLeft)
187182 }
188183
189184
190185 func computeNewRate (_amountOfQuoteAsset) = {
191186 let newRate = if ((totalSupply() > 0))
192187 then divd((freeBalance() + _amountOfQuoteAsset), totalSupply())
193188 else DECIMAL_UNIT
194189 newRate
195190 }
196191
197192
198193 func lastTimeRewardApplicable () = minv(currentTimestampSec(), periodFinish())
199194
200195
201196 func rewardPerToken (_balanceDelta) = if (((totalSupply() + _balanceDelta) == 0))
202197 then rewardPerTokenStored()
203198 else {
204199 let timeInterval = (lastTimeRewardApplicable() - lastUpdateTime())
205200 let actualTimeInterval = if ((0 > timeInterval))
206201 then 0
207202 else timeInterval
208203 let diff = divd((rewardRate() * actualTimeInterval), (totalSupply() + _balanceDelta))
209204 (rewardPerTokenStored() + diff)
210205 }
211206
212207
213208 func earned (_staker,_balanceDelta) = {
214209 let rewardDelta = (rewardPerToken(_balanceDelta) - userRewardPerTokenPaid(_staker))
215210 (muld((balanceOf(_staker) + _balanceDelta), rewardDelta) + rewards(_staker))
216211 }
217212
218213
219214 func updateReward (_staker,_balanceDelta) = {
220215 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
221216 let newLastUpdateTime = currentTimestampSec()
222- let $t065686760 = if ((_staker != ""))
217+ let $t064246616 = if ((_staker != ""))
223218 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
224219 else $Tuple2(0, 0)
225- let stakerEarned = $t065686760._1
226- let stakerRewardPerTokenPaid = $t065686760._2
220+ let stakerEarned = $t064246616._1
221+ let stakerRewardPerTokenPaid = $t064246616._2
227222 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
228223 }
229224
230225
231226 func updateUserBalance (_user,_change) = [IntegerEntry(toCompositeKey(k_balance, _user), (balanceOf(_user) + _change))]
232227
233228
234229 func setUserWithdrawLimit (_user,_rate) = [IntegerEntry(toCompositeKey(k_withdraw_limit, _user), _rate)]
235230
236231
237232 func setUserAverageRate (_user,_rate) = [IntegerEntry(toCompositeKey(k_average_rate, _user), _rate)]
238233
239234
240-func updateFreeBalance (_change) = [IntegerEntry(k_freeBalance, (freeBalance() + _change))]
235+func updateFreeBalance (_change) = {
236+ let balance = freeBalance()
237+ if (((balance + _change) >= 0))
238+ then [IntegerEntry(k_freeBalance, (balance + _change))]
239+ else throw(((("Vault: can not update free balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
240+ }
241241
242242
243243 func updateLockedBalance (_change) = {
244244 let balance = lockedBalance()
245245 if (((balance + _change) >= 0))
246246 then [IntegerEntry(k_lockedBalance, (balance + _change))]
247247 else throw(((("Vault: can not update locked balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
248- }
249-
250-
251-func updateLockedBalanceUnchecked (_change) = {
252- let balance = lockedBalance()
253- if (((balance + _change) >= 0))
254- then [IntegerEntry(k_lockedBalance, (balance + _change))]
255- else [IntegerEntry(k_lockedBalance, 0)]
256248 }
257249
258250
259251 func updateTotalSupply (_change) = [IntegerEntry(k_totalSupply, (totalSupply() + _change))]
260252
261253
262254 func updateRate (_rate) = [IntegerEntry(k_rate, _rate)]
263255
264256
265257 func setUserWithdrawParams (_user,_lastWithdrawDate,_withdrawn) = [IntegerEntry(toCompositeKey(k_last_withdraw_date, _user), _lastWithdrawDate), IntegerEntry(toCompositeKey(k_withdraw_in_period, _user), _withdrawn)]
266258
267259
268260 func updateRewardBalance (_delta) = [IntegerEntry(k_rewardBalance, (rewardBalance() + _delta))]
269261
270262
271263 func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
272264
273265
274266 func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
275267
276268
277269 func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
278270
279271
280272 func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
281273
282274
283275 @Callable(i)
284-func initialize (_coordinator) = if (initialized())
285- then throw("Already initialized")
286- else [StringEntry(k_coordinatorAddress, _coordinator), BooleanEntry(k_initialized, true)]
276+func initialize (_coordinator) = if (if (initialized())
277+ then true
278+ else (i.caller != this))
279+ then throw("Unable to initialize")
280+ else [StringEntry(k_coordinatorAddress, toString(valueOrErrorMessage(addressFromString(_coordinator), "Invalid coordinator address"))), BooleanEntry(k_initialized, true)]
287281
288282
289283
290284 @Callable(i)
291285 func stake () = {
292286 let _staker = toString(i.caller)
293287 let _amount = usdnToDecimals(i.payments[0].amount)
294- if (if ((i.payments[0].assetId != quoteAsset()))
288+ if (if (if ((i.payments[0].assetId != quoteAsset()))
289+ then true
290+ else (size(i.payments) != 1))
295291 then true
296292 else !(initialized()))
297293 then throw("Invalid call to stake")
298294 else {
299- let $t0994610175 = updateReward(_staker, 0)
300- let newRewardPerTokenStored = $t0994610175._1
301- let newLastUpdateTime = $t0994610175._2
302- let stakerEarned = $t0994610175._3
303- let stakerRewardPerTokenPaid = $t0994610175._4
295+ let $t0986910098 = updateReward(_staker, 0)
296+ let newRewardPerTokenStored = $t0986910098._1
297+ let newLastUpdateTime = $t0986910098._2
298+ let stakerEarned = $t0986910098._3
299+ let stakerRewardPerTokenPaid = $t0986910098._4
304300 let currentRate = rate()
305301 let prevAverageRate = averageRate(_staker)
306302 let vAmount = divd(_amount, currentRate)
307303 let newAverageRate = divd((muld(vAmount, currentRate) + muld(balanceOf(_staker), prevAverageRate)), (vAmount + balanceOf(_staker)))
308304 let newTotalBalance = (vAmount + balanceOf(_staker))
309305 let newWithdrawLimit = muld(newTotalBalance, WITHDRAW_PER_PERIOD)
310306 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
311307 if ((stake == stake))
312308 then (((((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateFreeBalance(_amount)) ++ updateUserBalance(_staker, vAmount)) ++ setUserAverageRate(_staker, newAverageRate)) ++ setUserWithdrawLimit(_staker, newWithdrawLimit)) ++ updateTotalSupply(vAmount))
313309 else throw("Strict value is not equal to itself.")
314310 }
315311 }
316312
317313
318314
319315 @Callable(i)
320316 func unStake (_amount) = {
321317 let _staker = toString(i.caller)
322318 let amountOfQuoteAsset = usdnToDecimals(_amount)
323- if (if ((i.payments != nil))
319+ if (if (if ((i.payments != nil))
320+ then true
321+ else (0 >= amountOfQuoteAsset))
324322 then true
325323 else !(initialized()))
326324 then throw("Invalid call to unStake")
327325 else {
328- let $t01149511711 = updateReward(_staker, 0)
329- let newRewardPerTokenStored = $t01149511711._1
330- let newLastUpdateTime = $t01149511711._2
331- let stakerEarned = $t01149511711._3
332- let stakerRewardPerTokenPaid = $t01149511711._4
333- let $t01171811859 = getWithdrawLimitLeft(_staker)
334- let newLastWithdrawnDate = $t01171811859._1
335- let withdrawLimitLeft = $t01171811859._2
326+ let $t01145111667 = updateReward(_staker, 0)
327+ let newRewardPerTokenStored = $t01145111667._1
328+ let newLastUpdateTime = $t01145111667._2
329+ let stakerEarned = $t01145111667._3
330+ let stakerRewardPerTokenPaid = $t01145111667._4
331+ let $t01167411815 = getWithdrawLimitLeft(_staker)
332+ let newLastWithdrawnDate = $t01167411815._1
333+ let withdrawLimitLeft = $t01167411815._2
336334 let vAmount = divd(amountOfQuoteAsset, rate())
337335 if ((vAmount > withdrawLimitLeft))
338336 then throw("Invalid call to unStake: withdraw over limit")
339337 else {
340338 let newWithdrawnInPeriod = (withdrawnInPeriod(_staker) + vAmount)
341339 if ((amountOfQuoteAsset > freeBalance()))
342340 then throw("Invalid call to unStake: balance too low")
343341 else {
344342 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), usdnFromDecimals(amountOfQuoteAsset)], nil)
345343 if ((unstake == unstake))
346344 then (((((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateFreeBalance(-(amountOfQuoteAsset))) ++ updateUserBalance(_staker, -(vAmount))) ++ updateTotalSupply(-(vAmount))) ++ setUserWithdrawParams(_staker, newLastWithdrawnDate, newWithdrawnInPeriod)) ++ [ScriptTransfer(i.caller, usdnFromDecimals(amountOfQuoteAsset), quoteAsset())])
347345 else throw("Strict value is not equal to itself.")
348346 }
349347 }
350348 }
351349 }
352350
353351
354352
355353 @Callable(i)
356354 func withdrawRewards () = {
357355 let _staker = toString(i.caller)
358- let $t01319713342 = updateReward(_staker, 0)
359- let newRewardPerTokenStored = $t01319713342._1
360- let newLastUpdateTime = $t01319713342._2
361- let stakerEarned = $t01319713342._3
362- let stakerRewardPerTokenPaid = $t01319713342._4
356+ let $t01315313298 = updateReward(_staker, 0)
357+ let newRewardPerTokenStored = $t01315313298._1
358+ let newLastUpdateTime = $t01315313298._2
359+ let stakerEarned = $t01315313298._3
360+ let stakerRewardPerTokenPaid = $t01315313298._4
363361 if (if ((0 >= stakerEarned))
364362 then true
365363 else !(initialized()))
366364 then throw("No reward: Vault")
367365 else ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, stakerEarned, governanceAsset())])
368366 }
369367
370368
371369
372370 @Callable(i)
373371 func addFree () = {
374372 let _amount = usdnToDecimals(i.payments[0].amount)
375- if (if (if ((i.payments[0].assetId != quoteAsset()))
373+ if (if (if (if ((i.payments[0].assetId != quoteAsset()))
374+ then true
375+ else (size(i.payments) != 1))
376376 then true
377377 else !(initialized()))
378378 then true
379379 else !(if (isWhitelist(toString(i.caller)))
380380 then true
381381 else (i.caller == adminAddress())))
382382 then throw("Invalid addFree params")
383383 else {
384- let newRate = if ((totalSupply() > 0))
385- then divd((freeBalance() + _amount), totalSupply())
386- else DECIMAL_UNIT
387- let unstake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
388- if ((unstake == unstake))
384+ let newRate = computeNewRate(_amount)
385+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
386+ if ((stake == stake))
389387 then (updateFreeBalance(_amount) ++ updateRate(newRate))
390388 else throw("Strict value is not equal to itself.")
391389 }
392390 }
393391
394392
395393
396394 @Callable(i)
397395 func addLocked () = {
398396 let _amount = usdnToDecimals(i.payments[0].amount)
399- if (if (if ((i.payments[0].assetId != quoteAsset()))
397+ if (if (if (if ((i.payments[0].assetId != quoteAsset()))
398+ then true
399+ else (size(i.payments) != 1))
400400 then true
401401 else !(initialized()))
402402 then true
403403 else !(if (isWhitelist(toString(i.caller)))
404404 then true
405405 else (i.caller == adminAddress())))
406406 then throw("Invalid addLocked params")
407407 else {
408408 let unstake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_amount))])
409409 if ((unstake == unstake))
410410 then updateLockedBalance(_amount)
411411 else throw("Strict value is not equal to itself.")
412412 }
413413 }
414414
415415
416416
417417 @Callable(i)
418418 func exchangeFreeAndLocked (_amount) = if (if (!(initialized()))
419419 then true
420- else !(if (isWhitelist(toString(i.caller)))
421- then true
422- else (i.caller == adminAddress())))
420+ else !(isWhitelist(toString(i.caller))))
423421 then throw("Invalid exchangeFreeAndLocked params")
424422 else {
425423 let amountOfQuoteAsset = usdnToDecimals(_amount)
426- let freeUpdate = -(amountOfQuoteAsset)
427- let newRate = computeNewRate(freeUpdate)
428- ((updateLockedBalanceUnchecked(amountOfQuoteAsset) ++ updateFreeBalance(freeUpdate)) ++ updateRate(newRate))
424+ let newRate = computeNewRate(-(amountOfQuoteAsset))
425+ ((updateLockedBalance(amountOfQuoteAsset) ++ updateFreeBalance(-(amountOfQuoteAsset))) ++ updateRate(newRate))
429426 }
430427
431428
432429
433430 @Callable(i)
434431 func withdrawLocked (_amount) = if (if (if (!(initialized()))
435432 then true
436433 else (0 >= _amount))
437434 then true
438435 else !(isWhitelist(toString(i.caller))))
439436 then throw("Invalid withdrawLocked params")
440437 else {
441438 let amountOfQuoteAsset = usdnToDecimals(_amount)
442439 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), usdnFromDecimals(amountOfQuoteAsset)], nil)
443440 if ((unstake == unstake))
444- then {
445- let lockBalanceNow = lockedBalance()
446- let $t01624316436 = if ((amountOfQuoteAsset > lockBalanceNow))
447- then $Tuple2(lockBalanceNow, (amountOfQuoteAsset - lockBalanceNow))
448- else $Tuple2(amountOfQuoteAsset, 0)
449- let fromLocked = $t01624316436._1
450- let fromFree = $t01624316436._2
451- (((if ((fromFree > 0))
452- then {
453- let newRate = computeNewRate(-(fromFree))
454- (updateFreeBalance(-(fromFree)) ++ updateRate(newRate))
455- }
456- else nil) ++ updateLockedBalance(-(fromLocked))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(amountOfQuoteAsset), quoteAsset())])
457- }
441+ then (updateLockedBalance(-(amountOfQuoteAsset)) ++ [ScriptTransfer(i.caller, usdnFromDecimals(amountOfQuoteAsset), quoteAsset())])
458442 else throw("Strict value is not equal to itself.")
459443 }
460444
461445
462446
463447 @Callable(i)
464-func addRewards () = if (if ((i.payments[0].assetId != governanceAsset()))
448+func addRewards () = if (if (if ((i.payments[0].assetId != governanceAsset()))
449+ then true
450+ else (size(i.payments) != 1))
465451 then true
466452 else !(initialized()))
467453 then throw("Invalid addRewards params")
468454 else {
469455 let _reward = i.payments[0].amount
470456 let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
471457 let timestamp = currentTimestampSec()
472458 let newRewardRate = if ((timestamp > periodFinish()))
473459 then (_reward / DURATION)
474460 else {
475461 let remainingTime = (periodFinish() - timestamp)
476462 let leftover = (rewardRate() * remainingTime)
477463 ((_reward + leftover) / DURATION)
478464 }
479465 (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
480466 }
467+
468+
469+
470+@Callable(i)
471+func ackRewards () = {
472+ let profitResp = invoke(managerAddress(), "claimProfit", [toBase58String(quoteAsset())], nil)
473+ if ((profitResp == profitResp))
474+ then {
475+ let profit = match profitResp {
476+ case p: Int =>
477+ usdnToDecimals(p)
478+ case _ =>
479+ throw("Invalid claimProfit response")
480+ }
481+ let result = if ((profit > 0))
482+ then {
483+ let newRate = computeNewRate(profit)
484+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(profit))])
485+ if ((stake == stake))
486+ then (updateFreeBalance(profit) ++ updateRate(newRate))
487+ else throw("Strict value is not equal to itself.")
488+ }
489+ else nil
490+ if ((result == result))
491+ then result
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
481496
482497
483498
484499 @Callable(i)
485500 func view_reward (_staker) = {
486501 let balance = balanceOf(_staker)
487502 let depositedAmount = muld(averageRate(_staker), balance)
488503 let currentAmount = muld(rate(), balance)
489504 let earnedQuote = (currentAmount - depositedAmount)
490505 throw(toString(earnedQuote))
491506 }
492507
493508
494509
495510 @Callable(i)
496511 func view_stakingReward (_staker) = {
497512 let stakerEarned = updateReward(_staker, 0)._3
498513 throw(toString(usdnFromDecimals(stakerEarned)))
499514 }
500515
501516
502517
503518 @Callable(i)
504519 func view_withdrawLimit (_staker) = {
505520 let withdrawLimitLeft = getWithdrawLimitLeft(_staker)._2
506521 let limitInUsdn = usdnFromDecimals(muld(withdrawLimitLeft, rate()))
507522 throw(toString(limitInUsdn))
508523 }
509524
510525
511526 @Verifier(tx)
512-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
527+func verify () = {
528+ let coordinatorStr = getString(this, k_coordinatorAddress)
529+ if (isDefined(coordinatorStr))
530+ then {
531+ let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
532+ if (isDefined(admin))
533+ then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
534+ else throw("unable to verify: admin not set in coordinator")
535+ }
536+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
537+ }
513538

github/deemru/w8io/c3f4982 
82.49 ms