tx · FapxiD4nrDusFaZ71aW2KmSss2GQFYW9bBoyTnWNXsdH

3N6btuDfXTh8F6rcCbpuevwjxv78VSjwy1g:  -0.03700000 Waves

2022.10.06 10:19 [2260148] smart account 3N6btuDfXTh8F6rcCbpuevwjxv78VSjwy1g > SELF 0.00000000 Waves

{ "type": 13, "id": "FapxiD4nrDusFaZ71aW2KmSss2GQFYW9bBoyTnWNXsdH", "fee": 3700000, "feeAssetId": null, "timestamp": 1665040856916, "version": 2, "chainId": 84, "sender": "3N6btuDfXTh8F6rcCbpuevwjxv78VSjwy1g", "senderPublicKey": "hJkk5tHmPi9MxaRx78ukB4hcN5qJ2csYAuNxdNix7yB", "proofs": [ "5KbbGTsuxSQN4ciYACwLFEc4KErWwJuBUP7mhNHiYXJFvAXDGkKyBUsRm9Ks3ktUgHssKAN2hkGiKJJQaNVjt5cx" ], "script": "base64:BgIgCAISAwoBCBIAEgMKAQESABIAEgASAwoBCBIDCgEIEgA2AA1rX3RvdGFsU3VwcGx5Ag1rX3RvdGFsU3VwcGx5AA9rX3Jld2FyZEJhbGFuY2UCD2tfcmV3YXJkQmFsYW5jZQAQa19sYXN0VXBkYXRlVGltZQIQa19sYXN0VXBkYXRlVGltZQAWa19yZXdhcmRQZXJUb2tlblN0b3JlZAIWa19yZXdhcmRQZXJUb2tlblN0b3JlZAAMa19yZXdhcmRSYXRlAgxrX3Jld2FyZFJhdGUADmtfcGVyaW9kRmluaXNoAg5rX3BlcmlvZEZpbmlzaAAJa19iYWxhbmNlAglrX2JhbGFuY2UAFGtfdXNlclJld2FyZFBlclRva2VuAhRrX3VzZXJSZXdhcmRQZXJUb2tlbgAMa191c2VyUmV3YXJkAgxrX3VzZXJSZXdhcmQADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwASa19nb3Zlcm5hbmNlX2Fzc2V0AgtrX2dvdl9hc3NldAANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAASa19hZG1pbl9wdWJsaWNfa2V5AhJrX2FkbWluX3B1YmxpY19rZXkAEWtfbWFuYWdlcl9hZGRyZXNzAhFrX21hbmFnZXJfYWRkcmVzcwELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBDmFkbWluUHVibGljS2V5AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX2FkbWluX3B1YmxpY19rZXkBD2dvdmVybmFuY2VBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19nb3Zlcm5hbmNlX2Fzc2V0AQpxdW90ZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ1rX3F1b3RlX2Fzc2V0AQ5tYW5hZ2VyQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRFrX21hbmFnZXJfYWRkcmVzcwIPTWFuYWdlciBub3Qgc2V0AAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAAoACgAIRFVSQVRJT04JAGgCCQBoAgA8ADwAGAAKTk9fQUREUkVTUwIAAAlOT19TVEFLRVIAAAEQdXNkbkZyb21EZWNpbWFscwEHX2Ftb3VudAkAaQIFB19hbW91bnQAZAEOdXNkblRvRGVjaW1hbHMBB19hbW91bnQJAGgCBQdfYW1vdW50AGQBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEbWludgICX3gCX3kDCQBmAgUCX3gFAl95BQJfeQUCX3gBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBA2ludAEBawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAWsJAKwCAgINbm8gdmFsdWUgZm9yIAUBawEEaW50MAEBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrAAABC3RvdGFsU3VwcGx5AAkBBGludDABBQ1rX3RvdGFsU3VwcGx5ARRyZXdhcmRQZXJUb2tlblN0b3JlZAAJAQRpbnQwAQUWa19yZXdhcmRQZXJUb2tlblN0b3JlZAEObGFzdFVwZGF0ZVRpbWUACQEEaW50MAEFEGtfbGFzdFVwZGF0ZVRpbWUBCnJld2FyZFJhdGUACQEEaW50MAEFDGtfcmV3YXJkUmF0ZQEMcGVyaW9kRmluaXNoAAkBBGludDABBQ5rX3BlcmlvZEZpbmlzaAENcmV3YXJkQmFsYW5jZQAJAQRpbnQwAQUPa19yZXdhcmRCYWxhbmNlAQdyZXdhcmRzAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgEWdXNlclJld2FyZFBlclRva2VuUGFpZAEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRRrX3VzZXJSZXdhcmRQZXJUb2tlbgUHX3N0YWtlcgEJYmFsYW5jZU9mAQdfc3Rha2VyCQEEaW50MAEJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHARN1cGRhdGVSZXdhcmRCYWxhbmNlAQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfcmV3YXJkQmFsYW5jZQkAZAIJAQ1yZXdhcmRCYWxhbmNlAAUGX2RlbHRhBQNuaWwBEHVwZGF0ZVJld2FyZFJhdGUBC19yZXdhcmRSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrX3Jld2FyZFJhdGUFC19yZXdhcmRSYXRlBQNuaWwBCnVwZGF0ZVRpbWUCD19sYXN0VXBkYXRlVGltZQ1fcGVyaW9kRmluaXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX2xhc3RVcGRhdGVUaW1lBQ9fbGFzdFVwZGF0ZVRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtfcGVyaW9kRmluaXNoBQ1fcGVyaW9kRmluaXNoBQNuaWwBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkARVfcmV3YXJkUGVyVG9rZW5TdG9yZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQFFV9yZXdhcmRQZXJUb2tlblN0b3JlZAUDbmlsARF1cGRhdGVVc2VyUmV3YXJkcwMHX3N0YWtlcgdfcmV3YXJkE191c2VyUmV3YXJkUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdXNlclJld2FyZAUHX3N0YWtlcgUHX3Jld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa191c2VyUmV3YXJkUGVyVG9rZW4FB19zdGFrZXIFE191c2VyUmV3YXJkUGVyVG9rZW4FA25pbAENdXBkYXRlQmFsYW5jZQIHX3N0YWtlcgZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFCWtfYmFsYW5jZQUHX3N0YWtlcgkAZAIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQZfZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfdG90YWxTdXBwbHkJAGQCCQELdG90YWxTdXBwbHkABQZfZGVsdGEFA25pbAETY3VycmVudFRpbWVzdGFtcFNlYwAJAGkCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcADoBwEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBBG1pbnYCCQETY3VycmVudFRpbWVzdGFtcFNlYwAJAQxwZXJpb2RGaW5pc2gAAQ5yZXdhcmRQZXJUb2tlbgENX2JhbGFuY2VEZWx0YQMJAAACCQBkAgkBC3RvdGFsU3VwcGx5AAUNX2JhbGFuY2VEZWx0YQAACQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQABAx0aW1lSW50ZXJ2YWwJAGUCCQEYbGFzdFRpbWVSZXdhcmRBcHBsaWNhYmxlAAkBDmxhc3RVcGRhdGVUaW1lAAQSYWN0dWFsVGltZUludGVydmFsAwkAZgIAAAUMdGltZUludGVydmFsAAAFDHRpbWVJbnRlcnZhbAQEZGlmZgkBBGRpdmQCCQBoAgkBCnJld2FyZFJhdGUABRJhY3R1YWxUaW1lSW50ZXJ2YWwJAGQCCQELdG90YWxTdXBwbHkABQ1fYmFsYW5jZURlbHRhCQBkAgkBFHJld2FyZFBlclRva2VuU3RvcmVkAAUEZGlmZgEGZWFybmVkAgdfc3Rha2VyDV9iYWxhbmNlRGVsdGEEC3Jld2FyZERlbHRhCQBlAgkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQkBFnVzZXJSZXdhcmRQZXJUb2tlblBhaWQBBQdfc3Rha2VyCQBkAgkBBG11bGQCCQBkAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFC3Jld2FyZERlbHRhCQEHcmV3YXJkcwEFB19zdGFrZXIBDHVwZGF0ZVJld2FyZAIHX3N0YWtlcg1fYmFsYW5jZURlbHRhBBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBDnJld2FyZFBlclRva2VuAQUNX2JhbGFuY2VEZWx0YQQRbmV3TGFzdFVwZGF0ZVRpbWUJARNjdXJyZW50VGltZXN0YW1wU2VjAAQLJHQwNTAyMDUyMTIDCQECIT0CBQdfc3Rha2VyAgAJAJQKAgkBBmVhcm5lZAIFB19zdGFrZXIFDV9iYWxhbmNlRGVsdGEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQCUCgIAAAAABAxzdGFrZXJFYXJuZWQIBQskdDA1MDIwNTIxMgJfMQQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNTAyMDUyMTICXzIJAJYKBAUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQFEW5ld0xhc3RVcGRhdGVUaW1lBQxzdGFrZXJFYXJuZWQFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBaQEKaW5pdGlhbGl6ZQEMX2Nvb3JkaW5hdG9yAwkBC2luaXRpYWxpemVkAAkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MFDF9jb29yZGluYXRvcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpAQVzdGFrZQAEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyBAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQ9nb3Zlcm5hbmNlQXNzZXQABgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIWSW52YWxpZCBjYWxsIHRvICBzdGFrZQQLJHQwNTg2ODYwMzMJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAAEF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCAULJHQwNTg2ODYwMzMCXzEEEW5ld0xhc3RVcGRhdGVUaW1lCAULJHQwNTg2ODYwMzMCXzIEDHN0YWtlckVhcm5lZAgFCyR0MDU4Njg2MDMzAl8zBBhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQIBQskdDA1ODY4NjAzMwJfNAkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgUMc3Rha2VyRWFybmVkBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBDXVwZGF0ZUJhbGFuY2UCBQdfc3Rha2VyBQdfYW1vdW50AWkBB3VuU3Rha2UBB19hbW91bnQEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyAwMDCQBmAgUHX2Ftb3VudAkBCWJhbGFuY2VPZgEFB19zdGFrZXIGCQECIT0CCAUBaQhwYXltZW50cwUDbmlsBgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIaSW52YWxpZCB1blN0YWtlIHBhcmFtZXRlcnMECyR0MDY1NjQ2NzI5CQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFCyR0MDY1NjQ2NzI5Al8xBBFuZXdMYXN0VXBkYXRlVGltZQgFCyR0MDY1NjQ2NzI5Al8yBAxzdGFrZXJFYXJuZWQIBQskdDA2NTY0NjcyOQJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAULJHQwNjU2NDY3MjkCXzQJAM4IAgkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgUMc3Rha2VyRWFybmVkBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBDXVwZGF0ZUJhbGFuY2UCBQdfc3Rha2VyCQEBLQEFB19hbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdfYW1vdW50CQEPZ292ZXJuYW5jZUFzc2V0AAUDbmlsAWkBD3dpdGhkcmF3UmV3YXJkcwAEB19zdGFrZXIJAKUIAQgFAWkGY2FsbGVyBAskdDA3MjA1NzM1MAkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQskdDA3MjA1NzM1MAJfMQQRbmV3TGFzdFVwZGF0ZVRpbWUIBQskdDA3MjA1NzM1MAJfMgQMc3Rha2VyRWFybmVkCAULJHQwNzIwNTczNTACXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFCyR0MDcyMDU3MzUwAl80AwMJAGcCAAAFDHN0YWtlckVhcm5lZAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECCU5vIHJld2FyZAQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAkAzAgCCQEQdXNkbkZyb21EZWNpbWFscwEFDHN0YWtlckVhcm5lZAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQDOCAIJAM4IAgkAzggCCQERdXBkYXRlVXNlclJld2FyZHMDBQdfc3Rha2VyAAAFGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAkBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAQUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQp1cGRhdGVUaW1lAgURbmV3TGFzdFVwZGF0ZVRpbWUJAQxwZXJpb2RGaW5pc2gACQETdXBkYXRlUmV3YXJkQmFsYW5jZQEJAQEtAQUMc3Rha2VyRWFybmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkBEHVzZG5Gcm9tRGVjaW1hbHMBBQxzdGFrZXJFYXJuZWQJAQpxdW90ZUFzc2V0AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmFkZFJld2FyZHMAAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnF1b3RlQXNzZXQABgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIZSW52YWxpZCBhZGRSZXdhcmRzIHBhcmFtcwQHX3Jld2FyZAkBDnVzZG5Ub0RlY2ltYWxzAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEBXN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQACQEQdXNkbkZyb21EZWNpbWFscwEFB19yZXdhcmQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCAkBDHVwZGF0ZVJld2FyZAIFCk5PX0FERFJFU1MFCU5PX1NUQUtFUgJfMQQJdGltZXN0YW1wCQETY3VycmVudFRpbWVzdGFtcFNlYwAEDW5ld1Jld2FyZFJhdGUDCQBmAgUJdGltZXN0YW1wCQEMcGVyaW9kRmluaXNoAAkAaQIFB19yZXdhcmQFCERVUkFUSU9OBA1yZW1haW5pbmdUaW1lCQBlAgkBDHBlcmlvZEZpbmlzaAAFCXRpbWVzdGFtcAQIbGVmdG92ZXIJAGgCCQEKcmV3YXJkUmF0ZQAFDXJlbWFpbmluZ1RpbWUJAGkCCQBkAgUHX3Jld2FyZAUIbGVmdG92ZXIFCERVUkFUSU9OCQDOCAIJAM4IAgkAzggCCQEQdXBkYXRlUmV3YXJkUmF0ZQEFDW5ld1Jld2FyZFJhdGUJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQETdXBkYXRlUmV3YXJkQmFsYW5jZQEFB19yZXdhcmQJAQp1cGRhdGVUaW1lAgUJdGltZXN0YW1wCQBkAgUJdGltZXN0YW1wBQhEVVJBVElPTgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQphY2tSZXdhcmRzAAQOY3VycmVudEJhbGFuY2UJAQ51c2RuVG9EZWNpbWFscwEJAPAHAgUEdGhpcwkBCnF1b3RlQXNzZXQABA5fcmV3YXJkQmFsYW5jZQkBDXJld2FyZEJhbGFuY2UABAtyZXdhcmREZWx0YQkAZQIFDmN1cnJlbnRCYWxhbmNlBQ5fcmV3YXJkQmFsYW5jZQMJAGcCAAAFC3Jld2FyZERlbHRhCQACAQIZSW52YWxpZCBhY2tSZXdhcmRzIHBhcmFtcwQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJARB1c2RuRnJvbURlY2ltYWxzAQULcmV3YXJkRGVsdGEFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEB19yZXdhcmQFC3Jld2FyZERlbHRhBBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgJAQx1cGRhdGVSZXdhcmQCBQpOT19BRERSRVNTBQlOT19TVEFLRVICXzEECXRpbWVzdGFtcAkBE2N1cnJlbnRUaW1lc3RhbXBTZWMABA1uZXdSZXdhcmRSYXRlAwkAZgIFCXRpbWVzdGFtcAkBDHBlcmlvZEZpbmlzaAAJAGkCBQdfcmV3YXJkBQhEVVJBVElPTgQNcmVtYWluaW5nVGltZQkAZQIJAQxwZXJpb2RGaW5pc2gABQl0aW1lc3RhbXAECGxlZnRvdmVyCQBoAgkBCnJld2FyZFJhdGUABQ1yZW1haW5pbmdUaW1lCQBpAgkAZAIFB19yZXdhcmQFCGxlZnRvdmVyBQhEVVJBVElPTgkAzggCCQDOCAIJAM4IAgkBEHVwZGF0ZVJld2FyZFJhdGUBBQ1uZXdSZXdhcmRSYXRlCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBE3VwZGF0ZVJld2FyZEJhbGFuY2UBBQdfcmV3YXJkCQEKdXBkYXRlVGltZQIFCXRpbWVzdGFtcAkAZAIFCXRpbWVzdGFtcAUIRFVSQVRJT04JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdmlld19yZXdhcmQBB19zdGFrZXIEDHN0YWtlckVhcm5lZAgJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAACXzMJAAIBCQCkAwEJARB1c2RuRnJvbURlY2ltYWxzAQUMc3Rha2VyRWFybmVkAWkBDWNvbXB1dGVSZXdhcmQBB19zdGFrZXIEDHN0YWtlckVhcm5lZAgJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAACXzMJAJQKAgUDbmlsBQxzdGFrZXJFYXJuZWQBaQEQbWlncmF0ZUxpcXVpZGl0eQAEBmFtb3VudAkBEHVzZG5Gcm9tRGVjaW1hbHMBCQENcmV3YXJkQmFsYW5jZQAEBXN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQZhbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ5hZG1pblB1YmxpY0tleQBsPlOF", "height": 2260148, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E4ca5VEYWMrUzDRL4gRpNSkfRGiNJUELNETzWrqkbSNY Next: 7nadbtoUzvhYNugQHD8Kg1tW6mG3nRUFqZJ3oCUZnrhC Diff:
OldNewDifferences
2929
3030 let k_admin_public_key = "k_admin_public_key"
3131
32+let k_manager_address = "k_manager_address"
33+
3234 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
3335
3436
3941
4042
4143 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
44+
45+
46+func managerAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_manager_address)), "Manager not set")
4247
4348
4449 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
155160 func updateReward (_staker,_balanceDelta) = {
156161 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
157162 let newLastUpdateTime = currentTimestampSec()
158- let $t048425034 = if ((_staker != ""))
163+ let $t050205212 = if ((_staker != ""))
159164 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
160165 else $Tuple2(0, 0)
161- let stakerEarned = $t048425034._1
162- let stakerRewardPerTokenPaid = $t048425034._2
166+ let stakerEarned = $t050205212._1
167+ let stakerRewardPerTokenPaid = $t050205212._2
163168 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
164169 }
165170
180185 else !(initialized()))
181186 then throw("Invalid call to stake")
182187 else {
183- let $t056905855 = updateReward(_staker, 0)
184- let newRewardPerTokenStored = $t056905855._1
185- let newLastUpdateTime = $t056905855._2
186- let stakerEarned = $t056905855._3
187- let stakerRewardPerTokenPaid = $t056905855._4
188+ let $t058686033 = updateReward(_staker, 0)
189+ let newRewardPerTokenStored = $t058686033._1
190+ let newLastUpdateTime = $t058686033._2
191+ let stakerEarned = $t058686033._3
192+ let stakerRewardPerTokenPaid = $t058686033._4
188193 (((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
189194 }
190195 }
201206 else !(initialized()))
202207 then throw("Invalid unStake parameters")
203208 else {
204- let $t063866551 = updateReward(_staker, 0)
205- let newRewardPerTokenStored = $t063866551._1
206- let newLastUpdateTime = $t063866551._2
207- let stakerEarned = $t063866551._3
208- let stakerRewardPerTokenPaid = $t063866551._4
209+ let $t065646729 = updateReward(_staker, 0)
210+ let newRewardPerTokenStored = $t065646729._1
211+ let newLastUpdateTime = $t065646729._2
212+ let stakerEarned = $t065646729._3
213+ let stakerRewardPerTokenPaid = $t065646729._4
209214 ((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(_amount))) ++ [ScriptTransfer(i.caller, _amount, governanceAsset())])
210215 }
211216 }
215220 @Callable(i)
216221 func withdrawRewards () = {
217222 let _staker = toString(i.caller)
218- let $t070277172 = updateReward(_staker, 0)
219- let newRewardPerTokenStored = $t070277172._1
220- let newLastUpdateTime = $t070277172._2
221- let stakerEarned = $t070277172._3
222- let stakerRewardPerTokenPaid = $t070277172._4
223+ let $t072057350 = updateReward(_staker, 0)
224+ let newRewardPerTokenStored = $t072057350._1
225+ let newLastUpdateTime = $t072057350._2
226+ let stakerEarned = $t072057350._3
227+ let stakerRewardPerTokenPaid = $t072057350._4
223228 if (if ((0 >= stakerEarned))
224229 then true
225230 else !(initialized()))
226231 then throw("No reward")
227- else ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(stakerEarned), quoteAsset())])
232+ else {
233+ let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), usdnFromDecimals(stakerEarned)], nil)
234+ if ((unstake == unstake))
235+ then ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(stakerEarned), quoteAsset())])
236+ else throw("Strict value is not equal to itself.")
237+ }
228238 }
229239
230240
236246 then throw("Invalid addRewards params")
237247 else {
238248 let _reward = usdnToDecimals(i.payments[0].amount)
239- let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
240- let timestamp = currentTimestampSec()
241- let newRewardRate = if ((timestamp > periodFinish()))
242- then (_reward / DURATION)
243- else {
244- let remainingTime = (periodFinish() - timestamp)
245- let leftover = (rewardRate() * remainingTime)
246- ((_reward + leftover) / DURATION)
249+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_reward))])
250+ if ((stake == stake))
251+ then {
252+ let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
253+ let timestamp = currentTimestampSec()
254+ let newRewardRate = if ((timestamp > periodFinish()))
255+ then (_reward / DURATION)
256+ else {
257+ let remainingTime = (periodFinish() - timestamp)
258+ let leftover = (rewardRate() * remainingTime)
259+ ((_reward + leftover) / DURATION)
260+ }
261+ (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
247262 }
248- (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
263+ else throw("Strict value is not equal to itself.")
249264 }
250265
251266
258273 if ((0 >= rewardDelta))
259274 then throw("Invalid ackRewards params")
260275 else {
261- let _reward = rewardDelta
262- let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
263- let timestamp = currentTimestampSec()
264- let newRewardRate = if ((timestamp > periodFinish()))
265- then (_reward / DURATION)
266- else {
267- let remainingTime = (periodFinish() - timestamp)
268- let leftover = (rewardRate() * remainingTime)
269- ((_reward + leftover) / DURATION)
276+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(rewardDelta))])
277+ if ((stake == stake))
278+ then {
279+ let _reward = rewardDelta
280+ let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
281+ let timestamp = currentTimestampSec()
282+ let newRewardRate = if ((timestamp > periodFinish()))
283+ then (_reward / DURATION)
284+ else {
285+ let remainingTime = (periodFinish() - timestamp)
286+ let leftover = (rewardRate() * remainingTime)
287+ ((_reward + leftover) / DURATION)
288+ }
289+ (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
270290 }
271- (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
291+ else throw("Strict value is not equal to itself.")
272292 }
273293 }
274294
289309 }
290310
291311
312+
313+@Callable(i)
314+func migrateLiquidity () = {
315+ let amount = usdnFromDecimals(rewardBalance())
316+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), amount)])
317+ if ((stake == stake))
318+ then nil
319+ else throw("Strict value is not equal to itself.")
320+ }
321+
322+
292323 @Verifier(tx)
293324 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
294325
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_lastUpdateTime = "k_lastUpdateTime"
99
1010 let k_rewardPerTokenStored = "k_rewardPerTokenStored"
1111
1212 let k_rewardRate = "k_rewardRate"
1313
1414 let k_periodFinish = "k_periodFinish"
1515
1616 let k_balance = "k_balance"
1717
1818 let k_userRewardPerToken = "k_userRewardPerToken"
1919
2020 let k_userReward = "k_userReward"
2121
2222 let k_initialized = "k_initialized"
2323
2424 let k_coordinatorAddress = "k_coordinatorAddress"
2525
2626 let k_governance_asset = "k_gov_asset"
2727
2828 let k_quote_asset = "k_quote_asset"
2929
3030 let k_admin_public_key = "k_admin_public_key"
3131
32+let k_manager_address = "k_manager_address"
33+
3234 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
3335
3436
3537 func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
3638
3739
3840 func governanceAsset () = fromBase58String(getStringValue(coordinator(), k_governance_asset))
3941
4042
4143 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
44+
45+
46+func managerAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_manager_address)), "Manager not set")
4247
4348
4449 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
4550
4651 let DURATION = ((60 * 60) * 24)
4752
4853 let NO_ADDRESS = ""
4954
5055 let NO_STAKER = 0
5156
5257 func usdnFromDecimals (_amount) = (_amount / 100)
5358
5459
5560 func usdnToDecimals (_amount) = (_amount * 100)
5661
5762
5863 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
5964
6065
6166 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6267
6368
6469 func abs (_x) = if ((_x > 0))
6570 then _x
6671 else -(_x)
6772
6873
6974 func minv (_x,_y) = if ((_x > _y))
7075 then _y
7176 else _x
7277
7378
7479 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
7580
7681
7782 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
7883
7984
8085 func int0 (k) = valueOrElse(getInteger(this, k), 0)
8186
8287
8388 func totalSupply () = int0(k_totalSupply)
8489
8590
8691 func rewardPerTokenStored () = int0(k_rewardPerTokenStored)
8792
8893
8994 func lastUpdateTime () = int0(k_lastUpdateTime)
9095
9196
9297 func rewardRate () = int0(k_rewardRate)
9398
9499
95100 func periodFinish () = int0(k_periodFinish)
96101
97102
98103 func rewardBalance () = int0(k_rewardBalance)
99104
100105
101106 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
102107
103108
104109 func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
105110
106111
107112 func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
108113
109114
110115 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
111116
112117
113118 func updateRewardBalance (_delta) = [IntegerEntry(k_rewardBalance, (rewardBalance() + _delta))]
114119
115120
116121 func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
117122
118123
119124 func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
120125
121126
122127 func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
123128
124129
125130 func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
126131
127132
128133 func updateBalance (_staker,_delta) = [IntegerEntry(toCompositeKey(k_balance, _staker), (balanceOf(_staker) + _delta)), IntegerEntry(k_totalSupply, (totalSupply() + _delta))]
129134
130135
131136 func currentTimestampSec () = (lastBlock.timestamp / 1000)
132137
133138
134139 func lastTimeRewardApplicable () = minv(currentTimestampSec(), periodFinish())
135140
136141
137142 func rewardPerToken (_balanceDelta) = if (((totalSupply() + _balanceDelta) == 0))
138143 then rewardPerTokenStored()
139144 else {
140145 let timeInterval = (lastTimeRewardApplicable() - lastUpdateTime())
141146 let actualTimeInterval = if ((0 > timeInterval))
142147 then 0
143148 else timeInterval
144149 let diff = divd((rewardRate() * actualTimeInterval), (totalSupply() + _balanceDelta))
145150 (rewardPerTokenStored() + diff)
146151 }
147152
148153
149154 func earned (_staker,_balanceDelta) = {
150155 let rewardDelta = (rewardPerToken(_balanceDelta) - userRewardPerTokenPaid(_staker))
151156 (muld((balanceOf(_staker) + _balanceDelta), rewardDelta) + rewards(_staker))
152157 }
153158
154159
155160 func updateReward (_staker,_balanceDelta) = {
156161 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
157162 let newLastUpdateTime = currentTimestampSec()
158- let $t048425034 = if ((_staker != ""))
163+ let $t050205212 = if ((_staker != ""))
159164 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
160165 else $Tuple2(0, 0)
161- let stakerEarned = $t048425034._1
162- let stakerRewardPerTokenPaid = $t048425034._2
166+ let stakerEarned = $t050205212._1
167+ let stakerRewardPerTokenPaid = $t050205212._2
163168 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
164169 }
165170
166171
167172 @Callable(i)
168173 func initialize (_coordinator) = if (initialized())
169174 then throw("Already initialized")
170175 else [StringEntry(k_coordinatorAddress, _coordinator), BooleanEntry(k_initialized, true)]
171176
172177
173178
174179 @Callable(i)
175180 func stake () = {
176181 let _staker = toString(i.caller)
177182 let _amount = i.payments[0].amount
178183 if (if ((i.payments[0].assetId != governanceAsset()))
179184 then true
180185 else !(initialized()))
181186 then throw("Invalid call to stake")
182187 else {
183- let $t056905855 = updateReward(_staker, 0)
184- let newRewardPerTokenStored = $t056905855._1
185- let newLastUpdateTime = $t056905855._2
186- let stakerEarned = $t056905855._3
187- let stakerRewardPerTokenPaid = $t056905855._4
188+ let $t058686033 = updateReward(_staker, 0)
189+ let newRewardPerTokenStored = $t058686033._1
190+ let newLastUpdateTime = $t058686033._2
191+ let stakerEarned = $t058686033._3
192+ let stakerRewardPerTokenPaid = $t058686033._4
188193 (((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, _amount))
189194 }
190195 }
191196
192197
193198
194199 @Callable(i)
195200 func unStake (_amount) = {
196201 let _staker = toString(i.caller)
197202 if (if (if ((_amount > balanceOf(_staker)))
198203 then true
199204 else (i.payments != nil))
200205 then true
201206 else !(initialized()))
202207 then throw("Invalid unStake parameters")
203208 else {
204- let $t063866551 = updateReward(_staker, 0)
205- let newRewardPerTokenStored = $t063866551._1
206- let newLastUpdateTime = $t063866551._2
207- let stakerEarned = $t063866551._3
208- let stakerRewardPerTokenPaid = $t063866551._4
209+ let $t065646729 = updateReward(_staker, 0)
210+ let newRewardPerTokenStored = $t065646729._1
211+ let newLastUpdateTime = $t065646729._2
212+ let stakerEarned = $t065646729._3
213+ let stakerRewardPerTokenPaid = $t065646729._4
209214 ((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateBalance(_staker, -(_amount))) ++ [ScriptTransfer(i.caller, _amount, governanceAsset())])
210215 }
211216 }
212217
213218
214219
215220 @Callable(i)
216221 func withdrawRewards () = {
217222 let _staker = toString(i.caller)
218- let $t070277172 = updateReward(_staker, 0)
219- let newRewardPerTokenStored = $t070277172._1
220- let newLastUpdateTime = $t070277172._2
221- let stakerEarned = $t070277172._3
222- let stakerRewardPerTokenPaid = $t070277172._4
223+ let $t072057350 = updateReward(_staker, 0)
224+ let newRewardPerTokenStored = $t072057350._1
225+ let newLastUpdateTime = $t072057350._2
226+ let stakerEarned = $t072057350._3
227+ let stakerRewardPerTokenPaid = $t072057350._4
223228 if (if ((0 >= stakerEarned))
224229 then true
225230 else !(initialized()))
226231 then throw("No reward")
227- else ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(stakerEarned), quoteAsset())])
232+ else {
233+ let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), usdnFromDecimals(stakerEarned)], nil)
234+ if ((unstake == unstake))
235+ then ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, usdnFromDecimals(stakerEarned), quoteAsset())])
236+ else throw("Strict value is not equal to itself.")
237+ }
228238 }
229239
230240
231241
232242 @Callable(i)
233243 func addRewards () = if (if ((i.payments[0].assetId != quoteAsset()))
234244 then true
235245 else !(initialized()))
236246 then throw("Invalid addRewards params")
237247 else {
238248 let _reward = usdnToDecimals(i.payments[0].amount)
239- let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
240- let timestamp = currentTimestampSec()
241- let newRewardRate = if ((timestamp > periodFinish()))
242- then (_reward / DURATION)
243- else {
244- let remainingTime = (periodFinish() - timestamp)
245- let leftover = (rewardRate() * remainingTime)
246- ((_reward + leftover) / DURATION)
249+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(_reward))])
250+ if ((stake == stake))
251+ then {
252+ let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
253+ let timestamp = currentTimestampSec()
254+ let newRewardRate = if ((timestamp > periodFinish()))
255+ then (_reward / DURATION)
256+ else {
257+ let remainingTime = (periodFinish() - timestamp)
258+ let leftover = (rewardRate() * remainingTime)
259+ ((_reward + leftover) / DURATION)
260+ }
261+ (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
247262 }
248- (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
263+ else throw("Strict value is not equal to itself.")
249264 }
250265
251266
252267
253268 @Callable(i)
254269 func ackRewards () = {
255270 let currentBalance = usdnToDecimals(assetBalance(this, quoteAsset()))
256271 let _rewardBalance = rewardBalance()
257272 let rewardDelta = (currentBalance - _rewardBalance)
258273 if ((0 >= rewardDelta))
259274 then throw("Invalid ackRewards params")
260275 else {
261- let _reward = rewardDelta
262- let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
263- let timestamp = currentTimestampSec()
264- let newRewardRate = if ((timestamp > periodFinish()))
265- then (_reward / DURATION)
266- else {
267- let remainingTime = (periodFinish() - timestamp)
268- let leftover = (rewardRate() * remainingTime)
269- ((_reward + leftover) / DURATION)
276+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), usdnFromDecimals(rewardDelta))])
277+ if ((stake == stake))
278+ then {
279+ let _reward = rewardDelta
280+ let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
281+ let timestamp = currentTimestampSec()
282+ let newRewardRate = if ((timestamp > periodFinish()))
283+ then (_reward / DURATION)
284+ else {
285+ let remainingTime = (periodFinish() - timestamp)
286+ let leftover = (rewardRate() * remainingTime)
287+ ((_reward + leftover) / DURATION)
288+ }
289+ (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
270290 }
271- (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
291+ else throw("Strict value is not equal to itself.")
272292 }
273293 }
274294
275295
276296
277297 @Callable(i)
278298 func view_reward (_staker) = {
279299 let stakerEarned = updateReward(_staker, 0)._3
280300 throw(toString(usdnFromDecimals(stakerEarned)))
281301 }
282302
283303
284304
285305 @Callable(i)
286306 func computeReward (_staker) = {
287307 let stakerEarned = updateReward(_staker, 0)._3
288308 $Tuple2(nil, stakerEarned)
289309 }
290310
291311
312+
313+@Callable(i)
314+func migrateLiquidity () = {
315+ let amount = usdnFromDecimals(rewardBalance())
316+ let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), amount)])
317+ if ((stake == stake))
318+ then nil
319+ else throw("Strict value is not equal to itself.")
320+ }
321+
322+
292323 @Verifier(tx)
293324 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
294325

github/deemru/w8io/03bedc9 
45.06 ms