tx · 37jRApP3K7dZ2UYb7CKEU2xdcwKTEP7yZZLhXyBmc2Ky

3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7:  -0.03700000 Waves

2023.04.17 20:05 [2538841] smart account 3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7 > SELF 0.00000000 Waves

{ "type": 13, "id": "37jRApP3K7dZ2UYb7CKEU2xdcwKTEP7yZZLhXyBmc2Ky", "fee": 3700000, "feeAssetId": null, "timestamp": 1681751182834, "version": 2, "chainId": 84, "sender": "3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7", "senderPublicKey": "28h5rtcro3AxHztuBMn6CFYrRv3hcdjgwkCdSytBSXUH", "proofs": [ "5ubL8NGv3DUvpatMCxUxibVt1HdpS1o9j7C9jdyXjvi1nhPGoQ1ymsu73D5kZH9gSDy5hUcZ5TS1LBTjECxAy8f4" ], "script": "base64:BgIXCAISAwoBCBIAEgMKAQESABIAEgMKAQg2AA1rX3RvdGFsU3VwcGx5Ag1rX3RvdGFsU3VwcGx5AA9rX3Jld2FyZEJhbGFuY2UCD2tfcmV3YXJkQmFsYW5jZQAOa19zd2FwX2FkZHJlc3MCDmtfc3dhcF9hZGRyZXNzABBrX2xhc3RVcGRhdGVUaW1lAhBrX2xhc3RVcGRhdGVUaW1lABZrX3Jld2FyZFBlclRva2VuU3RvcmVkAhZrX3Jld2FyZFBlclRva2VuU3RvcmVkAAxrX3Jld2FyZFJhdGUCDGtfcmV3YXJkUmF0ZQAOa19wZXJpb2RGaW5pc2gCDmtfcGVyaW9kRmluaXNoAAlrX2JhbGFuY2UCCWtfYmFsYW5jZQAUa191c2VyUmV3YXJkUGVyVG9rZW4CFGtfdXNlclJld2FyZFBlclRva2VuAAxrX3VzZXJSZXdhcmQCDGtfdXNlclJld2FyZAANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAEmtfZ292ZXJuYW5jZV9hc3NldAILa19nb3ZfYXNzZXQADmtfcmV3YXJkX2Fzc2V0Ag5rX3Jld2FyZF9hc3NldAAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIbQ29vcmRpbmF0b3Igbm90IHNldCBGYXJtaW5nAhtDb29yZGluYXRvciBhZGRyZXNzIGludmFsaWQBDGFkbWluQWRkcmVzcwAJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwIVQWRtaW4gYWRkcmVzcyBub3Qgc2V0AQ9nb3Zlcm5hbmNlQXNzZXQACQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABRJrX2dvdmVybmFuY2VfYXNzZXQCGEdvdmVybmFuY2UgYXNzZXQgbm90IHNldAELcmV3YXJkQXNzZXQACQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ5rX3Jld2FyZF9hc3NldAIUUmV3YXJkIGFzc2V0IG5vdCBzZXQBDnN0YWtpbmdBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABRFrX3N0YWtpbmdfYWRkcmVzcwIXU3Rha2luZyBhZGRyZXNzIG5vdCBzZXQCF1N0YWtpbmcgYWRkcmVzcyBpbnZhbGlkAQtzd2FwQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBC2Nvb3JkaW5hdG9yAAUOa19zd2FwX2FkZHJlc3MCFFN3YXAgYWRkcmVzcyBub3Qgc2V0AhRTd2FwIGFkZHJlc3MgaW52YWxpZAAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAKAAoACERVUkFUSU9OCQBoAgkAaAIAPAA8ABgACk5PX0FERFJFU1MCAAAJTk9fU1RBS0VSAAABBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEbWludgICX3gCX3kDCQBmAgUCX3gFAl95BQJfeQUCX3gBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBA2ludAEBawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAWsJAKwCAgINbm8gdmFsdWUgZm9yIAUBawEEaW50MAEBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrAAABC3RvdGFsU3VwcGx5AAkBBGludDABBQ1rX3RvdGFsU3VwcGx5ARRyZXdhcmRQZXJUb2tlblN0b3JlZAAJAQRpbnQwAQUWa19yZXdhcmRQZXJUb2tlblN0b3JlZAEObGFzdFVwZGF0ZVRpbWUACQEEaW50MAEFEGtfbGFzdFVwZGF0ZVRpbWUBCnJld2FyZFJhdGUACQEEaW50MAEFDGtfcmV3YXJkUmF0ZQEMcGVyaW9kRmluaXNoAAkBBGludDABBQ5rX3BlcmlvZEZpbmlzaAENcmV3YXJkQmFsYW5jZQAJAQRpbnQwAQUPa19yZXdhcmRCYWxhbmNlAQdyZXdhcmRzAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgEWdXNlclJld2FyZFBlclRva2VuUGFpZAEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRRrX3VzZXJSZXdhcmRQZXJUb2tlbgUHX3N0YWtlcgEJYmFsYW5jZU9mAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHARN1cGRhdGVSZXdhcmRCYWxhbmNlAQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfcmV3YXJkQmFsYW5jZQkAZAIJAQ1yZXdhcmRCYWxhbmNlAAUGX2RlbHRhBQNuaWwBEHVwZGF0ZVJld2FyZFJhdGUBC19yZXdhcmRSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrX3Jld2FyZFJhdGUFC19yZXdhcmRSYXRlBQNuaWwBCnVwZGF0ZVRpbWUCD19sYXN0VXBkYXRlVGltZQ1fcGVyaW9kRmluaXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX2xhc3RVcGRhdGVUaW1lBQ9fbGFzdFVwZGF0ZVRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtfcGVyaW9kRmluaXNoBQ1fcGVyaW9kRmluaXNoBQNuaWwBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkARVfcmV3YXJkUGVyVG9rZW5TdG9yZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQFFV9yZXdhcmRQZXJUb2tlblN0b3JlZAUDbmlsARF1cGRhdGVVc2VyUmV3YXJkcwMHX3N0YWtlcgdfcmV3YXJkE191c2VyUmV3YXJkUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgUHX3Jld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa191c2VyUmV3YXJkUGVyVG9rZW4FB19zdGFrZXIFE191c2VyUmV3YXJkUGVyVG9rZW4FA25pbAENdXBkYXRlQmFsYW5jZQIHX3N0YWtlcgZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgkAZAIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfdG90YWxTdXBwbHkJAGQCCQELdG90YWxTdXBwbHkABQZfZGVsdGEFA25pbAETY3VycmVudFRpbWVzdGFtcFNlYwAJAGkCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcADoBwEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBBG1pbnYCCQETY3VycmVudFRpbWVzdGFtcFNlYwAJAQxwZXJpb2RGaW5pc2gAAQ5yZXdhcmRQZXJUb2tlbgENX2JhbGFuY2VEZWx0YQMJAAACCQBkAgkBC3RvdGFsU3VwcGx5AAUNX2JhbGFuY2VEZWx0YQAACQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQABAx0aW1lSW50ZXJ2YWwJAGUCCQEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBDmxhc3RVcGRhdGVUaW1lAAQSYWN0dWFsVGltZUludGVydmFsAwkAZgIAAAUMdGltZUludGVydmFsAAAFDHRpbWVJbnRlcnZhbAQEZGlmZgkBBGRpdmQCCQBoAgkBCnJld2FyZFJhdGUABRJhY3R1YWxUaW1lSW50ZXJ2YWwJAGQCCQELdG90YWxTdXBwbHkABQ1fYmFsYW5jZURlbHRhCQBkAgkBFHJld2FyZFBlclRva2VuU3RvcmVkAAUEZGlmZgEGZWFybmVkAgdfc3Rha2VyDV9iYWxhbmNlRGVsdGEEC3Jld2FyZERlbHRhCQBlAgkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQkBFnVzZXJSZXdhcmRQZXJUb2tlblBhaWQBBQdfc3Rha2VyCQBkAgkBBG11bGQCCQBkAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFC3Jld2FyZERlbHRhCQEHcmV3YXJkcwEFB19zdGFrZXIBDHVwZGF0ZVJld2FyZAIHX3N0YWtlcg1fYmFsYW5jZURlbHRhBBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQQRbmV3TGFzdFVwZGF0ZVRpbWUJARNjdXJyZW50VGltZXN0YW1wU2VjAAQLJHQwNTMwODU1MDADCQECIT0CBQdfc3Rha2VyAgAJAJQKAgkBBmVhcm5lZAIFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQCUCgIAAAAABAxzdGFrZXJFYXJuZWQIBQskdDA1MzA4NTUwMAJfMQQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNTMwODU1MDACXzIJAJYKBAUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQFEW5ld0xhc3RVcGRhdGVUaW1lBQxzdGFrZXJFYXJuZWQFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAYBaQEKaW5pdGlhbGl6ZQEMX2Nvb3JkaW5hdG9yAwMJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRVbmFibGUgdG8gaW5pdGlhbGl6ZQkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwkApQgBCQERQGV4dHJOYXRpdmUoMTA2MikBBQxfY29vcmRpbmF0b3IJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGBQNuaWwBaQEFc3Rha2UABAdfc3Rha2VyCQClCAEIBQFpBmNhbGxlcgQHX2Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEPZ292ZXJuYW5jZUFzc2V0AAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECFkludmFsaWQgY2FsbCB0byAgc3Rha2UECyR0MDYyMTI2Mzc3CQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFCyR0MDYyMTI2Mzc3Al8xBBFuZXdMYXN0VXBkYXRlVGltZQgFCyR0MDYyMTI2Mzc3Al8yBAxzdGFrZXJFYXJuZWQIBQskdDA2MjEyNjM3NwJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNjIxMjYzNzcCXzQEB2RvU3Rha2UJAPwHBAkBDnN0YWtpbmdBZGRyZXNzAAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBD2dvdmVybmFuY2VBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQdkb1N0YWtlBQdkb1N0YWtlCQDOCAIJAM4IAgkAzggCCQERdXBkYXRlVXNlclJld2FyZHMDBQdfc3Rha2VyBQxzdGFrZXJFYXJuZWQFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAQUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQp1cGRhdGVUaW1lAgURbmV3TGFzdFVwZGF0ZVRpbWUJAQxwZXJpb2RGaW5pc2gACQENdXBkYXRlQmFsYW5jZQIFB19zdGFrZXIFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5TdGFrZQEHX2Ftb3VudAQMZG9BY2tSZXdhcmRzCQD8BwQFBHRoaXMCCmFja1Jld2FyZHMFA25pbAUDbmlsAwkAAAIFDGRvQWNrUmV3YXJkcwUMZG9BY2tSZXdhcmRzBAdfc3Rha2VyCQClCAEIBQFpBmNhbGxlcgMDCQECIT0CCAUBaQhwYXltZW50cwUDbmlsBgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIaSW52YWxpZCB1blN0YWtlIHBhcmFtZXRlcnMECyR0MDcxMjM3Mjg4CQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFCyR0MDcxMjM3Mjg4Al8xBBFuZXdMYXN0VXBkYXRlVGltZQgFCyR0MDcxMjM3Mjg4Al8yBAxzdGFrZXJFYXJuZWQIBQskdDA3MTIzNzI4OAJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNzEyMzcyODgCXzQDCQBmAgUHX2Ftb3VudAkAZAIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQxzdGFrZXJFYXJuZWQJAAIBAhpJbnZhbGlkIHVuU3Rha2UgcGFyYW1ldGVycwQJZG9VblN0YWtlCQD8BwQJAQ5zdGFraW5nQWRkcmVzcwACB3VuU3Rha2UJAMwIAgUHX2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUJZG9VblN0YWtlBQlkb1VuU3Rha2UEDHJld2FyZENoYW5nZQMJAGcCCQEJYmFsYW5jZU9mAQUHX3N0YWtlcgUHX2Ftb3VudAAACQBlAgUHX2Ftb3VudAkBCWJhbGFuY2VPZgEFB19zdGFrZXIEDWJhbGFuY2VDaGFuZ2UDCQBnAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFB19hbW91bnQFB19hbW91bnQJAQliYWxhbmNlT2YBBQdfc3Rha2VyCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgkAZQIFDHN0YWtlckVhcm5lZAUMcmV3YXJkQ2hhbmdlBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBDXVwZGF0ZUJhbGFuY2UCBQdfc3Rha2VyCQEBLQEFDWJhbGFuY2VDaGFuZ2UJARN1cGRhdGVSZXdhcmRCYWxhbmNlAQkBAS0BBQxyZXdhcmRDaGFuZ2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdfYW1vdW50CQEPZ292ZXJuYW5jZUFzc2V0AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3dpdGhkcmF3UmV3YXJkcwAEDGRvQWNrUmV3YXJkcwkA/AcEBQR0aGlzAgphY2tSZXdhcmRzBQNuaWwFA25pbAMJAAACBQxkb0Fja1Jld2FyZHMFDGRvQWNrUmV3YXJkcwQHX3N0YWtlcgkApQgBCAUBaQZjYWxsZXIECyR0MDg2MjY4NzcxCQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFCyR0MDg2MjY4NzcxAl8xBBFuZXdMYXN0VXBkYXRlVGltZQgFCyR0MDg2MjY4NzcxAl8yBAxzdGFrZXJFYXJuZWQIBQskdDA4NjI2ODc3MQJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwODYyNjg3NzECXzQDAwkAZwIAAAUMc3Rha2VyRWFybmVkBgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIRTm8gZmFybWluZyByZXdhcmQECWRvVW5TdGFrZQkA/AcECQEOc3Rha2luZ0FkZHJlc3MAAgd1blN0YWtlCQDMCAIFDHN0YWtlckVhcm5lZAUDbmlsBQNuaWwDCQAAAgUJZG9VblN0YWtlBQlkb1VuU3Rha2UJAM4IAgkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgAABRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBE3VwZGF0ZVJld2FyZEJhbGFuY2UBCQEBLQEFDHN0YWtlckVhcm5lZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHN0YWtlckVhcm5lZAkBD2dvdmVybmFuY2VBc3NldAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQphY2tSZXdhcmRzAAQNX3Jld2FyZEFtb3VudAkA/AcECQEOc3Rha2luZ0FkZHJlc3MAAg1jb21wdXRlUmV3YXJkCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQAAAgUNX3Jld2FyZEFtb3VudAUNX3Jld2FyZEFtb3VudAQMcmV3YXJkQW1vdW50BAckbWF0Y2gwBQ1fcmV3YXJkQW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECGlJld2FyZCBhbW91bnQgbm90IGEgbnVtYmVyAwkAZgIJAGgCAAEFDERFQ0lNQUxfVU5JVAUMcmV3YXJkQW1vdW50BQNuaWwEDmRvQ2xhaW1SZXdhcmRzCQD8BwQJAQ5zdGFraW5nQWRkcmVzcwACD3dpdGhkcmF3UmV3YXJkcwUDbmlsBQNuaWwDCQAAAgUOZG9DbGFpbVJld2FyZHMFDmRvQ2xhaW1SZXdhcmRzBA1yZXdhcmRzQW1vdW50CQDwBwIFBHRoaXMJAQtyZXdhcmRBc3NldAAEBmRvU3dhcAkA/AcECQELc3dhcEFkZHJlc3MAAgRzd2FwCQDMCAIJANgEAQkBD2dvdmVybmFuY2VBc3NldAAJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQtyZXdhcmRBc3NldAAFDXJld2FyZHNBbW91bnQFA25pbAMJAAACBQZkb1N3YXAFBmRvU3dhcAQLcmV3YXJkRGVsdGEJAPAHAgUEdGhpcwkBD2dvdmVybmFuY2VBc3NldAADCQAAAgULcmV3YXJkRGVsdGEFC3Jld2FyZERlbHRhAwkAZwIAAAULcmV3YXJkRGVsdGEJAAIBAhlJbnZhbGlkIGFja1Jld2FyZHMgcGFyYW1zBAdfcmV3YXJkBQtyZXdhcmREZWx0YQQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQICQEMdXBkYXRlUmV3YXJkAgUKTk9fQUREUkVTUwUJTk9fU1RBS0VSAl8xBAl0aW1lc3RhbXAJARNjdXJyZW50VGltZXN0YW1wU2VjAAQNbmV3UmV3YXJkUmF0ZQMJAGYCBQl0aW1lc3RhbXAJAQxwZXJpb2RGaW5pc2gACQBpAgUHX3Jld2FyZAUIRFVSQVRJT04EDXJlbWFpbmluZ1RpbWUJAGUCCQEMcGVyaW9kRmluaXNoAAUJdGltZXN0YW1wBAhsZWZ0b3ZlcgkAaAIJAQpyZXdhcmRSYXRlAAUNcmVtYWluaW5nVGltZQkAaQIJAGQCBQdfcmV3YXJkBQhsZWZ0b3ZlcgUIRFVSQVRJT04EB2RvU3Rha2UJAPwHBAkBDnN0YWtpbmdBZGRyZXNzAAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBD2dvdmVybmFuY2VBc3NldAAFC3Jld2FyZERlbHRhBQNuaWwDCQAAAgUHZG9TdGFrZQUHZG9TdGFrZQkAzggCCQDOCAIJAM4IAgkBEHVwZGF0ZVJld2FyZFJhdGUBBQ1uZXdSZXdhcmRSYXRlCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBE3VwZGF0ZVJld2FyZEJhbGFuY2UBBQdfcmV3YXJkCQEKdXBkYXRlVGltZQIFCXRpbWVzdGFtcAkAZAIFCXRpbWVzdGFtcAUIRFVSQVRJT04JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdmlld19yZXdhcmQBB19zdGFrZXIEDHN0YWtlckVhcm5lZAgJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAACXzMJAAIBCQCkAwEFDHN0YWtlckVhcm5lZAECdHgBBnZlcmlmeQAEDmNvb3JkaW5hdG9yU3RyCQCdCAIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAwkBCWlzRGVmaW5lZAEFDmNvb3JkaW5hdG9yU3RyBAVhZG1pbgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQ5jb29yZGluYXRvclN0cgUPa19hZG1pbl9hZGRyZXNzAwkBCWlzRGVmaW5lZAEFBWFkbWluCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBWFkbWluCQCsAgIJAKwCAgkArAICAgdzdGF0dXNfCQClCAEFBHRoaXMCAV8JANgEAQgFAnR4AmlkBwkAAgECLnVuYWJsZSB0byB2ZXJpZnk6IGFkbWluIG5vdCBzZXQgaW4gY29vcmRpbmF0b3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnydWbP", "height": 2538841, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3KbZYCQA36nnGQB2svDoNFeEq3eCLMqZJ5o1f4SJBCQV Next: none Diff:
OldNewDifferences
55
66 let k_rewardBalance = "k_rewardBalance"
77
8-let k_swapAddress = "k_swapAddress"
8+let k_swap_address = "k_swap_address"
99
1010 let k_lastUpdateTime = "k_lastUpdateTime"
1111
2929
3030 let k_governance_asset = "k_gov_asset"
3131
32-let k_quote_asset = "k_quote_asset"
33-
34-let k_admin_public_key = "k_admin_public_key"
32+let k_reward_asset = "k_reward_asset"
3533
3634 let k_admin_address = "k_admin_address"
3735
38-func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
36+func coordinator () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_coordinatorAddress), "Coordinator not set Farming")), "Coordinator address invalid")
3937
4038
41-func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
39+func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
4240
4341
44-func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
42+func governanceAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_governance_asset), "Governance asset not set"))
4543
4644
47-func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
45+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
4846
4947
50-func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
48+func stakingAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_staking_address), "Staking address not set")), "Staking address invalid")
5149
5250
53-func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Staking not set")
51+func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_swap_address), "Swap address not set")), "Swap address invalid")
5452
5553
5654 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
102100
103101
104102 func rewardBalance () = int0(k_rewardBalance)
105-
106-
107-func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_swapAddress), "Now swap address")), "Invalid swap address")
108103
109104
110105 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
164159 func updateReward (_staker,_balanceDelta) = {
165160 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
166161 let newLastUpdateTime = currentTimestampSec()
167- let $t052055397 = if ((_staker != ""))
162+ let $t053085500 = if ((_staker != ""))
168163 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
169164 else $Tuple2(0, 0)
170- let stakerEarned = $t052055397._1
171- let stakerRewardPerTokenPaid = $t052055397._2
165+ let stakerEarned = $t053085500._1
166+ let stakerRewardPerTokenPaid = $t053085500._2
172167 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
173168 }
174169
175170
176171 @Callable(i)
177-func initialize (_coordinator,_swapAddress) = if (initialized())
178- then throw("Already initialized")
179- else [StringEntry(k_coordinatorAddress, _coordinator), StringEntry(k_swapAddress, _swapAddress), BooleanEntry(k_initialized, true)]
180-
181-
182-
183-@Callable(i)
184-func setSwap (_swapAddress) = if ((i.caller != adminAddress()))
185- then throw("Invalid setSwap params")
186- else [StringEntry(k_swapAddress, _swapAddress)]
172+func initialize (_coordinator) = if (if (initialized())
173+ then true
174+ else (i.caller != this))
175+ then throw("Unable to initialize")
176+ else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), BooleanEntry(k_initialized, true)]
187177
188178
189179
196186 else !(initialized()))
197187 then throw("Invalid call to stake")
198188 else {
199- let $t063396504 = updateReward(_staker, 0)
200- let newRewardPerTokenStored = $t063396504._1
201- let newLastUpdateTime = $t063396504._2
202- let stakerEarned = $t063396504._3
203- let stakerRewardPerTokenPaid = $t063396504._4
189+ let $t062126377 = updateReward(_staker, 0)
190+ let newRewardPerTokenStored = $t062126377._1
191+ let newLastUpdateTime = $t062126377._2
192+ let stakerEarned = $t062126377._3
193+ let stakerRewardPerTokenPaid = $t062126377._4
204194 let doStake = invoke(stakingAddress(), "stake", nil, [AttachedPayment(governanceAsset(), _amount)])
205195 if ((doStake == doStake))
206196 then (((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
221211 else !(initialized()))
222212 then throw("Invalid unStake parameters")
223213 else {
224- let $t072507415 = updateReward(_staker, 0)
225- let newRewardPerTokenStored = $t072507415._1
226- let newLastUpdateTime = $t072507415._2
227- let stakerEarned = $t072507415._3
228- let stakerRewardPerTokenPaid = $t072507415._4
214+ let $t071237288 = updateReward(_staker, 0)
215+ let newRewardPerTokenStored = $t071237288._1
216+ let newLastUpdateTime = $t071237288._2
217+ let stakerEarned = $t071237288._3
218+ let stakerRewardPerTokenPaid = $t071237288._4
229219 if ((_amount > (balanceOf(_staker) + stakerEarned)))
230220 then throw("Invalid unStake parameters")
231221 else {
255245 if ((doAckRewards == doAckRewards))
256246 then {
257247 let _staker = toString(i.caller)
258- let $t087538898 = updateReward(_staker, 0)
259- let newRewardPerTokenStored = $t087538898._1
260- let newLastUpdateTime = $t087538898._2
261- let stakerEarned = $t087538898._3
262- let stakerRewardPerTokenPaid = $t087538898._4
248+ let $t086268771 = updateReward(_staker, 0)
249+ let newRewardPerTokenStored = $t086268771._1
250+ let newLastUpdateTime = $t086268771._2
251+ let stakerEarned = $t086268771._3
252+ let stakerRewardPerTokenPaid = $t086268771._4
263253 if (if ((0 >= stakerEarned))
264254 then true
265255 else !(initialized()))
293283 let doClaimRewards = invoke(stakingAddress(), "withdrawRewards", nil, nil)
294284 if ((doClaimRewards == doClaimRewards))
295285 then {
296- let rewardsAmount = assetBalance(this, quoteAsset())
297- let doSwap = invoke(swapAddress(), "swap", [toBase58String(governanceAsset()), 0], [AttachedPayment(quoteAsset(), rewardsAmount)])
286+ let rewardsAmount = assetBalance(this, rewardAsset())
287+ let doSwap = invoke(swapAddress(), "swap", [toBase58String(governanceAsset()), 0], [AttachedPayment(rewardAsset(), rewardsAmount)])
298288 if ((doSwap == doSwap))
299289 then {
300290 let rewardDelta = assetBalance(this, governanceAsset())
337327
338328
339329 @Verifier(tx)
340-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
330+func verify () = {
331+ let coordinatorStr = getString(this, k_coordinatorAddress)
332+ if (isDefined(coordinatorStr))
333+ then {
334+ let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
335+ if (isDefined(admin))
336+ then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
337+ else throw("unable to verify: admin not set in coordinator")
338+ }
339+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
340+ }
341341
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
8-let k_swapAddress = "k_swapAddress"
8+let k_swap_address = "k_swap_address"
99
1010 let k_lastUpdateTime = "k_lastUpdateTime"
1111
1212 let k_rewardPerTokenStored = "k_rewardPerTokenStored"
1313
1414 let k_rewardRate = "k_rewardRate"
1515
1616 let k_periodFinish = "k_periodFinish"
1717
1818 let k_balance = "k_balance"
1919
2020 let k_userRewardPerToken = "k_userRewardPerToken"
2121
2222 let k_userReward = "k_userReward"
2323
2424 let k_initialized = "k_initialized"
2525
2626 let k_coordinatorAddress = "k_coordinatorAddress"
2727
2828 let k_staking_address = "k_staking_address"
2929
3030 let k_governance_asset = "k_gov_asset"
3131
32-let k_quote_asset = "k_quote_asset"
33-
34-let k_admin_public_key = "k_admin_public_key"
32+let k_reward_asset = "k_reward_asset"
3533
3634 let k_admin_address = "k_admin_address"
3735
38-func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
36+func coordinator () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_coordinatorAddress), "Coordinator not set Farming")), "Coordinator address invalid")
3937
4038
41-func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
39+func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
4240
4341
44-func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
42+func governanceAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_governance_asset), "Governance asset not set"))
4543
4644
47-func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
45+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
4846
4947
50-func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
48+func stakingAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_staking_address), "Staking address not set")), "Staking address invalid")
5149
5250
53-func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Staking not set")
51+func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_swap_address), "Swap address not set")), "Swap address invalid")
5452
5553
5654 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
5755
5856 let DURATION = ((60 * 60) * 24)
5957
6058 let NO_ADDRESS = ""
6159
6260 let NO_STAKER = 0
6361
6462 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
6563
6664
6765 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6866
6967
7068 func abs (_x) = if ((_x > 0))
7169 then _x
7270 else -(_x)
7371
7472
7573 func minv (_x,_y) = if ((_x > _y))
7674 then _y
7775 else _x
7876
7977
8078 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
8179
8280
8381 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
8482
8583
8684 func int0 (k) = valueOrElse(getInteger(this, k), 0)
8785
8886
8987 func totalSupply () = int0(k_totalSupply)
9088
9189
9290 func rewardPerTokenStored () = int0(k_rewardPerTokenStored)
9391
9492
9593 func lastUpdateTime () = int0(k_lastUpdateTime)
9694
9795
9896 func rewardRate () = int0(k_rewardRate)
9997
10098
10199 func periodFinish () = int0(k_periodFinish)
102100
103101
104102 func rewardBalance () = int0(k_rewardBalance)
105-
106-
107-func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_swapAddress), "Now swap address")), "Invalid swap address")
108103
109104
110105 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
111106
112107
113108 func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
114109
115110
116111 func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
117112
118113
119114 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
120115
121116
122117 func updateRewardBalance (_delta) = [IntegerEntry(k_rewardBalance, (rewardBalance() + _delta))]
123118
124119
125120 func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
126121
127122
128123 func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
129124
130125
131126 func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
132127
133128
134129 func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
135130
136131
137132 func updateBalance (_staker,_delta) = [IntegerEntry(toCompositeKey(k_balance, _staker), (balanceOf(_staker) + _delta)), IntegerEntry(k_totalSupply, (totalSupply() + _delta))]
138133
139134
140135 func currentTimestampSec () = (lastBlock.timestamp / 1000)
141136
142137
143138 func lastTimeRewardApplicable () = minv(currentTimestampSec(), periodFinish())
144139
145140
146141 func rewardPerToken (_balanceDelta) = if (((totalSupply() + _balanceDelta) == 0))
147142 then rewardPerTokenStored()
148143 else {
149144 let timeInterval = (lastTimeRewardApplicable() - lastUpdateTime())
150145 let actualTimeInterval = if ((0 > timeInterval))
151146 then 0
152147 else timeInterval
153148 let diff = divd((rewardRate() * actualTimeInterval), (totalSupply() + _balanceDelta))
154149 (rewardPerTokenStored() + diff)
155150 }
156151
157152
158153 func earned (_staker,_balanceDelta) = {
159154 let rewardDelta = (rewardPerToken(_balanceDelta) - userRewardPerTokenPaid(_staker))
160155 (muld((balanceOf(_staker) + _balanceDelta), rewardDelta) + rewards(_staker))
161156 }
162157
163158
164159 func updateReward (_staker,_balanceDelta) = {
165160 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
166161 let newLastUpdateTime = currentTimestampSec()
167- let $t052055397 = if ((_staker != ""))
162+ let $t053085500 = if ((_staker != ""))
168163 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
169164 else $Tuple2(0, 0)
170- let stakerEarned = $t052055397._1
171- let stakerRewardPerTokenPaid = $t052055397._2
165+ let stakerEarned = $t053085500._1
166+ let stakerRewardPerTokenPaid = $t053085500._2
172167 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
173168 }
174169
175170
176171 @Callable(i)
177-func initialize (_coordinator,_swapAddress) = if (initialized())
178- then throw("Already initialized")
179- else [StringEntry(k_coordinatorAddress, _coordinator), StringEntry(k_swapAddress, _swapAddress), BooleanEntry(k_initialized, true)]
180-
181-
182-
183-@Callable(i)
184-func setSwap (_swapAddress) = if ((i.caller != adminAddress()))
185- then throw("Invalid setSwap params")
186- else [StringEntry(k_swapAddress, _swapAddress)]
172+func initialize (_coordinator) = if (if (initialized())
173+ then true
174+ else (i.caller != this))
175+ then throw("Unable to initialize")
176+ else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), BooleanEntry(k_initialized, true)]
187177
188178
189179
190180 @Callable(i)
191181 func stake () = {
192182 let _staker = toString(i.caller)
193183 let _amount = i.payments[0].amount
194184 if (if ((i.payments[0].assetId != governanceAsset()))
195185 then true
196186 else !(initialized()))
197187 then throw("Invalid call to stake")
198188 else {
199- let $t063396504 = updateReward(_staker, 0)
200- let newRewardPerTokenStored = $t063396504._1
201- let newLastUpdateTime = $t063396504._2
202- let stakerEarned = $t063396504._3
203- let stakerRewardPerTokenPaid = $t063396504._4
189+ let $t062126377 = updateReward(_staker, 0)
190+ let newRewardPerTokenStored = $t062126377._1
191+ let newLastUpdateTime = $t062126377._2
192+ let stakerEarned = $t062126377._3
193+ let stakerRewardPerTokenPaid = $t062126377._4
204194 let doStake = invoke(stakingAddress(), "stake", nil, [AttachedPayment(governanceAsset(), _amount)])
205195 if ((doStake == doStake))
206196 then (((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
207197 else throw("Strict value is not equal to itself.")
208198 }
209199 }
210200
211201
212202
213203 @Callable(i)
214204 func unStake (_amount) = {
215205 let doAckRewards = invoke(this, "ackRewards", nil, nil)
216206 if ((doAckRewards == doAckRewards))
217207 then {
218208 let _staker = toString(i.caller)
219209 if (if ((i.payments != nil))
220210 then true
221211 else !(initialized()))
222212 then throw("Invalid unStake parameters")
223213 else {
224- let $t072507415 = updateReward(_staker, 0)
225- let newRewardPerTokenStored = $t072507415._1
226- let newLastUpdateTime = $t072507415._2
227- let stakerEarned = $t072507415._3
228- let stakerRewardPerTokenPaid = $t072507415._4
214+ let $t071237288 = updateReward(_staker, 0)
215+ let newRewardPerTokenStored = $t071237288._1
216+ let newLastUpdateTime = $t071237288._2
217+ let stakerEarned = $t071237288._3
218+ let stakerRewardPerTokenPaid = $t071237288._4
229219 if ((_amount > (balanceOf(_staker) + stakerEarned)))
230220 then throw("Invalid unStake parameters")
231221 else {
232222 let doUnStake = invoke(stakingAddress(), "unStake", [_amount], nil)
233223 if ((doUnStake == doUnStake))
234224 then {
235225 let rewardChange = if ((balanceOf(_staker) >= _amount))
236226 then 0
237227 else (_amount - balanceOf(_staker))
238228 let balanceChange = if ((balanceOf(_staker) >= _amount))
239229 then _amount
240230 else balanceOf(_staker)
241231 (((((updateUserRewards(_staker, (stakerEarned - rewardChange), stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(balanceChange))) ++ updateRewardBalance(-(rewardChange))) ++ [ScriptTransfer(i.caller, _amount, governanceAsset())])
242232 }
243233 else throw("Strict value is not equal to itself.")
244234 }
245235 }
246236 }
247237 else throw("Strict value is not equal to itself.")
248238 }
249239
250240
251241
252242 @Callable(i)
253243 func withdrawRewards () = {
254244 let doAckRewards = invoke(this, "ackRewards", nil, nil)
255245 if ((doAckRewards == doAckRewards))
256246 then {
257247 let _staker = toString(i.caller)
258- let $t087538898 = updateReward(_staker, 0)
259- let newRewardPerTokenStored = $t087538898._1
260- let newLastUpdateTime = $t087538898._2
261- let stakerEarned = $t087538898._3
262- let stakerRewardPerTokenPaid = $t087538898._4
248+ let $t086268771 = updateReward(_staker, 0)
249+ let newRewardPerTokenStored = $t086268771._1
250+ let newLastUpdateTime = $t086268771._2
251+ let stakerEarned = $t086268771._3
252+ let stakerRewardPerTokenPaid = $t086268771._4
263253 if (if ((0 >= stakerEarned))
264254 then true
265255 else !(initialized()))
266256 then throw("No farming reward")
267257 else {
268258 let doUnStake = invoke(stakingAddress(), "unStake", [stakerEarned], nil)
269259 if ((doUnStake == doUnStake))
270260 then ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, stakerEarned, governanceAsset())])
271261 else throw("Strict value is not equal to itself.")
272262 }
273263 }
274264 else throw("Strict value is not equal to itself.")
275265 }
276266
277267
278268
279269 @Callable(i)
280270 func ackRewards () = {
281271 let _rewardAmount = invoke(stakingAddress(), "computeReward", [toString(this)], nil)
282272 if ((_rewardAmount == _rewardAmount))
283273 then {
284274 let rewardAmount = match _rewardAmount {
285275 case t: Int =>
286276 t
287277 case _ =>
288278 throw("Reward amount not a number")
289279 }
290280 if (((1 * DECIMAL_UNIT) > rewardAmount))
291281 then nil
292282 else {
293283 let doClaimRewards = invoke(stakingAddress(), "withdrawRewards", nil, nil)
294284 if ((doClaimRewards == doClaimRewards))
295285 then {
296- let rewardsAmount = assetBalance(this, quoteAsset())
297- let doSwap = invoke(swapAddress(), "swap", [toBase58String(governanceAsset()), 0], [AttachedPayment(quoteAsset(), rewardsAmount)])
286+ let rewardsAmount = assetBalance(this, rewardAsset())
287+ let doSwap = invoke(swapAddress(), "swap", [toBase58String(governanceAsset()), 0], [AttachedPayment(rewardAsset(), rewardsAmount)])
298288 if ((doSwap == doSwap))
299289 then {
300290 let rewardDelta = assetBalance(this, governanceAsset())
301291 if ((rewardDelta == rewardDelta))
302292 then if ((0 >= rewardDelta))
303293 then throw("Invalid ackRewards params")
304294 else {
305295 let _reward = rewardDelta
306296 let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
307297 let timestamp = currentTimestampSec()
308298 let newRewardRate = if ((timestamp > periodFinish()))
309299 then (_reward / DURATION)
310300 else {
311301 let remainingTime = (periodFinish() - timestamp)
312302 let leftover = (rewardRate() * remainingTime)
313303 ((_reward + leftover) / DURATION)
314304 }
315305 let doStake = invoke(stakingAddress(), "stake", nil, [AttachedPayment(governanceAsset(), rewardDelta)])
316306 if ((doStake == doStake))
317307 then (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
318308 else throw("Strict value is not equal to itself.")
319309 }
320310 else throw("Strict value is not equal to itself.")
321311 }
322312 else throw("Strict value is not equal to itself.")
323313 }
324314 else throw("Strict value is not equal to itself.")
325315 }
326316 }
327317 else throw("Strict value is not equal to itself.")
328318 }
329319
330320
331321
332322 @Callable(i)
333323 func view_reward (_staker) = {
334324 let stakerEarned = updateReward(_staker, 0)._3
335325 throw(toString(stakerEarned))
336326 }
337327
338328
339329 @Verifier(tx)
340-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
330+func verify () = {
331+ let coordinatorStr = getString(this, k_coordinatorAddress)
332+ if (isDefined(coordinatorStr))
333+ then {
334+ let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
335+ if (isDefined(admin))
336+ then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
337+ else throw("unable to verify: admin not set in coordinator")
338+ }
339+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
340+ }
341341

github/deemru/w8io/873ac7e 
55.36 ms