tx · 3KbZYCQA36nnGQB2svDoNFeEq3eCLMqZJ5o1f4SJBCQV

3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7:  -0.03700000 Waves

2022.10.20 20:22 [2281026] smart account 3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7 > SELF 0.00000000 Waves

{ "type": 13, "id": "3KbZYCQA36nnGQB2svDoNFeEq3eCLMqZJ5o1f4SJBCQV", "fee": 3700000, "feeAssetId": null, "timestamp": 1666286576335, "version": 2, "chainId": 84, "sender": "3N6Zcr1qjgomiWEe9a9smqF4oo5nVAv2Cy7", "senderPublicKey": "28h5rtcro3AxHztuBMn6CFYrRv3hcdjgwkCdSytBSXUH", "proofs": [ "4bY4c7KHU8s5yHSvS5mtC7tyg8nqtE8kJkgRnSJHzivppUunjapXEbNRPXfkzgaRmAjcMduXfRucXBfLfnaXKira" ], "script": "base64:BgIdCAISBAoCCAgSAwoBCBIAEgMKAQESABIAEgMKAQg4AA1rX3RvdGFsU3VwcGx5Ag1rX3RvdGFsU3VwcGx5AA9rX3Jld2FyZEJhbGFuY2UCD2tfcmV3YXJkQmFsYW5jZQANa19zd2FwQWRkcmVzcwINa19zd2FwQWRkcmVzcwAQa19sYXN0VXBkYXRlVGltZQIQa19sYXN0VXBkYXRlVGltZQAWa19yZXdhcmRQZXJUb2tlblN0b3JlZAIWa19yZXdhcmRQZXJUb2tlblN0b3JlZAAMa19yZXdhcmRSYXRlAgxrX3Jld2FyZFJhdGUADmtfcGVyaW9kRmluaXNoAg5rX3BlcmlvZEZpbmlzaAAJa19iYWxhbmNlAglrX2JhbGFuY2UAFGtfdXNlclJld2FyZFBlclRva2VuAhRrX3VzZXJSZXdhcmRQZXJUb2tlbgAMa191c2VyUmV3YXJkAgxrX3VzZXJSZXdhcmQADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwARa19zdGFraW5nX2FkZHJlc3MCEWtfc3Rha2luZ19hZGRyZXNzABJrX2dvdmVybmFuY2VfYXNzZXQCC2tfZ292X2Fzc2V0AA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0ABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEOYWRtaW5QdWJsaWNLZXkACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfYWRtaW5fcHVibGljX2tleQEPZ292ZXJuYW5jZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX2dvdmVybmFuY2VfYXNzZXQBCnF1b3RlQXNzZXQACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFDWtfcXVvdGVfYXNzZXQBDnN0YWtpbmdBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEWtfc3Rha2luZ19hZGRyZXNzAg9TdGFraW5nIG5vdCBzZXQADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCCQBoAgkAaAIACgAKAAoACgAKAAoACgAKAAhEVVJBVElPTgkAaAIJAGgCADwAPAAYAApOT19BRERSRVNTAgAACU5PX1NUQUtFUgAAAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBG1pbnYCAl94Al95AwkAZgIFAl94BQJfeQUCX3kFAl94AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBBGludDABAWsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawAAAQt0b3RhbFN1cHBseQAJAQRpbnQwAQUNa190b3RhbFN1cHBseQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQACQEEaW50MAEFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQBDmxhc3RVcGRhdGVUaW1lAAkBBGludDABBRBrX2xhc3RVcGRhdGVUaW1lAQpyZXdhcmRSYXRlAAkBBGludDABBQxrX3Jld2FyZFJhdGUBDHBlcmlvZEZpbmlzaAAJAQRpbnQwAQUOa19wZXJpb2RGaW5pc2gBDXJld2FyZEJhbGFuY2UACQEEaW50MAEFD2tfcmV3YXJkQmFsYW5jZQELc3dhcEFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDWtfc3dhcEFkZHJlc3MCEE5vdyBzd2FwIGFkZHJlc3MCFEludmFsaWQgc3dhcCBhZGRyZXNzAQdyZXdhcmRzAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgEWdXNlclJld2FyZFBlclRva2VuUGFpZAEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRRrX3VzZXJSZXdhcmRQZXJUb2tlbgUHX3N0YWtlcgEJYmFsYW5jZU9mAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHARN1cGRhdGVSZXdhcmRCYWxhbmNlAQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfcmV3YXJkQmFsYW5jZQkAZAIJAQ1yZXdhcmRCYWxhbmNlAAUGX2RlbHRhBQNuaWwBEHVwZGF0ZVJld2FyZFJhdGUBC19yZXdhcmRSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrX3Jld2FyZFJhdGUFC19yZXdhcmRSYXRlBQNuaWwBCnVwZGF0ZVRpbWUCD19sYXN0VXBkYXRlVGltZQ1fcGVyaW9kRmluaXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX2xhc3RVcGRhdGVUaW1lBQ9fbGFzdFVwZGF0ZVRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtfcGVyaW9kRmluaXNoBQ1fcGVyaW9kRmluaXNoBQNuaWwBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkARVfcmV3YXJkUGVyVG9rZW5TdG9yZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQFFV9yZXdhcmRQZXJUb2tlblN0b3JlZAUDbmlsARF1cGRhdGVVc2VyUmV3YXJkcwMHX3N0YWtlcgdfcmV3YXJkE191c2VyUmV3YXJkUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgUHX3Jld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa191c2VyUmV3YXJkUGVyVG9rZW4FB19zdGFrZXIFE191c2VyUmV3YXJkUGVyVG9rZW4FA25pbAENdXBkYXRlQmFsYW5jZQIHX3N0YWtlcgZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgkAZAIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfdG90YWxTdXBwbHkJAGQCCQELdG90YWxTdXBwbHkABQZfZGVsdGEFA25pbAETY3VycmVudFRpbWVzdGFtcFNlYwAJAGkCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcADoBwEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBBG1pbnYCCQETY3VycmVudFRpbWVzdGFtcFNlYwAJAQxwZXJpb2RGaW5pc2gAAQ5yZXdhcmRQZXJUb2tlbgENX2JhbGFuY2VEZWx0YQMJAAACCQBkAgkBC3RvdGFsU3VwcGx5AAUNX2JhbGFuY2VEZWx0YQAACQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQABAx0aW1lSW50ZXJ2YWwJAGUCCQEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBDmxhc3RVcGRhdGVUaW1lAAQSYWN0dWFsVGltZUludGVydmFsAwkAZgIAAAUMdGltZUludGVydmFsAAAFDHRpbWVJbnRlcnZhbAQEZGlmZgkBBGRpdmQCCQBoAgkBCnJld2FyZFJhdGUABRJhY3R1YWxUaW1lSW50ZXJ2YWwJAGQCCQELdG90YWxTdXBwbHkABQ1fYmFsYW5jZURlbHRhCQBkAgkBFHJld2FyZFBlclRva2VuU3RvcmVkAAUEZGlmZgEGZWFybmVkAgdfc3Rha2VyDV9iYWxhbmNlRGVsdGEEC3Jld2FyZERlbHRhCQBlAgkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQkBFnVzZXJSZXdhcmRQZXJUb2tlblBhaWQBBQdfc3Rha2VyCQBkAgkBBG11bGQCCQBkAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFC3Jld2FyZERlbHRhCQEHcmV3YXJkcwEFB19zdGFrZXIBDHVwZGF0ZVJld2FyZAIHX3N0YWtlcg1fYmFsYW5jZURlbHRhBBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQQRbmV3TGFzdFVwZGF0ZVRpbWUJARNjdXJyZW50VGltZXN0YW1wU2VjAAQLJHQwNTIwNTUzOTcDCQECIT0CBQdfc3Rha2VyAgAJAJQKAgkBBmVhcm5lZAIFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQCUCgIAAAAABAxzdGFrZXJFYXJuZWQIBQskdDA1MjA1NTM5NwJfMQQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNTIwNTUzOTcCXzIJAJYKBAUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQFEW5ld0xhc3RVcGRhdGVUaW1lBQxzdGFrZXJFYXJuZWQFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAcBaQEKaW5pdGlhbGl6ZQIMX2Nvb3JkaW5hdG9yDF9zd2FwQWRkcmVzcwMJAQtpbml0aWFsaXplZAAJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa19zd2FwQWRkcmVzcwUMX3N3YXBBZGRyZXNzCQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgUDbmlsAWkBB3NldFN3YXABDF9zd2FwQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHNldFN3YXAgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfc3dhcEFkZHJlc3MFDF9zd2FwQWRkcmVzcwUDbmlsAWkBBXN0YWtlAAQHX3N0YWtlcgkApQgBCAUBaQZjYWxsZXIEB19hbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBD2dvdmVybmFuY2VBc3NldAAGCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAhZJbnZhbGlkIGNhbGwgdG8gIHN0YWtlBAskdDA2MzM5NjUwNAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQskdDA2MzM5NjUwNAJfMQQRbmV3TGFzdFVwZGF0ZVRpbWUIBQskdDA2MzM5NjUwNAJfMgQMc3Rha2VyRWFybmVkCAULJHQwNjMzOTY1MDQCXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFCyR0MDYzMzk2NTA0Al80BAdkb1N0YWtlCQD8BwQJAQ5zdGFraW5nQWRkcmVzcwACBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ9nb3Zlcm5hbmNlQXNzZXQABQdfYW1vdW50BQNuaWwDCQAAAgUHZG9TdGFrZQUHZG9TdGFrZQkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgUMc3Rha2VyRWFybmVkBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBDXVwZGF0ZUJhbGFuY2UCBQdfc3Rha2VyBQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VuU3Rha2UBB19hbW91bnQEDGRvQWNrUmV3YXJkcwkA/AcEBQR0aGlzAgphY2tSZXdhcmRzBQNuaWwFA25pbAMJAAACBQxkb0Fja1Jld2FyZHMFDGRvQWNrUmV3YXJkcwQHX3N0YWtlcgkApQgBCAUBaQZjYWxsZXIDAwkBAiE9AggFAWkIcGF5bWVudHMFA25pbAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECGkludmFsaWQgdW5TdGFrZSBwYXJhbWV0ZXJzBAskdDA3MjUwNzQxNQkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQskdDA3MjUwNzQxNQJfMQQRbmV3TGFzdFVwZGF0ZVRpbWUIBQskdDA3MjUwNzQxNQJfMgQMc3Rha2VyRWFybmVkCAULJHQwNzI1MDc0MTUCXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFCyR0MDcyNTA3NDE1Al80AwkAZgIFB19hbW91bnQJAGQCCQEJYmFsYW5jZU9mAQUHX3N0YWtlcgUMc3Rha2VyRWFybmVkCQACAQIaSW52YWxpZCB1blN0YWtlIHBhcmFtZXRlcnMECWRvVW5TdGFrZQkA/AcECQEOc3Rha2luZ0FkZHJlc3MAAgd1blN0YWtlCQDMCAIFB19hbW91bnQFA25pbAUDbmlsAwkAAAIFCWRvVW5TdGFrZQUJZG9VblN0YWtlBAxyZXdhcmRDaGFuZ2UDCQBnAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFB19hbW91bnQAAAkAZQIFB19hbW91bnQJAQliYWxhbmNlT2YBBQdfc3Rha2VyBA1iYWxhbmNlQ2hhbmdlAwkAZwIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQdfYW1vdW50BQdfYW1vdW50CQEJYmFsYW5jZU9mAQUHX3N0YWtlcgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARF1cGRhdGVVc2VyUmV3YXJkcwMFB19zdGFrZXIJAGUCBQxzdGFrZXJFYXJuZWQFDHJld2FyZENoYW5nZQUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBCnVwZGF0ZVRpbWUCBRFuZXdMYXN0VXBkYXRlVGltZQkBDHBlcmlvZEZpbmlzaAAJAQ11cGRhdGVCYWxhbmNlAgUHX3N0YWtlcgkBAS0BBQ1iYWxhbmNlQ2hhbmdlCQETdXBkYXRlUmV3YXJkQmFsYW5jZQEJAQEtAQUMcmV3YXJkQ2hhbmdlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHX2Ftb3VudAkBD2dvdmVybmFuY2VBc3NldAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ93aXRoZHJhd1Jld2FyZHMABAxkb0Fja1Jld2FyZHMJAPwHBAUEdGhpcwIKYWNrUmV3YXJkcwUDbmlsBQNuaWwDCQAAAgUMZG9BY2tSZXdhcmRzBQxkb0Fja1Jld2FyZHMEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyBAskdDA4NzUzODg5OAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQskdDA4NzUzODg5OAJfMQQRbmV3TGFzdFVwZGF0ZVRpbWUIBQskdDA4NzUzODg5OAJfMgQMc3Rha2VyRWFybmVkCAULJHQwODc1Mzg4OTgCXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFCyR0MDg3NTM4ODk4Al80AwMJAGcCAAAFDHN0YWtlckVhcm5lZAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECEU5vIGZhcm1pbmcgcmV3YXJkBAlkb1VuU3Rha2UJAPwHBAkBDnN0YWtpbmdBZGRyZXNzAAIHdW5TdGFrZQkAzAgCBQxzdGFrZXJFYXJuZWQFA25pbAUDbmlsAwkAAAIFCWRvVW5TdGFrZQUJZG9VblN0YWtlCQDOCAIJAM4IAgkAzggCCQDOCAIJARF1cGRhdGVVc2VyUmV3YXJkcwMFB19zdGFrZXIAAAUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBCnVwZGF0ZVRpbWUCBRFuZXdMYXN0VXBkYXRlVGltZQkBDHBlcmlvZEZpbmlzaAAJARN1cGRhdGVSZXdhcmRCYWxhbmNlAQkBAS0BBQxzdGFrZXJFYXJuZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQxzdGFrZXJFYXJuZWQJAQ9nb3Zlcm5hbmNlQXNzZXQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWNrUmV3YXJkcwAEDV9yZXdhcmRBbW91bnQJAPwHBAkBDnN0YWtpbmdBZGRyZXNzAAINY29tcHV0ZVJld2FyZAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFDV9yZXdhcmRBbW91bnQFDV9yZXdhcmRBbW91bnQEDHJld2FyZEFtb3VudAQHJG1hdGNoMAUNX3Jld2FyZEFtb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhpSZXdhcmQgYW1vdW50IG5vdCBhIG51bWJlcgMJAGYCCQBoAgABBQxERUNJTUFMX1VOSVQFDHJld2FyZEFtb3VudAUDbmlsBA5kb0NsYWltUmV3YXJkcwkA/AcECQEOc3Rha2luZ0FkZHJlc3MAAg93aXRoZHJhd1Jld2FyZHMFA25pbAUDbmlsAwkAAAIFDmRvQ2xhaW1SZXdhcmRzBQ5kb0NsYWltUmV3YXJkcwQNcmV3YXJkc0Ftb3VudAkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAAEBmRvU3dhcAkA/AcECQELc3dhcEFkZHJlc3MAAgRzd2FwCQDMCAIJANgEAQkBD2dvdmVybmFuY2VBc3NldAAJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUNcmV3YXJkc0Ftb3VudAUDbmlsAwkAAAIFBmRvU3dhcAUGZG9Td2FwBAtyZXdhcmREZWx0YQkA8AcCBQR0aGlzCQEPZ292ZXJuYW5jZUFzc2V0AAMJAAACBQtyZXdhcmREZWx0YQULcmV3YXJkRGVsdGEDCQBnAgAABQtyZXdhcmREZWx0YQkAAgECGUludmFsaWQgYWNrUmV3YXJkcyBwYXJhbXMEB19yZXdhcmQFC3Jld2FyZERlbHRhBBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgJAQx1cGRhdGVSZXdhcmQCBQpOT19BRERSRVNTBQlOT19TVEFLRVICXzEECXRpbWVzdGFtcAkBE2N1cnJlbnRUaW1lc3RhbXBTZWMABA1uZXdSZXdhcmRSYXRlAwkAZgIFCXRpbWVzdGFtcAkBDHBlcmlvZEZpbmlzaAAJAGkCBQdfcmV3YXJkBQhEVVJBVElPTgQNcmVtYWluaW5nVGltZQkAZQIJAQxwZXJpb2RGaW5pc2gABQl0aW1lc3RhbXAECGxlZnRvdmVyCQBoAgkBCnJld2FyZFJhdGUABQ1yZW1haW5pbmdUaW1lCQBpAgkAZAIFB19yZXdhcmQFCGxlZnRvdmVyBQhEVVJBVElPTgQHZG9TdGFrZQkA/AcECQEOc3Rha2luZ0FkZHJlc3MAAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEPZ292ZXJuYW5jZUFzc2V0AAULcmV3YXJkRGVsdGEFA25pbAMJAAACBQdkb1N0YWtlBQdkb1N0YWtlCQDOCAIJAM4IAgkAzggCCQEQdXBkYXRlUmV3YXJkUmF0ZQEFDW5ld1Jld2FyZFJhdGUJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQETdXBkYXRlUmV3YXJkQmFsYW5jZQEFB19yZXdhcmQJAQp1cGRhdGVUaW1lAgUJdGltZXN0YW1wCQBkAgUJdGltZXN0YW1wBQhEVVJBVElPTgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2aWV3X3Jld2FyZAEHX3N0YWtlcgQMc3Rha2VyRWFybmVkCAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAJfMwkAAgEJAKQDAQUMc3Rha2VyRWFybmVkAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkBDmFkbWluUHVibGljS2V5APZeZS8=", "height": 2281026, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7XZB6r1pMVQaeu9zVoSbahM4RdM45hnzaafa6SKWoQ8v Next: 37jRApP3K7dZ2UYb7CKEU2xdcwKTEP7yZZLhXyBmc2Ky Diff:
OldNewDifferences
287287 case _ =>
288288 throw("Reward amount not a number")
289289 }
290- if ((rewardAmount == 0))
290+ if (((1 * DECIMAL_UNIT) > rewardAmount))
291291 then nil
292292 else {
293293 let doClaimRewards = invoke(stakingAddress(), "withdrawRewards", nil, nil)
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_swapAddress = "k_swapAddress"
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
3232 let k_quote_asset = "k_quote_asset"
3333
3434 let k_admin_public_key = "k_admin_public_key"
3535
3636 let k_admin_address = "k_admin_address"
3737
3838 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
3939
4040
4141 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
4242
4343
4444 func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
4545
4646
4747 func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
4848
4949
5050 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
5151
5252
5353 func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Staking not set")
5454
5555
5656 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
5757
5858 let DURATION = ((60 * 60) * 24)
5959
6060 let NO_ADDRESS = ""
6161
6262 let NO_STAKER = 0
6363
6464 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
6565
6666
6767 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6868
6969
7070 func abs (_x) = if ((_x > 0))
7171 then _x
7272 else -(_x)
7373
7474
7575 func minv (_x,_y) = if ((_x > _y))
7676 then _y
7777 else _x
7878
7979
8080 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
8181
8282
8383 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
8484
8585
8686 func int0 (k) = valueOrElse(getInteger(this, k), 0)
8787
8888
8989 func totalSupply () = int0(k_totalSupply)
9090
9191
9292 func rewardPerTokenStored () = int0(k_rewardPerTokenStored)
9393
9494
9595 func lastUpdateTime () = int0(k_lastUpdateTime)
9696
9797
9898 func rewardRate () = int0(k_rewardRate)
9999
100100
101101 func periodFinish () = int0(k_periodFinish)
102102
103103
104104 func rewardBalance () = int0(k_rewardBalance)
105105
106106
107107 func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_swapAddress), "Now swap address")), "Invalid swap address")
108108
109109
110110 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
111111
112112
113113 func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
114114
115115
116116 func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
117117
118118
119119 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
120120
121121
122122 func updateRewardBalance (_delta) = [IntegerEntry(k_rewardBalance, (rewardBalance() + _delta))]
123123
124124
125125 func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
126126
127127
128128 func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
129129
130130
131131 func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
132132
133133
134134 func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
135135
136136
137137 func updateBalance (_staker,_delta) = [IntegerEntry(toCompositeKey(k_balance, _staker), (balanceOf(_staker) + _delta)), IntegerEntry(k_totalSupply, (totalSupply() + _delta))]
138138
139139
140140 func currentTimestampSec () = (lastBlock.timestamp / 1000)
141141
142142
143143 func lastTimeRewardApplicable () = minv(currentTimestampSec(), periodFinish())
144144
145145
146146 func rewardPerToken (_balanceDelta) = if (((totalSupply() + _balanceDelta) == 0))
147147 then rewardPerTokenStored()
148148 else {
149149 let timeInterval = (lastTimeRewardApplicable() - lastUpdateTime())
150150 let actualTimeInterval = if ((0 > timeInterval))
151151 then 0
152152 else timeInterval
153153 let diff = divd((rewardRate() * actualTimeInterval), (totalSupply() + _balanceDelta))
154154 (rewardPerTokenStored() + diff)
155155 }
156156
157157
158158 func earned (_staker,_balanceDelta) = {
159159 let rewardDelta = (rewardPerToken(_balanceDelta) - userRewardPerTokenPaid(_staker))
160160 (muld((balanceOf(_staker) + _balanceDelta), rewardDelta) + rewards(_staker))
161161 }
162162
163163
164164 func updateReward (_staker,_balanceDelta) = {
165165 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
166166 let newLastUpdateTime = currentTimestampSec()
167167 let $t052055397 = if ((_staker != ""))
168168 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
169169 else $Tuple2(0, 0)
170170 let stakerEarned = $t052055397._1
171171 let stakerRewardPerTokenPaid = $t052055397._2
172172 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
173173 }
174174
175175
176176 @Callable(i)
177177 func initialize (_coordinator,_swapAddress) = if (initialized())
178178 then throw("Already initialized")
179179 else [StringEntry(k_coordinatorAddress, _coordinator), StringEntry(k_swapAddress, _swapAddress), BooleanEntry(k_initialized, true)]
180180
181181
182182
183183 @Callable(i)
184184 func setSwap (_swapAddress) = if ((i.caller != adminAddress()))
185185 then throw("Invalid setSwap params")
186186 else [StringEntry(k_swapAddress, _swapAddress)]
187187
188188
189189
190190 @Callable(i)
191191 func stake () = {
192192 let _staker = toString(i.caller)
193193 let _amount = i.payments[0].amount
194194 if (if ((i.payments[0].assetId != governanceAsset()))
195195 then true
196196 else !(initialized()))
197197 then throw("Invalid call to stake")
198198 else {
199199 let $t063396504 = updateReward(_staker, 0)
200200 let newRewardPerTokenStored = $t063396504._1
201201 let newLastUpdateTime = $t063396504._2
202202 let stakerEarned = $t063396504._3
203203 let stakerRewardPerTokenPaid = $t063396504._4
204204 let doStake = invoke(stakingAddress(), "stake", nil, [AttachedPayment(governanceAsset(), _amount)])
205205 if ((doStake == doStake))
206206 then (((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
207207 else throw("Strict value is not equal to itself.")
208208 }
209209 }
210210
211211
212212
213213 @Callable(i)
214214 func unStake (_amount) = {
215215 let doAckRewards = invoke(this, "ackRewards", nil, nil)
216216 if ((doAckRewards == doAckRewards))
217217 then {
218218 let _staker = toString(i.caller)
219219 if (if ((i.payments != nil))
220220 then true
221221 else !(initialized()))
222222 then throw("Invalid unStake parameters")
223223 else {
224224 let $t072507415 = updateReward(_staker, 0)
225225 let newRewardPerTokenStored = $t072507415._1
226226 let newLastUpdateTime = $t072507415._2
227227 let stakerEarned = $t072507415._3
228228 let stakerRewardPerTokenPaid = $t072507415._4
229229 if ((_amount > (balanceOf(_staker) + stakerEarned)))
230230 then throw("Invalid unStake parameters")
231231 else {
232232 let doUnStake = invoke(stakingAddress(), "unStake", [_amount], nil)
233233 if ((doUnStake == doUnStake))
234234 then {
235235 let rewardChange = if ((balanceOf(_staker) >= _amount))
236236 then 0
237237 else (_amount - balanceOf(_staker))
238238 let balanceChange = if ((balanceOf(_staker) >= _amount))
239239 then _amount
240240 else balanceOf(_staker)
241241 (((((updateUserRewards(_staker, (stakerEarned - rewardChange), stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(balanceChange))) ++ updateRewardBalance(-(rewardChange))) ++ [ScriptTransfer(i.caller, _amount, governanceAsset())])
242242 }
243243 else throw("Strict value is not equal to itself.")
244244 }
245245 }
246246 }
247247 else throw("Strict value is not equal to itself.")
248248 }
249249
250250
251251
252252 @Callable(i)
253253 func withdrawRewards () = {
254254 let doAckRewards = invoke(this, "ackRewards", nil, nil)
255255 if ((doAckRewards == doAckRewards))
256256 then {
257257 let _staker = toString(i.caller)
258258 let $t087538898 = updateReward(_staker, 0)
259259 let newRewardPerTokenStored = $t087538898._1
260260 let newLastUpdateTime = $t087538898._2
261261 let stakerEarned = $t087538898._3
262262 let stakerRewardPerTokenPaid = $t087538898._4
263263 if (if ((0 >= stakerEarned))
264264 then true
265265 else !(initialized()))
266266 then throw("No farming reward")
267267 else {
268268 let doUnStake = invoke(stakingAddress(), "unStake", [stakerEarned], nil)
269269 if ((doUnStake == doUnStake))
270270 then ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, stakerEarned, governanceAsset())])
271271 else throw("Strict value is not equal to itself.")
272272 }
273273 }
274274 else throw("Strict value is not equal to itself.")
275275 }
276276
277277
278278
279279 @Callable(i)
280280 func ackRewards () = {
281281 let _rewardAmount = invoke(stakingAddress(), "computeReward", [toString(this)], nil)
282282 if ((_rewardAmount == _rewardAmount))
283283 then {
284284 let rewardAmount = match _rewardAmount {
285285 case t: Int =>
286286 t
287287 case _ =>
288288 throw("Reward amount not a number")
289289 }
290- if ((rewardAmount == 0))
290+ if (((1 * DECIMAL_UNIT) > rewardAmount))
291291 then nil
292292 else {
293293 let doClaimRewards = invoke(stakingAddress(), "withdrawRewards", nil, nil)
294294 if ((doClaimRewards == doClaimRewards))
295295 then {
296296 let rewardsAmount = assetBalance(this, quoteAsset())
297297 let doSwap = invoke(swapAddress(), "swap", [toBase58String(governanceAsset()), 0], [AttachedPayment(quoteAsset(), rewardsAmount)])
298298 if ((doSwap == doSwap))
299299 then {
300300 let rewardDelta = assetBalance(this, governanceAsset())
301301 if ((rewardDelta == rewardDelta))
302302 then if ((0 >= rewardDelta))
303303 then throw("Invalid ackRewards params")
304304 else {
305305 let _reward = rewardDelta
306306 let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
307307 let timestamp = currentTimestampSec()
308308 let newRewardRate = if ((timestamp > periodFinish()))
309309 then (_reward / DURATION)
310310 else {
311311 let remainingTime = (periodFinish() - timestamp)
312312 let leftover = (rewardRate() * remainingTime)
313313 ((_reward + leftover) / DURATION)
314314 }
315315 let doStake = invoke(stakingAddress(), "stake", nil, [AttachedPayment(governanceAsset(), rewardDelta)])
316316 if ((doStake == doStake))
317317 then (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
318318 else throw("Strict value is not equal to itself.")
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326 }
327327 else throw("Strict value is not equal to itself.")
328328 }
329329
330330
331331
332332 @Callable(i)
333333 func view_reward (_staker) = {
334334 let stakerEarned = updateReward(_staker, 0)._3
335335 throw(toString(stakerEarned))
336336 }
337337
338338
339339 @Verifier(tx)
340340 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
341341

github/deemru/w8io/873ac7e 
37.45 ms