tx · 4Q8aTwvsuvBCZwaVPcpBpxNRzQVB8Ga495FPtbZjN6o7

3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ:  -0.03700000 Waves

2023.05.23 14:28 [2590562] smart account 3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ > SELF 0.00000000 Waves

{ "type": 13, "id": "4Q8aTwvsuvBCZwaVPcpBpxNRzQVB8Ga495FPtbZjN6o7", "fee": 3700000, "feeAssetId": null, "timestamp": 1684841333008, "version": 2, "chainId": 84, "sender": "3NBEuUXKfGqe1ZKUfx8b8YsguJKYLhy2bTJ", "senderPublicKey": "2NgVCitn1k18yzwhrzdQXHDEygzSkjbXS4A1koTt14db", "proofs": [ "5HUUm8qpEXUtoXhMxdyv1u76pfzPhxey89ZTybypjTkPnDE8SzwWY6hvTxjiGiT26NqoDipSvwmQEv7BPHcXRrPZ" ], "script": "base64:BgI1CAISABIFCgMICAESABIDCgEBEgASABIAEgMKAQESAwoBARIAEgASAwoBCBIDCgEIEgMKAQhfAA1rX3RvdGFsU3VwcGx5Ag1rX3RvdGFsU3VwcGx5AA9rX3Jld2FyZEJhbGFuY2UCD2tfcmV3YXJkQmFsYW5jZQAPa19sb2NrZWRCYWxhbmNlAg9rX2xvY2tlZEJhbGFuY2UADWtfZnJlZUJhbGFuY2UCDWtfZnJlZUJhbGFuY2UAD2tfZXhjZXNzQmFsYW5jZQIPa19leGNlc3NCYWxhbmNlAAxrX3ZhdWx0QXNzZXQCDGtfdmF1bHRBc3NldAAUa192YXVsdEFzc2V0RGVjaW1hbHMCFGtfdmF1bHRBc3NldERlY2ltYWxzABRrX21heFNwb3RVdGlsaXphdGlvbgIUa19tYXhTcG90VXRpbGl6YXRpb24ABmtfcmF0ZQIGa19yYXRlABBrX2xhc3RVcGRhdGVUaW1lAhBrX2xhc3RVcGRhdGVUaW1lABZrX3Jld2FyZFBlclRva2VuU3RvcmVkAhZrX3Jld2FyZFBlclRva2VuU3RvcmVkAAxrX3Jld2FyZFJhdGUCDGtfcmV3YXJkUmF0ZQAOa19wZXJpb2RGaW5pc2gCDmtfcGVyaW9kRmluaXNoABRrX3VzZXJSZXdhcmRQZXJUb2tlbgIUa191c2VyUmV3YXJkUGVyVG9rZW4ADGtfdXNlclJld2FyZAIMa191c2VyUmV3YXJkAAlrX2JhbGFuY2UCCWtfYmFsYW5jZQAOa19hdmVyYWdlX3JhdGUCDmtfYXZlcmFnZV9yYXRlABBrX3dpdGhkcmF3X2xpbWl0AhBrX3dpdGhkcmF3X2xpbWl0ABRrX2xhc3Rfd2l0aGRyYXdfZGF0ZQIUa19sYXN0X3dpdGhkcmF3X2RhdGUAFGtfd2l0aGRyYXdfaW5fcGVyaW9kAhRrX3dpdGhkcmF3X2luX3BlcmlvZAANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzAAVrX2FtbQIFa19hbW0AEmtfZ292ZXJuYW5jZV9hc3NldAILa19nb3ZfYXNzZXQADWtfcXVvdGVfYXNzZXQCDWtfcXVvdGVfYXNzZXQAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABFrX21hbmFnZXJfYWRkcmVzcwIRa19tYW5hZ2VyX2FkZHJlc3MADmtfc3BvdF9hZGRyZXNzAg5rX3Nwb3RfYWRkcmVzcwAUa19jb2xsYXRlcmFsX2FkZHJlc3MCFGtfY29sbGF0ZXJhbF9hZGRyZXNzAQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQCG0Nvb3JkaW5hdG9yIGFkZHJlc3MgaW52YWxpZAEMYWRtaW5BZGRyZXNzAAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAhVBZG1pbiBhZGRyZXNzIG5vdCBzZXQBC2lzV2hpdGVsaXN0AQhfYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmwgCCQELY29vcmRpbmF0b3IACQEOdG9Db21wb3NpdGVLZXkCBQVrX2FtbQUIX2FkZHJlc3MHAQ9nb3Zlcm5hbmNlQXNzZXQACQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABRJrX2dvdmVybmFuY2VfYXNzZXQCGEdvdmVybmFuY2UgYXNzZXQgbm90IHNldAEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAENdmF1bHRBc3NldFN0cgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrX3ZhdWx0QXNzZXQCE1ZhdWx0IGFzc2V0IG5vdCBzZXQBCnZhdWx0QXNzZXQABAtfYXNzZXRJZFN0cgkBDXZhdWx0QXNzZXRTdHIAAwkAAAIFC19hc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQtfYXNzZXRJZFN0cgESdmF1bHRBc3NldERlY2ltYWxzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFFGtfdmF1bHRBc3NldERlY2ltYWxzAhxWYXVsdCBhc3NldCBkZWNpbWFscyBub3Qgc2V0AQ5tYW5hZ2VyQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBC2Nvb3JkaW5hdG9yAAURa19tYW5hZ2VyX2FkZHJlc3MCF01hbmFnZXIgYWRkcmVzcyBub3Qgc2V0AhdNYW5hZ2VyIGFkZHJlc3MgaW52YWxpZAAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAKAAoACERVUkFUSU9OCQBoAgkAaAIJAGgCAAcAPAA8ABgACk5PX0FERFJFU1MCAAAJTk9fU1RBS0VSAAABEWFzc2V0RnJvbURlY2ltYWxzAQdfYW1vdW50BA1hc3NldERlY2ltYWxzCQESdmF1bHRBc3NldERlY2ltYWxzAAMJAAACBQ1hc3NldERlY2ltYWxzAAYJAGkCBQdfYW1vdW50AGQDCQAAAgUNYXNzZXREZWNpbWFscwAIBQdfYW1vdW50CQACAQIWSW52YWxpZCBhc3NldCBkZWNpbWFscwEPYXNzZXRUb0RlY2ltYWxzAQdfYW1vdW50BA1hc3NldERlY2ltYWxzCQESdmF1bHRBc3NldERlY2ltYWxzAAMJAAACBQ1hc3NldERlY2ltYWxzAAYJAGgCBQdfYW1vdW50AGQDCQAAAgUNYXNzZXREZWNpbWFscwAIBQdfYW1vdW50CQACAQIWSW52YWxpZCBhc3NldCBkZWNpbWFscwEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQRtaW52AgJfeAJfeQMJAGYCBQJfeAUCX3kFAl95BQJfeAAPV0lUSERSQVdfUEVSSU9ECQBoAgCAowUA6AcAE1dJVEhEUkFXX1BFUl9QRVJJT0QJAQRkaXZkAgkAaAIAAQUMREVDSU1BTF9VTklUCQBoAgAEBQxERUNJTUFMX1VOSVQBA2ludAEBawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAWsJAKwCAgINbm8gdmFsdWUgZm9yIAUBawEEaW50MAEBawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrAAABBGludDEBAWsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawUMREVDSU1BTF9VTklUAQt0b3RhbFN1cHBseQAJAQRpbnQwAQUNa190b3RhbFN1cHBseQEEcmF0ZQAJAQRpbnQxAQUGa19yYXRlAQliYWxhbmNlT2YBB19zdGFrZXIJAQRpbnQwAQkBDnRvQ29tcG9zaXRlS2V5AgUJa19iYWxhbmNlBQdfc3Rha2VyAQthdmVyYWdlUmF0ZQEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBQ5rX2F2ZXJhZ2VfcmF0ZQUHX3N0YWtlcgENd2l0aGRyYXdMaW1pdAEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRBrX3dpdGhkcmF3X2xpbWl0BQdfc3Rha2VyARF3aXRoZHJhd25JblBlcmlvZAEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBRRrX3dpdGhkcmF3X2luX3BlcmlvZAUHX3N0YWtlcgERbGFzdFdpdGhkcmF3bkRhdGUBB19zdGFrZXIJAQRpbnQwAQkBDnRvQ29tcG9zaXRlS2V5AgUUa19sYXN0X3dpdGhkcmF3X2RhdGUFB19zdGFrZXIBC2ZyZWVCYWxhbmNlAAkBBGludDABBQ1rX2ZyZWVCYWxhbmNlAQ1sb2NrZWRCYWxhbmNlAAkBBGludDABBQ9rX2xvY2tlZEJhbGFuY2UBDWV4Y2Vzc0JhbGFuY2UACQEEaW50MAEFD2tfZXhjZXNzQmFsYW5jZQEUcmV3YXJkUGVyVG9rZW5TdG9yZWQACQEEaW50MAEFFmtfcmV3YXJkUGVyVG9rZW5TdG9yZWQBDmxhc3RVcGRhdGVUaW1lAAkBBGludDABBRBrX2xhc3RVcGRhdGVUaW1lAQpyZXdhcmRSYXRlAAkBBGludDABBQxrX3Jld2FyZFJhdGUBDHBlcmlvZEZpbmlzaAAJAQRpbnQwAQUOa19wZXJpb2RGaW5pc2gBDXJld2FyZEJhbGFuY2UACQEEaW50MAEFD2tfcmV3YXJkQmFsYW5jZQEHcmV3YXJkcwEHX3N0YWtlcgkBBGludDABCQEOdG9Db21wb3NpdGVLZXkCBQxrX3VzZXJSZXdhcmQFB19zdGFrZXIBFnVzZXJSZXdhcmRQZXJUb2tlblBhaWQBB19zdGFrZXIJAQRpbnQwAQkBDnRvQ29tcG9zaXRlS2V5AgUUa191c2VyUmV3YXJkUGVyVG9rZW4FB19zdGFrZXIBEm1heFNwb3RVdGlsaXphdGlvbgAJAQRpbnQwAQUUa19tYXhTcG90VXRpbGl6YXRpb24BC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEQY3VycmVudFRpbWVzdGFtcAAIBQlsYXN0QmxvY2sJdGltZXN0YW1wARNjdXJyZW50VGltZXN0YW1wU2VjAAkAaQIJARBjdXJyZW50VGltZXN0YW1wAADoBwEUZ2V0V2l0aGRyYXdMaW1pdExlZnQBB19zdGFrZXIEC2N1cnJlbnREYXRlCQEQY3VycmVudFRpbWVzdGFtcAAEEGxhc3RXaXRoZHJhd0RhdGUJARFsYXN0V2l0aGRyYXduRGF0ZQEFB19zdGFrZXIECyR0MDYyNjc2NTg4AwkAZgIJAGUCBQtjdXJyZW50RGF0ZQUQbGFzdFdpdGhkcmF3RGF0ZQUPV0lUSERSQVdfUEVSSU9ECQCVCgMFC2N1cnJlbnREYXRlCQENd2l0aGRyYXdMaW1pdAEFB19zdGFrZXIAAAkAlQoDBRBsYXN0V2l0aGRyYXdEYXRlCQBlAgkBDXdpdGhkcmF3TGltaXQBBQdfc3Rha2VyCQERd2l0aGRyYXduSW5QZXJpb2QBBQdfc3Rha2VyCQERd2l0aGRyYXduSW5QZXJpb2QBBQdfc3Rha2VyBBRuZXdMYXN0V2l0aGRyYXduRGF0ZQgFCyR0MDYyNjc2NTg4Al8xBBF3aXRoZHJhd0xpbWl0TGVmdAgFCyR0MDYyNjc2NTg4Al8yBBhhbHJlYWR5V2l0aGRyYXduSW5QZXJpb2QIBQskdDA2MjY3NjU4OAJfMwkAlQoDBRRuZXdMYXN0V2l0aGRyYXduRGF0ZQURd2l0aGRyYXdMaW1pdExlZnQFGGFscmVhZHlXaXRoZHJhd25JblBlcmlvZAEOY29tcHV0ZU5ld1JhdGUBE19hbW91bnRPZlF1b3RlQXNzZXQEB25ld1JhdGUDCQBmAgkBC3RvdGFsU3VwcGx5AAAACQEEZGl2ZAIJAGQCCQELZnJlZUJhbGFuY2UABRNfYW1vdW50T2ZRdW90ZUFzc2V0CQELdG90YWxTdXBwbHkABQxERUNJTUFMX1VOSVQFB25ld1JhdGUBGGxhc3RUaW1lUmV3YXJkQXBwbGljYWJsZQAJAQRtaW52AgkBE2N1cnJlbnRUaW1lc3RhbXBTZWMACQEMcGVyaW9kRmluaXNoAAEOcmV3YXJkUGVyVG9rZW4BDV9iYWxhbmNlRGVsdGEDCQAAAgkAZAIJAQt0b3RhbFN1cHBseQAFDV9iYWxhbmNlRGVsdGEAAAkBFHJld2FyZFBlclRva2VuU3RvcmVkAAQMdGltZUludGVydmFsCQBlAgkBGGxhc3RUaW1lUmV3YXJkQXBwbGljYWJsZQAJAQ5sYXN0VXBkYXRlVGltZQAEEmFjdHVhbFRpbWVJbnRlcnZhbAMJAGYCAAAFDHRpbWVJbnRlcnZhbAAABQx0aW1lSW50ZXJ2YWwEBGRpZmYJAQRkaXZkAgkAaAIJAQpyZXdhcmRSYXRlAAUSYWN0dWFsVGltZUludGVydmFsCQBkAgkBC3RvdGFsU3VwcGx5AAUNX2JhbGFuY2VEZWx0YQkAZAIJARRyZXdhcmRQZXJUb2tlblN0b3JlZAAFBGRpZmYBBmVhcm5lZAIHX3N0YWtlcg1fYmFsYW5jZURlbHRhBAtyZXdhcmREZWx0YQkAZQIJAQ5yZXdhcmRQZXJUb2tlbgEFDV9iYWxhbmNlRGVsdGEJARZ1c2VyUmV3YXJkUGVyVG9rZW5QYWlkAQUHX3N0YWtlcgkAZAIJAQRtdWxkAgkAZAIJAQliYWxhbmNlT2YBBQdfc3Rha2VyBQ1fYmFsYW5jZURlbHRhBQtyZXdhcmREZWx0YQkBB3Jld2FyZHMBBQdfc3Rha2VyAQx1cGRhdGVSZXdhcmQCB19zdGFrZXINX2JhbGFuY2VEZWx0YQQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJAQ5yZXdhcmRQZXJUb2tlbgEFDV9iYWxhbmNlRGVsdGEEEW5ld0xhc3RVcGRhdGVUaW1lCQETY3VycmVudFRpbWVzdGFtcFNlYwAECyR0MDc4MTA4MDAyAwkBAiE9AgUHX3N0YWtlcgIACQCUCgIJAQZlYXJuZWQCBQdfc3Rha2VyBQ1fYmFsYW5jZURlbHRhBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkAlAoCAAAAAAQMc3Rha2VyRWFybmVkCAULJHQwNzgxMDgwMDICXzEEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFCyR0MDc4MTA4MDAyAl8yCQCWCgQFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkBRFuZXdMYXN0VXBkYXRlVGltZQUMc3Rha2VyRWFybmVkBRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQBEXVwZGF0ZVVzZXJCYWxhbmNlAgVfdXNlcgdfY2hhbmdlAwkAZwIJAGQCCQEJYmFsYW5jZU9mAQUFX3VzZXIFB19jaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUJa19iYWxhbmNlBQVfdXNlcgkAZAIJAQliYWxhbmNlT2YBBQVfdXNlcgUHX2NoYW5nZQUDbmlsCQACAQkArAICCQCsAgIJAKwCAgItVmF1bHQ6IGNhbiBub3QgdXBkYXRlIHVzZXIgYmFsYW5jZS4gQmFsYW5jZTogCQCkAwEJAQliYWxhbmNlT2YBBQVfdXNlcgIJIGNoYW5nZTogCQCkAwEFB19jaGFuZ2UBFHNldFVzZXJXaXRoZHJhd0xpbWl0AgVfdXNlcgVfcmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa193aXRoZHJhd19saW1pdAUFX3VzZXIFBV9yYXRlBQNuaWwBEnNldFVzZXJBdmVyYWdlUmF0ZQIFX3VzZXIFX3JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfYXZlcmFnZV9yYXRlBQVfdXNlcgUFX3JhdGUFA25pbAERdXBkYXRlRnJlZUJhbGFuY2UBB19jaGFuZ2UEB2JhbGFuY2UJAQtmcmVlQmFsYW5jZQADCQBnAgkAZAIFB2JhbGFuY2UFB19jaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19mcmVlQmFsYW5jZQkAZAIFB2JhbGFuY2UFB19jaGFuZ2UFA25pbAkAAgEJAKwCAgkArAICCQCsAgICLVZhdWx0OiBjYW4gbm90IHVwZGF0ZSBmcmVlIGJhbGFuY2UuIEJhbGFuY2U6IAkApAMBBQdiYWxhbmNlAgkgY2hhbmdlOiAJAKQDAQUHX2NoYW5nZQETdXBkYXRlTG9ja2VkQmFsYW5jZQEHX2NoYW5nZQQHYmFsYW5jZQkBDWxvY2tlZEJhbGFuY2UAAwkAZwIJAGQCBQdiYWxhbmNlBQdfY2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfbG9ja2VkQmFsYW5jZQkAZAIFB2JhbGFuY2UFB19jaGFuZ2UFA25pbAkAAgEJAKwCAgkArAICCQCsAgICL1ZhdWx0OiBjYW4gbm90IHVwZGF0ZSBsb2NrZWQgYmFsYW5jZS4gQmFsYW5jZTogCQCkAwEFB2JhbGFuY2UCCSBjaGFuZ2U6IAkApAMBBQdfY2hhbmdlARN1cGRhdGVFeGNlc3NCYWxhbmNlAQdfY2hhbmdlBAxuZXdJbWJhbGFuY2UJAGQCCQENZXhjZXNzQmFsYW5jZQAFB19jaGFuZ2UED3V0aWxpemF0aW9uUmF0ZQkBBGRpdmQCCQEDYWJzAQUMbmV3SW1iYWxhbmNlCQELZnJlZUJhbGFuY2UAAwkAZgIJARJtYXhTcG90VXRpbGl6YXRpb24ABQ91dGlsaXphdGlvblJhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfZXhjZXNzQmFsYW5jZQUMbmV3SW1iYWxhbmNlBQNuaWwJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICL1ZhdWx0OiBjYW4gbm90IHVwZGF0ZSBleGNlc3MgYmFsYW5jZS4gQmFsYW5jZTogCQCkAwEJAQ1leGNlc3NCYWxhbmNlAAIJIGNoYW5nZTogCQCkAwEFB19jaGFuZ2UCEyB1dGlsaXphdGlvbiByYXRlOiAJAKQDAQUPdXRpbGl6YXRpb25SYXRlAhcgbWF4IHV0aWxpemF0aW9uIHJhdGU6IAkApAMBCQESbWF4U3BvdFV0aWxpemF0aW9uAAERdXBkYXRlVG90YWxTdXBwbHkBB19jaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfdG90YWxTdXBwbHkJAGQCCQELdG90YWxTdXBwbHkABQdfY2hhbmdlBQNuaWwBCnVwZGF0ZVJhdGUBBV9yYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrX3JhdGUFBV9yYXRlBQNuaWwBFXNldFVzZXJXaXRoZHJhd1BhcmFtcwMFX3VzZXIRX2xhc3RXaXRoZHJhd0RhdGUKX3dpdGhkcmF3bgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa19sYXN0X3dpdGhkcmF3X2RhdGUFBV91c2VyBRFfbGFzdFdpdGhkcmF3RGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUUa193aXRoZHJhd19pbl9wZXJpb2QFBV91c2VyBQpfd2l0aGRyYXduBQNuaWwBE3VwZGF0ZVJld2FyZEJhbGFuY2UBBl9kZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19yZXdhcmRCYWxhbmNlCQBkAgkBDXJld2FyZEJhbGFuY2UABQZfZGVsdGEFA25pbAEQdXBkYXRlUmV3YXJkUmF0ZQELX3Jld2FyZFJhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtfcmV3YXJkUmF0ZQULX3Jld2FyZFJhdGUFA25pbAEKdXBkYXRlVGltZQIPX2xhc3RVcGRhdGVUaW1lDV9wZXJpb2RGaW5pc2gJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbGFzdFVwZGF0ZVRpbWUFD19sYXN0VXBkYXRlVGltZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa19wZXJpb2RGaW5pc2gFDV9wZXJpb2RGaW5pc2gFA25pbAEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBFV9yZXdhcmRQZXJUb2tlblN0b3JlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa19yZXdhcmRQZXJUb2tlblN0b3JlZAUVX3Jld2FyZFBlclRva2VuU3RvcmVkBQNuaWwBEXVwZGF0ZVVzZXJSZXdhcmRzAwdfc3Rha2VyB19yZXdhcmQTX3VzZXJSZXdhcmRQZXJUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUMa191c2VyUmV3YXJkBQdfc3Rha2VyBQdfcmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRRrX3VzZXJSZXdhcmRQZXJUb2tlbgUHX3N0YWtlcgUTX3VzZXJSZXdhcmRQZXJUb2tlbgUDbmlsDgFpAQdtaWdyYXRlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhpJbnZhbGlkIG1pZ3JhdGUgcGFyYW1ldGVycwQLX3ZhdWx0QXNzZXQJANgEAQkBCnF1b3RlQXNzZXQABA1hc3NldERlY2ltYWxzAwkAAAIFC192YXVsdEFzc2V0AgVXQVZFUwAIBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQtfdmF1bHRBc3NldAkArAICAhJJbnZhbGlkIHRva2VuIGlkOiAFC192YXVsdEFzc2V0CAUEaW5mbwhkZWNpbWFscwkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3ZhdWx0QXNzZXQFC192YXVsdEFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRrX3ZhdWx0QXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa19tYXhTcG90VXRpbGl6YXRpb24AAAUDbmlsAWkBCmluaXRpYWxpemUDDF9jb29yZGluYXRvcgtfdmF1bHRBc3NldBNfbWF4U3BvdFV0aWxpemF0aW9uAwMDAwkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwYJAGYCAAAFE19tYXhTcG90VXRpbGl6YXRpb24GCQBmAgUTX21heFNwb3RVdGlsaXphdGlvbgUMREVDSU1BTF9VTklUCQACAQIUVW5hYmxlIHRvIGluaXRpYWxpemUEDWFzc2V0RGVjaW1hbHMDCQAAAgULX3ZhdWx0QXNzZXQCBVdBVkVTAAgEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFC192YXVsdEFzc2V0CQCsAgICEkludmFsaWQgdG9rZW4gaWQ6IAULX3ZhdWx0QXNzZXQIBQRpbmZvCGRlY2ltYWxzCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQxfY29vcmRpbmF0b3ICG0ludmFsaWQgY29vcmRpbmF0b3IgYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3ZhdWx0QXNzZXQFC192YXVsdEFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRrX3ZhdWx0QXNzZXREZWNpbWFscwUNYXNzZXREZWNpbWFscwkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa19tYXhTcG90VXRpbGl6YXRpb24FE19tYXhTcG90VXRpbGl6YXRpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGBQNuaWwBaQEFc3Rha2UABAdfc3Rha2VyCQClCAEIBQFpBmNhbGxlcgQHX2Ftb3VudAkBD2Fzc2V0VG9EZWNpbWFscwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQp2YXVsdEFzc2V0AAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECFUludmFsaWQgY2FsbCB0byBzdGFrZQQNJHQwMTMxNDcxMzM3NgkBDHVwZGF0ZVJld2FyZAIFB19zdGFrZXIAAAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQIBQ0kdDAxMzE0NzEzMzc2Al8xBBFuZXdMYXN0VXBkYXRlVGltZQgFDSR0MDEzMTQ3MTMzNzYCXzIEDHN0YWtlckVhcm5lZAgFDSR0MDEzMTQ3MTMzNzYCXzMEGHN0YWtlclJld2FyZFBlclRva2VuUGFpZAgFDSR0MDEzMTQ3MTMzNzYCXzQEC2N1cnJlbnRSYXRlCQEEcmF0ZQAED3ByZXZBdmVyYWdlUmF0ZQkBC2F2ZXJhZ2VSYXRlAQUHX3N0YWtlcgQHdkFtb3VudAkBBGRpdmQCBQdfYW1vdW50BQtjdXJyZW50UmF0ZQQObmV3QXZlcmFnZVJhdGUJAQRkaXZkAgkAZAIJAQRtdWxkAgUHdkFtb3VudAULY3VycmVudFJhdGUJAQRtdWxkAgkBCWJhbGFuY2VPZgEFB19zdGFrZXIFD3ByZXZBdmVyYWdlUmF0ZQkAZAIFB3ZBbW91bnQJAQliYWxhbmNlT2YBBQdfc3Rha2VyBA9uZXdUb3RhbEJhbGFuY2UJAGQCBQd2QW1vdW50CQEJYmFsYW5jZU9mAQUHX3N0YWtlcgQQbmV3V2l0aGRyYXdMaW1pdAkBBG11bGQCBQ9uZXdUb3RhbEJhbGFuY2UFE1dJVEhEUkFXX1BFUl9QRVJJT0QEBXN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnZhdWx0QXNzZXQACQERYXNzZXRGcm9tRGVjaW1hbHMBBQdfYW1vdW50BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARF1cGRhdGVVc2VyUmV3YXJkcwMFB19zdGFrZXIFDHN0YWtlckVhcm5lZAUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBCnVwZGF0ZVRpbWUCBRFuZXdMYXN0VXBkYXRlVGltZQkBDHBlcmlvZEZpbmlzaAAJARF1cGRhdGVGcmVlQmFsYW5jZQEFB19hbW91bnQJARF1cGRhdGVVc2VyQmFsYW5jZQIFB19zdGFrZXIFB3ZBbW91bnQJARJzZXRVc2VyQXZlcmFnZVJhdGUCBQdfc3Rha2VyBQ5uZXdBdmVyYWdlUmF0ZQkBFHNldFVzZXJXaXRoZHJhd0xpbWl0AgUHX3N0YWtlcgUQbmV3V2l0aGRyYXdMaW1pdAkBEXVwZGF0ZVRvdGFsU3VwcGx5AQUHdkFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1blN0YWtlAQdfYW1vdW50BAdfc3Rha2VyCQClCAEIBQFpBmNhbGxlcgQSYW1vdW50T2ZRdW90ZUFzc2V0CQEPYXNzZXRUb0RlY2ltYWxzAQUHX2Ftb3VudAMDAwkBAiE9AggFAWkIcGF5bWVudHMFA25pbAYJAGcCAAAFEmFtb3VudE9mUXVvdGVBc3NldAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECF0ludmFsaWQgY2FsbCB0byB1blN0YWtlBA0kdDAxNDg4NDE1MTAwCQEMdXBkYXRlUmV3YXJkAgUHX3N0YWtlcgAABBduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAgFDSR0MDE0ODg0MTUxMDACXzEEEW5ld0xhc3RVcGRhdGVUaW1lCAUNJHQwMTQ4ODQxNTEwMAJfMgQMc3Rha2VyRWFybmVkCAUNJHQwMTQ4ODQxNTEwMAJfMwQYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCAUNJHQwMTQ4ODQxNTEwMAJfNAQNJHQwMTUxMDcxNTI3NAkBFGdldFdpdGhkcmF3TGltaXRMZWZ0AQUHX3N0YWtlcgQUbmV3TGFzdFdpdGhkcmF3bkRhdGUIBQ0kdDAxNTEwNzE1Mjc0Al8xBBF3aXRoZHJhd0xpbWl0TGVmdAgFDSR0MDE1MTA3MTUyNzQCXzIEGGFscmVhZHlXaXRoZHJhd25JblBlcmlvZAgFDSR0MDE1MTA3MTUyNzQCXzMEB3ZBbW91bnQJAQRkaXZkAgUSYW1vdW50T2ZRdW90ZUFzc2V0CQEEcmF0ZQADCQBmAgUHdkFtb3VudAURd2l0aGRyYXdMaW1pdExlZnQJAAIBAixJbnZhbGlkIGNhbGwgdG8gdW5TdGFrZTogd2l0aGRyYXcgb3ZlciBsaW1pdAQUbmV3V2l0aGRyYXduSW5QZXJpb2QJAGQCBRhhbHJlYWR5V2l0aGRyYXduSW5QZXJpb2QFB3ZBbW91bnQDCQBmAgUSYW1vdW50T2ZRdW90ZUFzc2V0CQELZnJlZUJhbGFuY2UACQACAQIoSW52YWxpZCBjYWxsIHRvIHVuU3Rha2U6IGJhbGFuY2UgdG9vIGxvdwQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCCQENdmF1bHRBc3NldFN0cgAJAMwIAgkBEWFzc2V0RnJvbURlY2ltYWxzAQUSYW1vdW50T2ZRdW90ZUFzc2V0BQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARF1cGRhdGVVc2VyUmV3YXJkcwMFB19zdGFrZXIFDHN0YWtlckVhcm5lZAUYc3Rha2VyUmV3YXJkUGVyVG9rZW5QYWlkCQEadXBkYXRlUmV3YXJkUGVyVG9rZW5TdG9yZWQBBRduZXdSZXdhcmRQZXJUb2tlblN0b3JlZAkBCnVwZGF0ZVRpbWUCBRFuZXdMYXN0VXBkYXRlVGltZQkBDHBlcmlvZEZpbmlzaAAJARF1cGRhdGVGcmVlQmFsYW5jZQEJAQEtAQUSYW1vdW50T2ZRdW90ZUFzc2V0CQERdXBkYXRlVXNlckJhbGFuY2UCBQdfc3Rha2VyCQEBLQEFB3ZBbW91bnQJARF1cGRhdGVUb3RhbFN1cHBseQEJAQEtAQUHdkFtb3VudAkBFXNldFVzZXJXaXRoZHJhd1BhcmFtcwMFB19zdGFrZXIFFG5ld0xhc3RXaXRoZHJhd25EYXRlBRRuZXdXaXRoZHJhd25JblBlcmlvZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJARFhc3NldEZyb21EZWNpbWFscwEFEmFtb3VudE9mUXVvdGVBc3NldAkBCnZhdWx0QXNzZXQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPd2l0aGRyYXdSZXdhcmRzAAQHX3N0YWtlcgkApQgBCAUBaQZjYWxsZXIEDSR0MDE2NzkxMTY5MzYJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAAEF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCAUNJHQwMTY3OTExNjkzNgJfMQQRbmV3TGFzdFVwZGF0ZVRpbWUIBQ0kdDAxNjc5MTE2OTM2Al8yBAxzdGFrZXJFYXJuZWQIBQ0kdDAxNjc5MTE2OTM2Al8zBBhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQIBQ0kdDAxNjc5MTE2OTM2Al80AwMJAGcCAAAFDHN0YWtlckVhcm5lZAYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECEE5vIHJld2FyZDogVmF1bHQJAM4IAgkAzggCCQDOCAIJAM4IAgkBEXVwZGF0ZVVzZXJSZXdhcmRzAwUHX3N0YWtlcgAABRhzdGFrZXJSZXdhcmRQZXJUb2tlblBhaWQJARp1cGRhdGVSZXdhcmRQZXJUb2tlblN0b3JlZAEFF25ld1Jld2FyZFBlclRva2VuU3RvcmVkCQEKdXBkYXRlVGltZQIFEW5ld0xhc3RVcGRhdGVUaW1lCQEMcGVyaW9kRmluaXNoAAkBE3VwZGF0ZVJld2FyZEJhbGFuY2UBCQEBLQEFDHN0YWtlckVhcm5lZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHN0YWtlckVhcm5lZAkBD2dvdmVybmFuY2VBc3NldAAFA25pbAFpAQdhZGRGcmVlAAQHX2Ftb3VudAkBD2Fzc2V0VG9EZWNpbWFscwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEKdmF1bHRBc3NldAAGCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEDCQELaXNXaGl0ZWxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAAACCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIWSW52YWxpZCBhZGRGcmVlIHBhcmFtcwQHbmV3UmF0ZQkBDmNvbXB1dGVOZXdSYXRlAQUHX2Ftb3VudAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKdmF1bHRBc3NldAAJARFhc3NldEZyb21EZWNpbWFscwEFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UJAM4IAgkBEXVwZGF0ZUZyZWVCYWxhbmNlAQUHX2Ftb3VudAkBCnVwZGF0ZVJhdGUBBQduZXdSYXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFkZExvY2tlZAAEB19hbW91bnQJAQ9hc3NldFRvRGVjaW1hbHMBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnZhdWx0QXNzZXQABgkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBAwkBC2lzV2hpdGVsaXN0AQkApQgBCAUBaQZjYWxsZXIGCQAAAggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECGEludmFsaWQgYWRkTG9ja2VkIHBhcmFtcwQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQp2YXVsdEFzc2V0AAkBEWFzc2V0RnJvbURlY2ltYWxzAQUHX2Ftb3VudAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJARN1cGRhdGVMb2NrZWRCYWxhbmNlAQUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVleGNoYW5nZUZyZWVBbmRMb2NrZWQBB19hbW91bnQDAwkBASEBCQELaW5pdGlhbGl6ZWQABgMJAQEhAQkBC2lzV2hpdGVsaXN0AQkApQgBCAUBaQZjYWxsZXIJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAHCQACAQIkSW52YWxpZCBleGNoYW5nZUZyZWVBbmRMb2NrZWQgcGFyYW1zBBJhbW91bnRPZlF1b3RlQXNzZXQJAQ9hc3NldFRvRGVjaW1hbHMBBQdfYW1vdW50BAduZXdSYXRlCQEOY29tcHV0ZU5ld1JhdGUBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkAzggCCQDOCAIJARN1cGRhdGVMb2NrZWRCYWxhbmNlAQUSYW1vdW50T2ZRdW90ZUFzc2V0CQERdXBkYXRlRnJlZUJhbGFuY2UBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkBCnVwZGF0ZVJhdGUBBQduZXdSYXRlAWkBDndpdGhkcmF3TG9ja2VkAQdfYW1vdW50AwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQBnAgAABQdfYW1vdW50BgkBASEBCQELaXNXaGl0ZWxpc3QBCQClCAEIBQFpBmNhbGxlcgkAAgECHUludmFsaWQgd2l0aGRyYXdMb2NrZWQgcGFyYW1zBBJhbW91bnRPZlF1b3RlQXNzZXQJAQ9hc3NldFRvRGVjaW1hbHMBBQdfYW1vdW50BAd1bnN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACCHdpdGhkcmF3CQDMCAIJAQ12YXVsdEFzc2V0U3RyAAkAzAgCCQERYXNzZXRGcm9tRGVjaW1hbHMBBRJhbW91bnRPZlF1b3RlQXNzZXQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAM4IAgkBE3VwZGF0ZUxvY2tlZEJhbGFuY2UBCQEBLQEFEmFtb3VudE9mUXVvdGVBc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJARFhc3NldEZyb21EZWNpbWFscwEFEmFtb3VudE9mUXVvdGVBc3NldAkBCnZhdWx0QXNzZXQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkUmV3YXJkcwADAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBD2dvdmVybmFuY2VBc3NldAAGCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAhlJbnZhbGlkIGFkZFJld2FyZHMgcGFyYW1zBAdfcmV3YXJkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQICQEMdXBkYXRlUmV3YXJkAgUKTk9fQUREUkVTUwUJTk9fU1RBS0VSAl8xBAl0aW1lc3RhbXAJARNjdXJyZW50VGltZXN0YW1wU2VjAAQNbmV3UmV3YXJkUmF0ZQMJAGYCBQl0aW1lc3RhbXAJAQxwZXJpb2RGaW5pc2gACQBpAgUHX3Jld2FyZAUIRFVSQVRJT04EDXJlbWFpbmluZ1RpbWUJAGUCCQEMcGVyaW9kRmluaXNoAAUJdGltZXN0YW1wBAhsZWZ0b3ZlcgkAaAIJAQpyZXdhcmRSYXRlAAUNcmVtYWluaW5nVGltZQkAaQIJAGQCBQdfcmV3YXJkBQhsZWZ0b3ZlcgUIRFVSQVRJT04JAM4IAgkAzggCCQDOCAIJARB1cGRhdGVSZXdhcmRSYXRlAQUNbmV3UmV3YXJkUmF0ZQkBGnVwZGF0ZVJld2FyZFBlclRva2VuU3RvcmVkAQUXbmV3UmV3YXJkUGVyVG9rZW5TdG9yZWQJARN1cGRhdGVSZXdhcmRCYWxhbmNlAQUHX3Jld2FyZAkBCnVwZGF0ZVRpbWUCBQl0aW1lc3RhbXAJAGQCBQl0aW1lc3RhbXAFCERVUkFUSU9OAWkBCmFja1Jld2FyZHMABApwcm9maXRSZXNwCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACC2NsYWltUHJvZml0CQDMCAIJAQ12YXVsdEFzc2V0U3RyAAUDbmlsBQNuaWwDCQAAAgUKcHJvZml0UmVzcAUKcHJvZml0UmVzcAQGcHJvZml0BAckbWF0Y2gwBQpwcm9maXRSZXNwAwkAAQIFByRtYXRjaDACA0ludAQBcAUHJG1hdGNoMAkBD2Fzc2V0VG9EZWNpbWFscwEFAXAJAAIBAhxJbnZhbGlkIGNsYWltUHJvZml0IHJlc3BvbnNlBAZyZXN1bHQDCQBmAgUGcHJvZml0AAAEB25ld1JhdGUJAQ5jb21wdXRlTmV3UmF0ZQEFBnByb2ZpdAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKdmF1bHRBc3NldAAJARFhc3NldEZyb21EZWNpbWFscwEFBnByb2ZpdAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAzggCCQERdXBkYXRlRnJlZUJhbGFuY2UBBQZwcm9maXQJAQp1cGRhdGVSYXRlAQUHbmV3UmF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFBnJlc3VsdAUGcmVzdWx0BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdmlld19yZXdhcmQBB19zdGFrZXIEB2JhbGFuY2UJAQliYWxhbmNlT2YBBQdfc3Rha2VyBA9kZXBvc2l0ZWRBbW91bnQJAQRtdWxkAgkBC2F2ZXJhZ2VSYXRlAQUHX3N0YWtlcgUHYmFsYW5jZQQNY3VycmVudEFtb3VudAkBBG11bGQCCQEEcmF0ZQAFB2JhbGFuY2UEC2Vhcm5lZFF1b3RlCQBlAgUNY3VycmVudEFtb3VudAUPZGVwb3NpdGVkQW1vdW50CQACAQkApAMBBQtlYXJuZWRRdW90ZQFpARJ2aWV3X3N0YWtpbmdSZXdhcmQBB19zdGFrZXIEDHN0YWtlckVhcm5lZAgJAQx1cGRhdGVSZXdhcmQCBQdfc3Rha2VyAAACXzMJAAIBCQCkAwEJARFhc3NldEZyb21EZWNpbWFscwEFDHN0YWtlckVhcm5lZAFpARJ2aWV3X3dpdGhkcmF3TGltaXQBB19zdGFrZXIEEXdpdGhkcmF3TGltaXRMZWZ0CAkBFGdldFdpdGhkcmF3TGltaXRMZWZ0AQUHX3N0YWtlcgJfMgQMbGltaXRJbkFzc2V0CQERYXNzZXRGcm9tRGVjaW1hbHMBCQEEbXVsZAIFEXdpdGhkcmF3TGltaXRMZWZ0CQEEcmF0ZQAJAAIBCQCkAwEFDGxpbWl0SW5Bc3NldAECdHgBBnZlcmlmeQAEDmNvb3JkaW5hdG9yU3RyCQCdCAIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAwkBCWlzRGVmaW5lZAEFDmNvb3JkaW5hdG9yU3RyBAVhZG1pbgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQ5jb29yZGluYXRvclN0cgUPa19hZG1pbl9hZGRyZXNzAwkBCWlzRGVmaW5lZAEFBWFkbWluCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBWFkbWluCQCsAgIJAKwCAgkArAICAgdzdGF0dXNfCQClCAEFBHRoaXMCAV8JANgEAQgFAnR4AmlkBwkAAgECLnVuYWJsZSB0byB2ZXJpZnk6IGFkbWluIG5vdCBzZXQgaW4gY29vcmRpbmF0b3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkYfeCM", "height": 2590562, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FgEFR76dKziUVmoiVZAmv74D6YtFhGG2nrJJTfs8H1f Next: 2V66ayuceomPtycJq1dZKenYVewFUuAR3XRcxwPU6bi4 Diff:
OldNewDifferences
329329
330330
331331 @Callable(i)
332+func migrate () = if ((i.caller != adminAddress()))
333+ then throw("Invalid migrate parameters")
334+ else {
335+ let _vaultAsset = toBase58String(quoteAsset())
336+ let assetDecimals = if ((_vaultAsset == "WAVES"))
337+ then 8
338+ else {
339+ let info = valueOrErrorMessage(assetInfo(fromBase58String(_vaultAsset)), ("Invalid token id: " + _vaultAsset))
340+ info.decimals
341+ }
342+[StringEntry(k_vaultAsset, _vaultAsset), IntegerEntry(k_vaultAssetDecimals, assetDecimals), IntegerEntry(k_maxSpotUtilization, 0)]
343+ }
344+
345+
346+
347+@Callable(i)
332348 func initialize (_coordinator,_vaultAsset,_maxSpotUtilization) = if (if (if (if (initialized())
333349 then true
334350 else (i.caller != this))
360376 else !(initialized()))
361377 then throw("Invalid call to stake")
362378 else {
363- let $t01253712766 = updateReward(_staker, 0)
364- let newRewardPerTokenStored = $t01253712766._1
365- let newLastUpdateTime = $t01253712766._2
366- let stakerEarned = $t01253712766._3
367- let stakerRewardPerTokenPaid = $t01253712766._4
379+ let $t01314713376 = updateReward(_staker, 0)
380+ let newRewardPerTokenStored = $t01314713376._1
381+ let newLastUpdateTime = $t01314713376._2
382+ let stakerEarned = $t01314713376._3
383+ let stakerRewardPerTokenPaid = $t01314713376._4
368384 let currentRate = rate()
369385 let prevAverageRate = averageRate(_staker)
370386 let vAmount = divd(_amount, currentRate)
391407 else !(initialized()))
392408 then throw("Invalid call to unStake")
393409 else {
394- let $t01427414490 = updateReward(_staker, 0)
395- let newRewardPerTokenStored = $t01427414490._1
396- let newLastUpdateTime = $t01427414490._2
397- let stakerEarned = $t01427414490._3
398- let stakerRewardPerTokenPaid = $t01427414490._4
399- let $t01449714664 = getWithdrawLimitLeft(_staker)
400- let newLastWithdrawnDate = $t01449714664._1
401- let withdrawLimitLeft = $t01449714664._2
402- let alreadyWithdrawnInPeriod = $t01449714664._3
410+ let $t01488415100 = updateReward(_staker, 0)
411+ let newRewardPerTokenStored = $t01488415100._1
412+ let newLastUpdateTime = $t01488415100._2
413+ let stakerEarned = $t01488415100._3
414+ let stakerRewardPerTokenPaid = $t01488415100._4
415+ let $t01510715274 = getWithdrawLimitLeft(_staker)
416+ let newLastWithdrawnDate = $t01510715274._1
417+ let withdrawLimitLeft = $t01510715274._2
418+ let alreadyWithdrawnInPeriod = $t01510715274._3
403419 let vAmount = divd(amountOfQuoteAsset, rate())
404420 if ((vAmount > withdrawLimitLeft))
405421 then throw("Invalid call to unStake: withdraw over limit")
422438 @Callable(i)
423439 func withdrawRewards () = {
424440 let _staker = toString(i.caller)
425- let $t01618116326 = updateReward(_staker, 0)
426- let newRewardPerTokenStored = $t01618116326._1
427- let newLastUpdateTime = $t01618116326._2
428- let stakerEarned = $t01618116326._3
429- let stakerRewardPerTokenPaid = $t01618116326._4
441+ let $t01679116936 = updateReward(_staker, 0)
442+ let newRewardPerTokenStored = $t01679116936._1
443+ let newLastUpdateTime = $t01679116936._2
444+ let stakerEarned = $t01679116936._3
445+ let stakerRewardPerTokenPaid = $t01679116936._4
430446 if (if ((0 >= stakerEarned))
431447 then true
432448 else !(initialized()))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_totalSupply = "k_totalSupply"
55
66 let k_rewardBalance = "k_rewardBalance"
77
88 let k_lockedBalance = "k_lockedBalance"
99
1010 let k_freeBalance = "k_freeBalance"
1111
1212 let k_excessBalance = "k_excessBalance"
1313
1414 let k_vaultAsset = "k_vaultAsset"
1515
1616 let k_vaultAssetDecimals = "k_vaultAssetDecimals"
1717
1818 let k_maxSpotUtilization = "k_maxSpotUtilization"
1919
2020 let k_rate = "k_rate"
2121
2222 let k_lastUpdateTime = "k_lastUpdateTime"
2323
2424 let k_rewardPerTokenStored = "k_rewardPerTokenStored"
2525
2626 let k_rewardRate = "k_rewardRate"
2727
2828 let k_periodFinish = "k_periodFinish"
2929
3030 let k_userRewardPerToken = "k_userRewardPerToken"
3131
3232 let k_userReward = "k_userReward"
3333
3434 let k_balance = "k_balance"
3535
3636 let k_average_rate = "k_average_rate"
3737
3838 let k_withdraw_limit = "k_withdraw_limit"
3939
4040 let k_last_withdraw_date = "k_last_withdraw_date"
4141
4242 let k_withdraw_in_period = "k_withdraw_in_period"
4343
4444 let k_initialized = "k_initialized"
4545
4646 let k_coordinatorAddress = "k_coordinatorAddress"
4747
4848 let k_amm = "k_amm"
4949
5050 let k_governance_asset = "k_gov_asset"
5151
5252 let k_quote_asset = "k_quote_asset"
5353
5454 let k_admin_address = "k_admin_address"
5555
5656 let k_manager_address = "k_manager_address"
5757
5858 let k_spot_address = "k_spot_address"
5959
6060 let k_collateral_address = "k_collateral_address"
6161
6262 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
6363
6464
6565 func coordinator () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_coordinatorAddress), "Coordinator not set")), "Coordinator address invalid")
6666
6767
6868 func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
6969
7070
7171 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
7272
7373
7474 func governanceAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_governance_asset), "Governance asset not set"))
7575
7676
7777 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
7878
7979
8080 func vaultAssetStr () = valueOrErrorMessage(getString(this, k_vaultAsset), "Vault asset not set")
8181
8282
8383 func vaultAsset () = {
8484 let _assetIdStr = vaultAssetStr()
8585 if ((_assetIdStr == "WAVES"))
8686 then unit
8787 else fromBase58String(_assetIdStr)
8888 }
8989
9090
9191 func vaultAssetDecimals () = valueOrErrorMessage(getInteger(this, k_vaultAssetDecimals), "Vault asset decimals not set")
9292
9393
9494 func managerAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_manager_address), "Manager address not set")), "Manager address invalid")
9595
9696
9797 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
9898
9999 let DURATION = (((7 * 60) * 60) * 24)
100100
101101 let NO_ADDRESS = ""
102102
103103 let NO_STAKER = 0
104104
105105 func assetFromDecimals (_amount) = {
106106 let assetDecimals = vaultAssetDecimals()
107107 if ((assetDecimals == 6))
108108 then (_amount / 100)
109109 else if ((assetDecimals == 8))
110110 then _amount
111111 else throw("Invalid asset decimals")
112112 }
113113
114114
115115 func assetToDecimals (_amount) = {
116116 let assetDecimals = vaultAssetDecimals()
117117 if ((assetDecimals == 6))
118118 then (_amount * 100)
119119 else if ((assetDecimals == 8))
120120 then _amount
121121 else throw("Invalid asset decimals")
122122 }
123123
124124
125125 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
126126
127127
128128 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
129129
130130
131131 func abs (_x) = if ((_x > 0))
132132 then _x
133133 else -(_x)
134134
135135
136136 func minv (_x,_y) = if ((_x > _y))
137137 then _y
138138 else _x
139139
140140
141141 let WITHDRAW_PERIOD = (86400 * 1000)
142142
143143 let WITHDRAW_PER_PERIOD = divd((1 * DECIMAL_UNIT), (4 * DECIMAL_UNIT))
144144
145145 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
146146
147147
148148 func int0 (k) = valueOrElse(getInteger(this, k), 0)
149149
150150
151151 func int1 (k) = valueOrElse(getInteger(this, k), DECIMAL_UNIT)
152152
153153
154154 func totalSupply () = int0(k_totalSupply)
155155
156156
157157 func rate () = int1(k_rate)
158158
159159
160160 func balanceOf (_staker) = int0(toCompositeKey(k_balance, _staker))
161161
162162
163163 func averageRate (_staker) = int0(toCompositeKey(k_average_rate, _staker))
164164
165165
166166 func withdrawLimit (_staker) = int0(toCompositeKey(k_withdraw_limit, _staker))
167167
168168
169169 func withdrawnInPeriod (_staker) = int0(toCompositeKey(k_withdraw_in_period, _staker))
170170
171171
172172 func lastWithdrawnDate (_staker) = int0(toCompositeKey(k_last_withdraw_date, _staker))
173173
174174
175175 func freeBalance () = int0(k_freeBalance)
176176
177177
178178 func lockedBalance () = int0(k_lockedBalance)
179179
180180
181181 func excessBalance () = int0(k_excessBalance)
182182
183183
184184 func rewardPerTokenStored () = int0(k_rewardPerTokenStored)
185185
186186
187187 func lastUpdateTime () = int0(k_lastUpdateTime)
188188
189189
190190 func rewardRate () = int0(k_rewardRate)
191191
192192
193193 func periodFinish () = int0(k_periodFinish)
194194
195195
196196 func rewardBalance () = int0(k_rewardBalance)
197197
198198
199199 func rewards (_staker) = int0(toCompositeKey(k_userReward, _staker))
200200
201201
202202 func userRewardPerTokenPaid (_staker) = int0(toCompositeKey(k_userRewardPerToken, _staker))
203203
204204
205205 func maxSpotUtilization () = int0(k_maxSpotUtilization)
206206
207207
208208 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
209209
210210
211211 func currentTimestamp () = lastBlock.timestamp
212212
213213
214214 func currentTimestampSec () = (currentTimestamp() / 1000)
215215
216216
217217 func getWithdrawLimitLeft (_staker) = {
218218 let currentDate = currentTimestamp()
219219 let lastWithdrawDate = lastWithdrawnDate(_staker)
220220 let $t062676588 = if (((currentDate - lastWithdrawDate) > WITHDRAW_PERIOD))
221221 then $Tuple3(currentDate, withdrawLimit(_staker), 0)
222222 else $Tuple3(lastWithdrawDate, (withdrawLimit(_staker) - withdrawnInPeriod(_staker)), withdrawnInPeriod(_staker))
223223 let newLastWithdrawnDate = $t062676588._1
224224 let withdrawLimitLeft = $t062676588._2
225225 let alreadyWithdrawnInPeriod = $t062676588._3
226226 $Tuple3(newLastWithdrawnDate, withdrawLimitLeft, alreadyWithdrawnInPeriod)
227227 }
228228
229229
230230 func computeNewRate (_amountOfQuoteAsset) = {
231231 let newRate = if ((totalSupply() > 0))
232232 then divd((freeBalance() + _amountOfQuoteAsset), totalSupply())
233233 else DECIMAL_UNIT
234234 newRate
235235 }
236236
237237
238238 func lastTimeRewardApplicable () = minv(currentTimestampSec(), periodFinish())
239239
240240
241241 func rewardPerToken (_balanceDelta) = if (((totalSupply() + _balanceDelta) == 0))
242242 then rewardPerTokenStored()
243243 else {
244244 let timeInterval = (lastTimeRewardApplicable() - lastUpdateTime())
245245 let actualTimeInterval = if ((0 > timeInterval))
246246 then 0
247247 else timeInterval
248248 let diff = divd((rewardRate() * actualTimeInterval), (totalSupply() + _balanceDelta))
249249 (rewardPerTokenStored() + diff)
250250 }
251251
252252
253253 func earned (_staker,_balanceDelta) = {
254254 let rewardDelta = (rewardPerToken(_balanceDelta) - userRewardPerTokenPaid(_staker))
255255 (muld((balanceOf(_staker) + _balanceDelta), rewardDelta) + rewards(_staker))
256256 }
257257
258258
259259 func updateReward (_staker,_balanceDelta) = {
260260 let newRewardPerTokenStored = rewardPerToken(_balanceDelta)
261261 let newLastUpdateTime = currentTimestampSec()
262262 let $t078108002 = if ((_staker != ""))
263263 then $Tuple2(earned(_staker, _balanceDelta), newRewardPerTokenStored)
264264 else $Tuple2(0, 0)
265265 let stakerEarned = $t078108002._1
266266 let stakerRewardPerTokenPaid = $t078108002._2
267267 $Tuple4(newRewardPerTokenStored, newLastUpdateTime, stakerEarned, stakerRewardPerTokenPaid)
268268 }
269269
270270
271271 func updateUserBalance (_user,_change) = if (((balanceOf(_user) + _change) >= 0))
272272 then [IntegerEntry(toCompositeKey(k_balance, _user), (balanceOf(_user) + _change))]
273273 else throw(((("Vault: can not update user balance. Balance: " + toString(balanceOf(_user))) + " change: ") + toString(_change)))
274274
275275
276276 func setUserWithdrawLimit (_user,_rate) = [IntegerEntry(toCompositeKey(k_withdraw_limit, _user), _rate)]
277277
278278
279279 func setUserAverageRate (_user,_rate) = [IntegerEntry(toCompositeKey(k_average_rate, _user), _rate)]
280280
281281
282282 func updateFreeBalance (_change) = {
283283 let balance = freeBalance()
284284 if (((balance + _change) >= 0))
285285 then [IntegerEntry(k_freeBalance, (balance + _change))]
286286 else throw(((("Vault: can not update free balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
287287 }
288288
289289
290290 func updateLockedBalance (_change) = {
291291 let balance = lockedBalance()
292292 if (((balance + _change) >= 0))
293293 then [IntegerEntry(k_lockedBalance, (balance + _change))]
294294 else throw(((("Vault: can not update locked balance. Balance: " + toString(balance)) + " change: ") + toString(_change)))
295295 }
296296
297297
298298 func updateExcessBalance (_change) = {
299299 let newImbalance = (excessBalance() + _change)
300300 let utilizationRate = divd(abs(newImbalance), freeBalance())
301301 if ((maxSpotUtilization() > utilizationRate))
302302 then [IntegerEntry(k_excessBalance, newImbalance)]
303303 else throw(((((((("Vault: can not update excess balance. Balance: " + toString(excessBalance())) + " change: ") + toString(_change)) + " utilization rate: ") + toString(utilizationRate)) + " max utilization rate: ") + toString(maxSpotUtilization())))
304304 }
305305
306306
307307 func updateTotalSupply (_change) = [IntegerEntry(k_totalSupply, (totalSupply() + _change))]
308308
309309
310310 func updateRate (_rate) = [IntegerEntry(k_rate, _rate)]
311311
312312
313313 func setUserWithdrawParams (_user,_lastWithdrawDate,_withdrawn) = [IntegerEntry(toCompositeKey(k_last_withdraw_date, _user), _lastWithdrawDate), IntegerEntry(toCompositeKey(k_withdraw_in_period, _user), _withdrawn)]
314314
315315
316316 func updateRewardBalance (_delta) = [IntegerEntry(k_rewardBalance, (rewardBalance() + _delta))]
317317
318318
319319 func updateRewardRate (_rewardRate) = [IntegerEntry(k_rewardRate, _rewardRate)]
320320
321321
322322 func updateTime (_lastUpdateTime,_periodFinish) = [IntegerEntry(k_lastUpdateTime, _lastUpdateTime), IntegerEntry(k_periodFinish, _periodFinish)]
323323
324324
325325 func updateRewardPerTokenStored (_rewardPerTokenStored) = [IntegerEntry(k_rewardPerTokenStored, _rewardPerTokenStored)]
326326
327327
328328 func updateUserRewards (_staker,_reward,_userRewardPerToken) = [IntegerEntry(toCompositeKey(k_userReward, _staker), _reward), IntegerEntry(toCompositeKey(k_userRewardPerToken, _staker), _userRewardPerToken)]
329329
330330
331331 @Callable(i)
332+func migrate () = if ((i.caller != adminAddress()))
333+ then throw("Invalid migrate parameters")
334+ else {
335+ let _vaultAsset = toBase58String(quoteAsset())
336+ let assetDecimals = if ((_vaultAsset == "WAVES"))
337+ then 8
338+ else {
339+ let info = valueOrErrorMessage(assetInfo(fromBase58String(_vaultAsset)), ("Invalid token id: " + _vaultAsset))
340+ info.decimals
341+ }
342+[StringEntry(k_vaultAsset, _vaultAsset), IntegerEntry(k_vaultAssetDecimals, assetDecimals), IntegerEntry(k_maxSpotUtilization, 0)]
343+ }
344+
345+
346+
347+@Callable(i)
332348 func initialize (_coordinator,_vaultAsset,_maxSpotUtilization) = if (if (if (if (initialized())
333349 then true
334350 else (i.caller != this))
335351 then true
336352 else (0 > _maxSpotUtilization))
337353 then true
338354 else (_maxSpotUtilization > DECIMAL_UNIT))
339355 then throw("Unable to initialize")
340356 else {
341357 let assetDecimals = if ((_vaultAsset == "WAVES"))
342358 then 8
343359 else {
344360 let info = valueOrErrorMessage(assetInfo(fromBase58String(_vaultAsset)), ("Invalid token id: " + _vaultAsset))
345361 info.decimals
346362 }
347363 [StringEntry(k_coordinatorAddress, toString(valueOrErrorMessage(addressFromString(_coordinator), "Invalid coordinator address"))), StringEntry(k_vaultAsset, _vaultAsset), IntegerEntry(k_vaultAssetDecimals, assetDecimals), IntegerEntry(k_maxSpotUtilization, _maxSpotUtilization), BooleanEntry(k_initialized, true)]
348364 }
349365
350366
351367
352368 @Callable(i)
353369 func stake () = {
354370 let _staker = toString(i.caller)
355371 let _amount = assetToDecimals(i.payments[0].amount)
356372 if (if (if ((i.payments[0].assetId != vaultAsset()))
357373 then true
358374 else (size(i.payments) != 1))
359375 then true
360376 else !(initialized()))
361377 then throw("Invalid call to stake")
362378 else {
363- let $t01253712766 = updateReward(_staker, 0)
364- let newRewardPerTokenStored = $t01253712766._1
365- let newLastUpdateTime = $t01253712766._2
366- let stakerEarned = $t01253712766._3
367- let stakerRewardPerTokenPaid = $t01253712766._4
379+ let $t01314713376 = updateReward(_staker, 0)
380+ let newRewardPerTokenStored = $t01314713376._1
381+ let newLastUpdateTime = $t01314713376._2
382+ let stakerEarned = $t01314713376._3
383+ let stakerRewardPerTokenPaid = $t01314713376._4
368384 let currentRate = rate()
369385 let prevAverageRate = averageRate(_staker)
370386 let vAmount = divd(_amount, currentRate)
371387 let newAverageRate = divd((muld(vAmount, currentRate) + muld(balanceOf(_staker), prevAverageRate)), (vAmount + balanceOf(_staker)))
372388 let newTotalBalance = (vAmount + balanceOf(_staker))
373389 let newWithdrawLimit = muld(newTotalBalance, WITHDRAW_PER_PERIOD)
374390 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(vaultAsset(), assetFromDecimals(_amount))])
375391 if ((stake == stake))
376392 then (((((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateFreeBalance(_amount)) ++ updateUserBalance(_staker, vAmount)) ++ setUserAverageRate(_staker, newAverageRate)) ++ setUserWithdrawLimit(_staker, newWithdrawLimit)) ++ updateTotalSupply(vAmount))
377393 else throw("Strict value is not equal to itself.")
378394 }
379395 }
380396
381397
382398
383399 @Callable(i)
384400 func unStake (_amount) = {
385401 let _staker = toString(i.caller)
386402 let amountOfQuoteAsset = assetToDecimals(_amount)
387403 if (if (if ((i.payments != nil))
388404 then true
389405 else (0 >= amountOfQuoteAsset))
390406 then true
391407 else !(initialized()))
392408 then throw("Invalid call to unStake")
393409 else {
394- let $t01427414490 = updateReward(_staker, 0)
395- let newRewardPerTokenStored = $t01427414490._1
396- let newLastUpdateTime = $t01427414490._2
397- let stakerEarned = $t01427414490._3
398- let stakerRewardPerTokenPaid = $t01427414490._4
399- let $t01449714664 = getWithdrawLimitLeft(_staker)
400- let newLastWithdrawnDate = $t01449714664._1
401- let withdrawLimitLeft = $t01449714664._2
402- let alreadyWithdrawnInPeriod = $t01449714664._3
410+ let $t01488415100 = updateReward(_staker, 0)
411+ let newRewardPerTokenStored = $t01488415100._1
412+ let newLastUpdateTime = $t01488415100._2
413+ let stakerEarned = $t01488415100._3
414+ let stakerRewardPerTokenPaid = $t01488415100._4
415+ let $t01510715274 = getWithdrawLimitLeft(_staker)
416+ let newLastWithdrawnDate = $t01510715274._1
417+ let withdrawLimitLeft = $t01510715274._2
418+ let alreadyWithdrawnInPeriod = $t01510715274._3
403419 let vAmount = divd(amountOfQuoteAsset, rate())
404420 if ((vAmount > withdrawLimitLeft))
405421 then throw("Invalid call to unStake: withdraw over limit")
406422 else {
407423 let newWithdrawnInPeriod = (alreadyWithdrawnInPeriod + vAmount)
408424 if ((amountOfQuoteAsset > freeBalance()))
409425 then throw("Invalid call to unStake: balance too low")
410426 else {
411427 let unstake = invoke(managerAddress(), "withdraw", [vaultAssetStr(), assetFromDecimals(amountOfQuoteAsset)], nil)
412428 if ((unstake == unstake))
413429 then (((((((updateUserRewards(_staker, stakerEarned, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateFreeBalance(-(amountOfQuoteAsset))) ++ updateUserBalance(_staker, -(vAmount))) ++ updateTotalSupply(-(vAmount))) ++ setUserWithdrawParams(_staker, newLastWithdrawnDate, newWithdrawnInPeriod)) ++ [ScriptTransfer(i.caller, assetFromDecimals(amountOfQuoteAsset), vaultAsset())])
414430 else throw("Strict value is not equal to itself.")
415431 }
416432 }
417433 }
418434 }
419435
420436
421437
422438 @Callable(i)
423439 func withdrawRewards () = {
424440 let _staker = toString(i.caller)
425- let $t01618116326 = updateReward(_staker, 0)
426- let newRewardPerTokenStored = $t01618116326._1
427- let newLastUpdateTime = $t01618116326._2
428- let stakerEarned = $t01618116326._3
429- let stakerRewardPerTokenPaid = $t01618116326._4
441+ let $t01679116936 = updateReward(_staker, 0)
442+ let newRewardPerTokenStored = $t01679116936._1
443+ let newLastUpdateTime = $t01679116936._2
444+ let stakerEarned = $t01679116936._3
445+ let stakerRewardPerTokenPaid = $t01679116936._4
430446 if (if ((0 >= stakerEarned))
431447 then true
432448 else !(initialized()))
433449 then throw("No reward: Vault")
434450 else ((((updateUserRewards(_staker, 0, stakerRewardPerTokenPaid) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateTime(newLastUpdateTime, periodFinish())) ++ updateRewardBalance(-(stakerEarned))) ++ [ScriptTransfer(i.caller, stakerEarned, governanceAsset())])
435451 }
436452
437453
438454
439455 @Callable(i)
440456 func addFree () = {
441457 let _amount = assetToDecimals(i.payments[0].amount)
442458 if (if (if (if ((i.payments[0].assetId != vaultAsset()))
443459 then true
444460 else (size(i.payments) != 1))
445461 then true
446462 else !(initialized()))
447463 then true
448464 else !(if (isWhitelist(toString(i.caller)))
449465 then true
450466 else (i.caller == adminAddress())))
451467 then throw("Invalid addFree params")
452468 else {
453469 let newRate = computeNewRate(_amount)
454470 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(vaultAsset(), assetFromDecimals(_amount))])
455471 if ((stake == stake))
456472 then (updateFreeBalance(_amount) ++ updateRate(newRate))
457473 else throw("Strict value is not equal to itself.")
458474 }
459475 }
460476
461477
462478
463479 @Callable(i)
464480 func addLocked () = {
465481 let _amount = assetToDecimals(i.payments[0].amount)
466482 if (if (if (if ((i.payments[0].assetId != vaultAsset()))
467483 then true
468484 else (size(i.payments) != 1))
469485 then true
470486 else !(initialized()))
471487 then true
472488 else !(if (isWhitelist(toString(i.caller)))
473489 then true
474490 else (i.caller == adminAddress())))
475491 then throw("Invalid addLocked params")
476492 else {
477493 let unstake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(vaultAsset(), assetFromDecimals(_amount))])
478494 if ((unstake == unstake))
479495 then updateLockedBalance(_amount)
480496 else throw("Strict value is not equal to itself.")
481497 }
482498 }
483499
484500
485501
486502 @Callable(i)
487503 func exchangeFreeAndLocked (_amount) = if (if (!(initialized()))
488504 then true
489505 else if (!(isWhitelist(toString(i.caller))))
490506 then (i.caller != adminAddress())
491507 else false)
492508 then throw("Invalid exchangeFreeAndLocked params")
493509 else {
494510 let amountOfQuoteAsset = assetToDecimals(_amount)
495511 let newRate = computeNewRate(-(amountOfQuoteAsset))
496512 ((updateLockedBalance(amountOfQuoteAsset) ++ updateFreeBalance(-(amountOfQuoteAsset))) ++ updateRate(newRate))
497513 }
498514
499515
500516
501517 @Callable(i)
502518 func withdrawLocked (_amount) = if (if (if (!(initialized()))
503519 then true
504520 else (0 >= _amount))
505521 then true
506522 else !(isWhitelist(toString(i.caller))))
507523 then throw("Invalid withdrawLocked params")
508524 else {
509525 let amountOfQuoteAsset = assetToDecimals(_amount)
510526 let unstake = invoke(managerAddress(), "withdraw", [vaultAssetStr(), assetFromDecimals(amountOfQuoteAsset)], nil)
511527 if ((unstake == unstake))
512528 then (updateLockedBalance(-(amountOfQuoteAsset)) ++ [ScriptTransfer(i.caller, assetFromDecimals(amountOfQuoteAsset), vaultAsset())])
513529 else throw("Strict value is not equal to itself.")
514530 }
515531
516532
517533
518534 @Callable(i)
519535 func addRewards () = if (if (if ((i.payments[0].assetId != governanceAsset()))
520536 then true
521537 else (size(i.payments) != 1))
522538 then true
523539 else !(initialized()))
524540 then throw("Invalid addRewards params")
525541 else {
526542 let _reward = i.payments[0].amount
527543 let newRewardPerTokenStored = updateReward(NO_ADDRESS, NO_STAKER)._1
528544 let timestamp = currentTimestampSec()
529545 let newRewardRate = if ((timestamp > periodFinish()))
530546 then (_reward / DURATION)
531547 else {
532548 let remainingTime = (periodFinish() - timestamp)
533549 let leftover = (rewardRate() * remainingTime)
534550 ((_reward + leftover) / DURATION)
535551 }
536552 (((updateRewardRate(newRewardRate) ++ updateRewardPerTokenStored(newRewardPerTokenStored)) ++ updateRewardBalance(_reward)) ++ updateTime(timestamp, (timestamp + DURATION)))
537553 }
538554
539555
540556
541557 @Callable(i)
542558 func ackRewards () = {
543559 let profitResp = invoke(managerAddress(), "claimProfit", [vaultAssetStr()], nil)
544560 if ((profitResp == profitResp))
545561 then {
546562 let profit = match profitResp {
547563 case p: Int =>
548564 assetToDecimals(p)
549565 case _ =>
550566 throw("Invalid claimProfit response")
551567 }
552568 let result = if ((profit > 0))
553569 then {
554570 let newRate = computeNewRate(profit)
555571 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(vaultAsset(), assetFromDecimals(profit))])
556572 if ((stake == stake))
557573 then (updateFreeBalance(profit) ++ updateRate(newRate))
558574 else throw("Strict value is not equal to itself.")
559575 }
560576 else nil
561577 if ((result == result))
562578 then result
563579 else throw("Strict value is not equal to itself.")
564580 }
565581 else throw("Strict value is not equal to itself.")
566582 }
567583
568584
569585
570586 @Callable(i)
571587 func view_reward (_staker) = {
572588 let balance = balanceOf(_staker)
573589 let depositedAmount = muld(averageRate(_staker), balance)
574590 let currentAmount = muld(rate(), balance)
575591 let earnedQuote = (currentAmount - depositedAmount)
576592 throw(toString(earnedQuote))
577593 }
578594
579595
580596
581597 @Callable(i)
582598 func view_stakingReward (_staker) = {
583599 let stakerEarned = updateReward(_staker, 0)._3
584600 throw(toString(assetFromDecimals(stakerEarned)))
585601 }
586602
587603
588604
589605 @Callable(i)
590606 func view_withdrawLimit (_staker) = {
591607 let withdrawLimitLeft = getWithdrawLimitLeft(_staker)._2
592608 let limitInAsset = assetFromDecimals(muld(withdrawLimitLeft, rate()))
593609 throw(toString(limitInAsset))
594610 }
595611
596612
597613 @Verifier(tx)
598614 func verify () = {
599615 let coordinatorStr = getString(this, k_coordinatorAddress)
600616 if (isDefined(coordinatorStr))
601617 then {
602618 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
603619 if (isDefined(admin))
604620 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
605621 else throw("unable to verify: admin not set in coordinator")
606622 }
607623 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
608624 }
609625

github/deemru/w8io/873ac7e 
68.33 ms