tx · CmwuR2kWyenmUFDs9cwBVzwkYLEAT532bZ5Rir33Ro38

3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G:  -0.03700000 Waves

2023.05.27 19:08 [2596590] smart account 3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G > SELF 0.00000000 Waves

{ "type": 13, "id": "CmwuR2kWyenmUFDs9cwBVzwkYLEAT532bZ5Rir33Ro38", "fee": 3700000, "feeAssetId": null, "timestamp": 1685203690007, "version": 2, "chainId": 84, "sender": "3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G", "senderPublicKey": "7SdMpYYBFTqnnyr31oEmHeJfFTa3aGnwocRuvfEhpyoh", "proofs": [ "2yEEbgjj6TxtUD8u17Y1KDKWEE2m8J4KJJxK3QecWqMWZi9gEV42WrexVVwtePxkxkdhUNMpCao6qyUBonKATkQZ" ], "script": "base64:BgI7CAISABIAEgUKAwEBARIGCgQICAgIEgMKAQgSBgoECAEBARIECgIIARIECgIIARIECgIIARIFCgMBCAg3AA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAhrX3BhdXNlZAIIa19wYXVzZWQABWtfZmVlAgVrX2ZlZQAIa19yZWJhdGUCCGtfcmViYXRlABVrX2ZlZVRvU3Rha2Vyc1BlcmNlbnQCFWtfZmVlVG9TdGFrZXJzUGVyY2VudAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzAA5rX3Jld2FyZF9hc3NldAIOa19yZXdhcmRfYXNzZXQADmtfc3dhcF9hZGRyZXNzAg5rX3N3YXBfYWRkcmVzcwARa19zdGFraW5nX2FkZHJlc3MCEWtfc3Rha2luZ19hZGRyZXNzAA9rX2V4Y2Vzc0JhbGFuY2UCD2tfZXhjZXNzQmFsYW5jZQANa19mcmVlQmFsYW5jZQINa19mcmVlQmFsYW5jZQAUa19tYXhTcG90VXRpbGl6YXRpb24CFGtfbWF4U3BvdFV0aWxpemF0aW9uABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABNrX3RvdGFsUG9zaXRpb25TaXplAhNrX3RvdGFsUG9zaXRpb25TaXplAAVrX2FtbQIFa19hbW0AB2tfdmF1bHQCB2tfdmF1bHQACmtfYW1tX2RhdGECCmtfYW1tX2RhdGEADWtfYXNzZXRfdmF1bHQCDWtfYXNzZXRfdmF1bHQAC2tfYXNzZXRfYW1tAgtrX2Fzc2V0X2FtbQAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAELcmV3YXJkQXNzZXQACQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ5rX3Jld2FyZF9hc3NldAIUUmV3YXJkIGFzc2V0IG5vdCBzZXQBC3N3YXBBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABQ5rX3N3YXBfYWRkcmVzcwIUU3dhcCBhZGRyZXNzIG5vdCBzZXQCFFN3YXAgYWRkcmVzcyBpbnZhbGlkARFnZXRBZGRyZXNzSWZWYWxpZAEHYWRkcmVzcwkApQgBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHYWRkcmVzcwkArAICCQCsAgICDUNhbid0IHBhcnNlICIFB2FkZHJlc3MCDCIgYXMgYWRkcmVzcwAPREVDSU1BTF9OVU1CRVJTAAYADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBHZtYXgCAl94Al95AwkAZwIFAl94BQJfeQUCX3gFAl95AQR2bWluAgJfeAJfeQMJAGcCBQJfeQUCX3gFAl94BQJfeQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQNmZWUACQEDaW50AQUFa19mZWUBCWZlZVJlYmF0ZQAJAQNpbnQBBQhrX3JlYmF0ZQETZmVlVG9TdGFrZXJzUGVyY2VudAAJAQNpbnQBBRVrX2ZlZVRvU3Rha2Vyc1BlcmNlbnQBDmdldE1hcmtldE1heWJlAQhfYXNzZXRJZAQKYWRkcmVzc1N0cgkAnQgCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQtrX2Fzc2V0X2FtbQUIX2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQV2YWx1ZQEFCmFkZHJlc3NTdHIJAKwCAgIbSW52YWxpZCB2YXVsdCBhZGRyZXNzIGZvcjogBQhfYXNzZXRJZAUEdW5pdAENZ2V0VmF1bHRNYXliZQEIX2Fzc2V0SWQECmFkZHJlc3NTdHIJAJ0IAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUNa19hc3NldF92YXVsdAUIX2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQV2YWx1ZQEFCmFkZHJlc3NTdHIJAKwCAgIcSW52YWxpZCBtYXJrZXQgYWRkcmVzcyBmb3I6IAUIX2Fzc2V0SWQFBHVuaXQBCWdldE1hcmtldAEIX2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldE1hcmtldE1heWJlAQUIX2Fzc2V0SWQJAKwCAgIPTm8gbWFya2V0IGZvcjogBQhfYXNzZXRJZAEIZ2V0VmF1bHQBCF9hc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ1nZXRWYXVsdE1heWJlAQUIX2Fzc2V0SWQJAKwCAgIOTm8gdmF1bHQgZm9yOiAFCF9hc3NldElkARBnZXRFeGNlc3NCYWxhbmNlAQZfdmF1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUGX3ZhdWx0BQ9rX2V4Y2Vzc0JhbGFuY2UAAAEOZ2V0RnJlZUJhbGFuY2UBBl92YXVsdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQZfdmF1bHQFDWtfZnJlZUJhbGFuY2UAAAERZ2V0TWF4VXRpbGl6YXRpb24BBl92YXVsdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBl92YXVsdAUUa19tYXhTcG90VXRpbGl6YXRpb24JAKwCAgIiTWF4IHNwb3QgdXRpbGl6YXRpb24gbm90IHNldCBmb3I6IAkApQgBBQZfdmF1bHQBEWdldE1heFByaWNlU3ByZWFkAQRfYW1tCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEX2FtbQUQa19tYXhQcmljZVNwcmVhZAkArAICAh5NYXggcHJpY2Ugc3ByZWFkIG5vdCBzZXQgZm9yOiAJAKUIAQUEX2FtbQEoZ2V0T2xkUHJvamVjdGVkTGlxdWlkaXR5QW5kVGVybWluYWxQcmljZQEEX2FtbQQEc3luYwkA/AcEBQRfYW1tAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAZwcmljZVIJAPwHBAUEX2FtbQIXY29tcHV0ZVRlcm1pbmFsQW1tUHJpY2UFA25pbAUDbmlsAwkAAAIFBnByaWNlUgUGcHJpY2VSBAVwcmljZQQHJG1hdGNoMAUGcHJpY2VSAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgEJAKwCAgIrSW52YWxpZCBjb21wdXRlVGVybWluYWxBbW1QcmljZSByZXN1bHQgZm9yIAkApQgBBQRfYW1tBBZjdXJyZW50QmFzZUFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEX2FtbQUSa19iYXNlQXNzZXRSZXNlcnZlCQCsAgIJAKwCAgkArAICAgRLZXkgBRJrX2Jhc2VBc3NldFJlc2VydmUCDSBub3Qgc2V0IGZvciAJAKUIAQUEX2FtbQMJAAACBRZjdXJyZW50QmFzZUFzc2V0QW1vdW50BRZjdXJyZW50QmFzZUFzc2V0QW1vdW50BBRiYXNlQXNzZXRBbW91bnREZWx0YQkBC3ZhbHVlT3JFbHNlAgkAmggCBQRfYW1tBRNrX3RvdGFsUG9zaXRpb25TaXplAAADCQAAAgUUYmFzZUFzc2V0QW1vdW50RGVsdGEFFGJhc2VBc3NldEFtb3VudERlbHRhBBBxdW90ZUFzc2V0V2VpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBF9hbW0FEmtfcXVvdGVBc3NldFdlaWdodAUMREVDSU1BTF9VTklUAwkAAAIFEHF1b3RlQXNzZXRXZWlnaHQFEHF1b3RlQXNzZXRXZWlnaHQJAJUKAwkAZAIFFmN1cnJlbnRCYXNlQXNzZXRBbW91bnQFFGJhc2VBc3NldEFtb3VudERlbHRhBQVwcmljZQUQcXVvdGVBc3NldFdlaWdodAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0SW1iYWxhbmNlQ29zdFVTRAQGX3ZhdWx0BF9hbW0JX2RlY2ltYWxzB19hbW91bnQEBmFtb3VudAMJAAACBQlfZGVjaW1hbHMACAUHX2Ftb3VudAMJAAACBQlfZGVjaW1hbHMABgkAaAIFB19hbW91bnQAZAkAAgECEEludmFsaWQgZGVjaW1hbHMEDG9sZEltYmFsYW5jZQkBEGdldEV4Y2Vzc0JhbGFuY2UBBQZfdmF1bHQEDG5ld0ltYmFsYW5jZQkAZAIFDG9sZEltYmFsYW5jZQUGYW1vdW50BBtpbWJhbGFuY2VEZWx0YUluQW1tRGVjaW1hbHMJAGkCCQBlAgkBA2FicwEFDG5ld0ltYmFsYW5jZQkBA2FicwEFDG9sZEltYmFsYW5jZQBkBAZwcmljZVIJAPwHBAUEX2FtbQIQY29tcHV0ZVNwb3RQcmljZQUDbmlsBQNuaWwDCQAAAgUGcHJpY2VSBQZwcmljZVIEBXByaWNlBAckbWF0Y2gwBQZwcmljZVIDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQkArAICAiRJbnZhbGlkIGNvbXB1dGVTcG90UHJpY2UgcmVzdWx0IGZvciAJAKUIAQUEX2FtbQQTaW1iYWxhbmNlRGVsdGFJblVTRAkBBG11bGQCBRtpbWJhbGFuY2VEZWx0YUluQW1tRGVjaW1hbHMFBXByaWNlBBdmcmVlQmFsYW5jZUluQW1tRGVjaW1hbAkAaQIJAQ5nZXRGcmVlQmFsYW5jZQEFBl92YXVsdABkBBF2YXVsdEJhbGFuY2VJblVTRAkBBG11bGQCBRdmcmVlQmFsYW5jZUluQW1tRGVjaW1hbAUFcHJpY2UJAJQKAgUTaW1iYWxhbmNlRGVsdGFJblVTRAURdmF1bHRCYWxhbmNlSW5VU0QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGVzdGltYXRlU3dhcAMHX2Ftb3VudAhfYXNzZXRJZAxfdGFyZ2V0QXNzZXQEDnNvdXJjZURlY2ltYWxzAwkAAAIFCF9hc3NldElkAgVXQVZFUwAICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUIX2Fzc2V0SWQJAKwCAgIPSW52YWxpZCBhc3NldDogBQhfYXNzZXRJZAhkZWNpbWFscwQOdGFyZ2V0RGVjaW1hbHMDCQAAAgUMX3RhcmdldEFzc2V0AgVXQVZFUwAICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUMX3RhcmdldEFzc2V0CQCsAgICD0ludmFsaWQgYXNzZXQ6IAUMX3RhcmdldEFzc2V0CGRlY2ltYWxzBBlzb3VyY2VBbW91bnRJbkFtbURlY2ltYWxzAwkAAAIFDnNvdXJjZURlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUOc291cmNlRGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGUludmFsaWQgZGVjaW1hbHMgKHNvdXJjZSkECnNlbGxNYXJrZXQJAQlnZXRNYXJrZXQBBQhfYXNzZXRJZAQCczEJAPwHBAUKc2VsbE1hcmtldAILc3dhcFRvUXVvdGUJAMwIAgUZc291cmNlQW1vdW50SW5BbW1EZWNpbWFscwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAnMxBQJzMQQJdXNkQW1vdW50BAckbWF0Y2gwBQJzMQMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhpJbnZhbGlkIHN3YXBUb1F1b3RlIHJlc3VsdAQJYnV5TWFya2V0CQEJZ2V0TWFya2V0AQUMX3RhcmdldEFzc2V0BAJzMgkA/AcEBQlidXlNYXJrZXQCCnN3YXBUb0Jhc2UJAMwIAgUJdXNkQW1vdW50CQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCczIFAnMyBAx0YXJnZXRBbW91bnQEByRtYXRjaDAFAnMyAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAMJAAACBQ50YXJnZXREZWNpbWFscwAICQBoAgUBdABkAwkAAAIFDnRhcmdldERlY2ltYWxzAAYFAXQJAAIBAhlJbnZhbGlkIGRlY2ltYWxzICh0YXJnZXQpCQACAQIZSW52YWxpZCBzd2FwVG9CYXNlIHJlc3VsdAQKdmF1bHRUb0FkZAkBCGdldFZhdWx0AQUIX2Fzc2V0SWQECyR0MDc4NjI4MDI3CQETZ2V0SW1iYWxhbmNlQ29zdFVTRAQFCnZhdWx0VG9BZGQFCnNlbGxNYXJrZXQFDnNvdXJjZURlY2ltYWxzBQdfYW1vdW50BA9hZGRJbWJhbGFuY2VVU0QIBQskdDA3ODYyODAyNwJfMQQSYWRkVmF1bHRCYWxhbmNlVVNECAULJHQwNzg2MjgwMjcCXzIEDXZhdWx0VG9SZW1vdmUJAQhnZXRWYXVsdAEFDF90YXJnZXRBc3NldAQLJHQwODA3NTgzMTEJARNnZXRJbWJhbGFuY2VDb3N0VVNEBAUNdmF1bHRUb1JlbW92ZQUJYnV5TWFya2V0BQ50YXJnZXREZWNpbWFscwkBAS0BBQx0YXJnZXRBbW91bnQEEnJlbW92ZUltYmFsYW5jZVVTRAgFCyR0MDgwNzU4MzExAl8xBBVyZW1vdmVWYXVsdEJhbGFuY2VVU0QIBQskdDA4MDc1ODMxMQJfMgQUcmVzdWx0SW1iYWxhbmNlSW5VU0QJAGQCBQ9hZGRJbWJhbGFuY2VVU0QFEnJlbW92ZUltYmFsYW5jZVVTRAQHYmFzZUZlZQkBA2ZlZQAEC3RvdGFsTGlxdWlkCQBkAgUSYWRkVmF1bHRCYWxhbmNlVVNEBRVyZW1vdmVWYXVsdEJhbGFuY2VVU0QECyR0MDg0NjU4OTQ4AwkAZgIAAAUUcmVzdWx0SW1iYWxhbmNlSW5VU0QECnJlYmF0ZVJhdGUJAQRkaXZkAgkBA2FicwEFFHJlc3VsdEltYmFsYW5jZUluVVNEBQt0b3RhbExpcXVpZAQGcmViYXRlCQEEbXVsZAIJAQlmZWVSZWJhdGUABQpyZWJhdGVSYXRlBAlhY3R1YWxGZWUDCQBmAgUGcmViYXRlBQdiYXNlRmVlAAAJAGUCBQdiYXNlRmVlBQZyZWJhdGUJAJUKAwUJYWN0dWFsRmVlBQZyZWJhdGUAAAQHdGF4UmF0ZQkBBGRpdmQCCQEDYWJzAQUUcmVzdWx0SW1iYWxhbmNlSW5VU0QFC3RvdGFsTGlxdWlkBAN0YXgJAQRtdWxkAgkBCWZlZVJlYmF0ZQAFB3RheFJhdGUECWFjdHVhbEZlZQkAZAIFB2Jhc2VGZWUFA3RheAkAlQoDBQlhY3R1YWxGZWUAAAUDdGF4BAlhY3R1YWxGZWUIBQskdDA4NDY1ODk0OAJfMQQGcmViYXRlCAULJHQwODQ2NTg5NDgCXzIEA3RheAgFCyR0MDg0NjU4OTQ4Al8zBBBmZWVJblRhcmdldFRva2VuCQEEbXVsZAIFDHRhcmdldEFtb3VudAUJYWN0dWFsRmVlBBdyZXN1bHRUYXJnZXRBc3NldEFtb3VudAkAZQIFDHRhcmdldEFtb3VudAUQZmVlSW5UYXJnZXRUb2tlbgkAnwoNBQx0YXJnZXRBbW91bnQFEGZlZUluVGFyZ2V0VG9rZW4FF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50BQdiYXNlRmVlBQlhY3R1YWxGZWUFBnJlYmF0ZQUDdGF4BQ12YXVsdFRvUmVtb3ZlBQp2YXVsdFRvQWRkBQ9hZGRJbWJhbGFuY2VVU0QFEmFkZFZhdWx0QmFsYW5jZVVTRAUScmVtb3ZlSW1iYWxhbmNlVVNEBRVyZW1vdmVWYXVsdEJhbGFuY2VVU0QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGmVzdGltYXRlUHJvamVjdGVkTGlxdWlkaXR5AwZfdmF1bHQEX2FtbQdfY2hhbmdlBAx2YXVsdFJlc2VydmUJAGQCCQBpAgkBDmdldEZyZWVCYWxhbmNlAQUGX3ZhdWx0AGQJAGkCBQdfY2hhbmdlAGQEEHZhdWx0VXRpbGl6YXRpb24JAGkCCQERZ2V0TWF4VXRpbGl6YXRpb24BBQZfdmF1bHQAZAQObWF4UHJpY2VTcHJlYWQJARFnZXRNYXhQcmljZVNwcmVhZAEFBF9hbW0EGmFjdHVhbExpcXVpZGl0eUluQmFzZUFzc2V0CQEEbXVsZAIFDHZhdWx0UmVzZXJ2ZQUQdmF1bHRVdGlsaXphdGlvbgQSbmV3QmFzZUFzc2V0QW1vdW50CQEEZGl2ZAIJAGUCBRphY3R1YWxMaXF1aWRpdHlJbkJhc2VBc3NldAkBBG11bGQCBQ5tYXhQcmljZVNwcmVhZAUaYWN0dWFsTGlxdWlkaXR5SW5CYXNlQXNzZXQFDm1heFByaWNlU3ByZWFkBAskdDA5ODMzOTkxOQkBKGdldE9sZFByb2plY3RlZExpcXVpZGl0eUFuZFRlcm1pbmFsUHJpY2UBBQRfYW1tAwkAAAIFCyR0MDk4MzM5OTE5BQskdDA5ODMzOTkxOQQBcQgFCyR0MDk4MzM5OTE5Al8zBAVwcmljZQgFCyR0MDk4MzM5OTE5Al8yBBJvbGRCYXNlQXNzZXRBbW91bnQIBQskdDA5ODMzOTkxOQJfMQQUYmFzZUFzc2V0QW1vdW50RGVsdGEJAGUCBRJuZXdCYXNlQXNzZXRBbW91bnQFEm9sZEJhc2VBc3NldEFtb3VudAQQcXVvdGVBc3NldENoYW5nZQkBBGRpdmQCCQEEbXVsZAIFFGJhc2VBc3NldEFtb3VudERlbHRhBQVwcmljZQUBcQkAlAoCBRRiYXNlQXNzZXRBbW91bnREZWx0YQUQcXVvdGVBc3NldENoYW5nZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQ51cGRhdGVTZXR0aW5ncwMEX2ZlZQdfcmViYXRlFF9mZWVUb1N0YWtlcnNQZXJjZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrX2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUIa19yZWJhdGUFB19yZWJhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtfZmVlVG9TdGFrZXJzUGVyY2VudAUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQFA25pbAoBaQEFcGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFEludmFsaWQgcGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHVucGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQ5jaGFuZ2VTZXR0aW5ncwMEX2ZlZQdfcmViYXRlFF9mZWVUb1N0YWtlcnNQZXJjZW50AwMDAwMDCQBnAgAABQRfZmVlBgkAZwIAAAUHX3JlYmF0ZQYJAGcCAAAFFF9mZWVUb1N0YWtlcnNQZXJjZW50BgkAZgIFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQxERUNJTUFMX1VOSVQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwMFBF9mZWUFB19yZWJhdGUFFF9mZWVUb1N0YWtlcnNQZXJjZW50AWkBBmFkZEFtbQQLX2FtbUFkZHJlc3MNX3ZhdWx0QWRkcmVzcwtfdmF1bHRBc3NldAVfZGF0YQMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhVJbnZhbGlkIGFkZEFtbSBwYXJhbXMECmFtbUFkZHJlc3MJARFnZXRBZGRyZXNzSWZWYWxpZAEFC19hbW1BZGRyZXNzAwkAAAIFCmFtbUFkZHJlc3MFCmFtbUFkZHJlc3MEDHZhdWx0QWRkcmVzcwkBEWdldEFkZHJlc3NJZlZhbGlkAQUNX3ZhdWx0QWRkcmVzcwMJAAACBQx2YXVsdEFkZHJlc3MFDHZhdWx0QWRkcmVzcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUFa19hbW0FC19hbW1BZGRyZXNzBgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUHa192YXVsdAUNX3ZhdWx0QWRkcmVzcwYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUNa19hc3NldF92YXVsdAULX3ZhdWx0QXNzZXQFDV92YXVsdEFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgULa19hc3NldF9hbW0FC192YXVsdEFzc2V0BQtfYW1tQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQprX2FtbV9kYXRhBQtfYW1tQWRkcmVzcwUFX2RhdGEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlyZW1vdmVBbW0BC19hbW1BZGRyZXNzAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECGEludmFsaWQgcmVtb3ZlQW1tIHBhcmFtcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQVrX2FtbQULX2FtbUFkZHJlc3MFA25pbAFpAQppbml0aWFsaXplBAxfY29vcmRpbmF0b3IEX2ZlZQdfcmViYXRlFF9mZWVUb1N0YWtlcnNQZXJjZW50AwMDAwMDCQBnAgAABQRfZmVlBgkAZwIAAAUHX3JlYmF0ZQYJAGcCAAAFFF9mZWVUb1N0YWtlcnNQZXJjZW50BgkAZgIFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQxERUNJTUFMX1VOSVQGCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIdSW52YWxpZCBpbml0aWFsaXplIHBhcmFtZXRlcnMJAM4IAgkBDnVwZGF0ZVNldHRpbmdzAwUEX2ZlZQUHX3JlYmF0ZQUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDF9jb29yZGluYXRvcgUDbmlsAWkBBHN3YXACDF90YXJnZXRBc3NldBBfbWluVGFyZ2V0QW1vdW50BBFjaGVja1BheW1lbnRDb3VudAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECIkludmFsaWQgc3dhcCBwYXJhbXM6IHBheW1lbnQgY291bnQGAwkAAAIFEWNoZWNrUGF5bWVudENvdW50BRFjaGVja1BheW1lbnRDb3VudAQHX2Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECF9hc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEB2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUIX2Fzc2V0SWQJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQCBVdBVkVTBBFjaGVja05vdFNhbWVBc3NldAMJAAACBQxfdGFyZ2V0QXNzZXQFB2Fzc2V0SWQJAAIBAh9JbnZhbGlkIHN3YXAgcGFyYW1zOiBzYW1lIGFzc2V0BgMJAAACBRFjaGVja05vdFNhbWVBc3NldAURY2hlY2tOb3RTYW1lQXNzZXQEDSR0MDEzNjEwMTM5MjkJAQxlc3RpbWF0ZVN3YXADBQdfYW1vdW50BQdhc3NldElkBQxfdGFyZ2V0QXNzZXQDCQAAAgUNJHQwMTM2MTAxMzkyOQUNJHQwMTM2MTAxMzkyOQQKdmF1bHRUb0FkZAgFDSR0MDEzNjEwMTM5MjkCXzkEDXZhdWx0VG9SZW1vdmUIBQ0kdDAxMzYxMDEzOTI5Al84BAN0YXgIBQ0kdDAxMzYxMDEzOTI5Al83BAZyZWJhdGUIBQ0kdDAxMzYxMDEzOTI5Al82BAlhY3R1YWxGZWUIBQ0kdDAxMzYxMDEzOTI5Al81BAdiYXNlRmVlCAUNJHQwMTM2MTAxMzkyOQJfNAQXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQIBQ0kdDAxMzYxMDEzOTI5Al8zBBBmZWVJblRhcmdldFRva2VuCAUNJHQwMTM2MTAxMzkyOQJfMgQMdGFyZ2V0QW1vdW50CAUNJHQwMTM2MTAxMzkyOQJfMQQJZG9EZXBvc2l0CQD8BwQFCnZhdWx0VG9BZGQCBXJlcGF5BQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUJZG9EZXBvc2l0BQlkb0RlcG9zaXQECmRvV2l0aGRyYXcJAPwHBAUNdmF1bHRUb1JlbW92ZQIGYm9ycm93CQDMCAIFDHRhcmdldEFtb3VudAUDbmlsBQNuaWwDCQAAAgUKZG9XaXRoZHJhdwUKZG9XaXRoZHJhdwQLdGFyZ2V0QXNzZXQDCQAAAgUMX3RhcmdldEFzc2V0AgVXQVZFUwUEdW5pdAkA2QQBBQxfdGFyZ2V0QXNzZXQEFnN0YWtlckZlZUluVGFyZ2V0VG9rZW4JAQRtdWxkAgUQZmVlSW5UYXJnZXRUb2tlbgkBE2ZlZVRvU3Rha2Vyc1BlcmNlbnQABBJscEZlZUluVGFyZ2V0VG9rZW4JAGUCBRBmZWVJblRhcmdldFRva2VuBRZzdGFrZXJGZWVJblRhcmdldFRva2VuBAxkb0NvbGxlY3RGZWUJAPwHBAUNdmF1bHRUb1JlbW92ZQIHYWRkRnJlZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0YXJnZXRBc3NldAUSbHBGZWVJblRhcmdldFRva2VuBQNuaWwDCQAAAgUMZG9Db2xsZWN0RmVlBQxkb0NvbGxlY3RGZWUEB3Jld2FyZHMDAwkAAAIFC3RhcmdldEFzc2V0CQELcmV3YXJkQXNzZXQABgkAAAIFFnN0YWtlckZlZUluVGFyZ2V0VG9rZW4AAAUWc3Rha2VyRmVlSW5UYXJnZXRUb2tlbgQGZG9Td2FwCQD8BwQJAQtzd2FwQWRkcmVzcwACBHN3YXAJAMwIAgkA2AQBCQELcmV3YXJkQXNzZXQACQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0YXJnZXRBc3NldAUWc3Rha2VyRmVlSW5UYXJnZXRUb2tlbgUDbmlsAwkAAAIFBmRvU3dhcAUGZG9Td2FwBAdyZXdhcmRzCQDwBwIFBHRoaXMJAQtyZXdhcmRBc3NldAADCQAAAgUHcmV3YXJkcwUHcmV3YXJkcwUHcmV3YXJkcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQdyZXdhcmRzBQdyZXdhcmRzAwkAZgIFEF9taW5UYXJnZXRBbW91bnQFF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIeQ2FuIG5vdCBzd2FwIGR1ZSB0byBzbGlwcGFnZTogCQCkAwEFF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50AgMgPCAJAKQDAQUQX21pblRhcmdldEFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQFC3RhcmdldEFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5zdGFraW5nQWRkcmVzcwAFB3Jld2FyZHMJAQtyZXdhcmRBc3NldAAFA25pbAkAmAoGBQdfYW1vdW50BRdyZXN1bHRUYXJnZXRBc3NldEFtb3VudAUHYmFzZUZlZQUJYWN0dWFsRmVlBQZyZWJhdGUFA3RheAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARhub3RpZnlWYXVsdEJhbGFuY2VDaGFuZ2UCBl9hc3NldAdfY2hhbmdlBAZtYXJrZXQJAQ5nZXRNYXJrZXRNYXliZQEFBl9hc3NldAQFdmF1bHQJAQ1nZXRWYXVsdE1heWJlAQUGX2Fzc2V0AwMJAQlpc0RlZmluZWQBBQZtYXJrZXQJAQlpc0RlZmluZWQBBQV2YXVsdAcDCQECIT0CCAUBaQZjYWxsZXIFBXZhdWx0CQACAQInSW52YWxpZCBub3RpZnlWYXVsdEJhbGFuY2VDaGFuZ2UgcGFyYW1zBA0kdDAxNTg0NDE1OTYwCQEaZXN0aW1hdGVQcm9qZWN0ZWRMaXF1aWRpdHkDCQEFdmFsdWUBBQV2YXVsdAkBBXZhbHVlAQUGbWFya2V0BQdfY2hhbmdlAwkAAAIFDSR0MDE1ODQ0MTU5NjAFDSR0MDE1ODQ0MTU5NjAEEHF1b3RlQXNzZXRDaGFuZ2UIBQ0kdDAxNTg0NDE1OTYwAl8yBBRiYXNlQXNzZXRBbW91bnREZWx0YQgFDSR0MDE1ODQ0MTU5NjACXzEEBnJlc3VsdAkA/AcECQEFdmFsdWUBBQZtYXJrZXQCD2NoYW5nZUxpcXVpZGl0eQkAzAgCBRBxdW90ZUFzc2V0Q2hhbmdlBQNuaWwFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwBaQEfdmlld19lc3RpbWF0ZVByb2plY3RlZExpcXVpZGl0eQIGX2Fzc2V0B19jaGFuZ2UEBm1hcmtldAkBCWdldE1hcmtldAEFBl9hc3NldAQFdmF1bHQJAQhnZXRWYXVsdAEFBl9hc3NldAQNJHQwMTYyNDgxNjM0OAkBGmVzdGltYXRlUHJvamVjdGVkTGlxdWlkaXR5AwUFdmF1bHQFBm1hcmtldAUHX2NoYW5nZQMJAAACBQ0kdDAxNjI0ODE2MzQ4BQ0kdDAxNjI0ODE2MzQ4BBBxdW90ZUFzc2V0Q2hhbmdlCAUNJHQwMTYyNDgxNjM0OAJfMgQUYmFzZUFzc2V0QW1vdW50RGVsdGEIBQ0kdDAxNjI0ODE2MzQ4Al8xBARkYXRhCQC5CQIJAMwIAgkApAMBBRRiYXNlQXNzZXRBbW91bnREZWx0YQkAzAgCCQCkAwEFEHF1b3RlQXNzZXRDaGFuZ2UFA25pbAIBLAkAAgEFBGRhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERdmlld19lc3RpbWF0ZVN3YXADDV9zb3VyY2VBbW91bnQMX3NvdXJjZUFzc2V0DF90YXJnZXRBc3NldAQNJHQwMTY1OTExNjkxNgkBDGVzdGltYXRlU3dhcAMFDV9zb3VyY2VBbW91bnQFDF9zb3VyY2VBc3NldAUMX3RhcmdldEFzc2V0AwkAAAIFDSR0MDE2NTkxMTY5MTYFDSR0MDE2NTkxMTY5MTYEFXJlbW92ZVZhdWx0QmFsYW5jZVVTRAgFDSR0MDE2NTkxMTY5MTYDXzEzBBJyZW1vdmVJbWJhbGFuY2VVU0QIBQ0kdDAxNjU5MTE2OTE2A18xMgQSYWRkVmF1bHRCYWxhbmNlVVNECAUNJHQwMTY1OTExNjkxNgNfMTEED2FkZEltYmFsYW5jZVVTRAgFDSR0MDE2NTkxMTY5MTYDXzEwBAp2YXVsdFRvQWRkCAUNJHQwMTY1OTExNjkxNgJfOQQNdmF1bHRUb1JlbW92ZQgFDSR0MDE2NTkxMTY5MTYCXzgEA3RheAgFDSR0MDE2NTkxMTY5MTYCXzcEBnJlYmF0ZQgFDSR0MDE2NTkxMTY5MTYCXzYECWFjdHVhbEZlZQgFDSR0MDE2NTkxMTY5MTYCXzUEB2Jhc2VGZWUIBQ0kdDAxNjU5MTE2OTE2Al80BBdyZXN1bHRUYXJnZXRBc3NldEFtb3VudAgFDSR0MDE2NTkxMTY5MTYCXzMEEGZlZUluVGFyZ2V0VG9rZW4IBQ0kdDAxNjU5MTE2OTE2Al8yBAx0YXJnZXRBbW91bnQIBQ0kdDAxNjU5MTE2OTE2Al8xBARkYXRhCQC5CQIJAMwIAgkApAMBBQx0YXJnZXRBbW91bnQJAMwIAgkApAMBBRBmZWVJblRhcmdldFRva2VuCQDMCAIJAKQDAQUXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQJAMwIAgkApAMBBQdiYXNlRmVlCQDMCAIJAKQDAQUJYWN0dWFsRmVlCQDMCAIJAKQDAQUGcmViYXRlCQDMCAIJAKQDAQUDdGF4CQDMCAIJAKQDAQUPYWRkSW1iYWxhbmNlVVNECQDMCAIJAKQDAQUSYWRkVmF1bHRCYWxhbmNlVVNECQDMCAIJAKQDAQUScmVtb3ZlSW1iYWxhbmNlVVNECQDMCAIJAKQDAQUVcmVtb3ZlVmF1bHRCYWxhbmNlVVNEBQNuaWwCASwJAAIBBQRkYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQOY29vcmRpbmF0b3JTdHIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MDCQEJaXNEZWZpbmVkAQUOY29vcmRpbmF0b3JTdHIEBWFkbWluCQCdCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFDmNvb3JkaW5hdG9yU3RyBQ9rX2FkbWluX2FkZHJlc3MDCQEJaXNEZWZpbmVkAQUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFYWRtaW4JAKwCAgkArAICCQCsAgICB3N0YXR1c18JAKUIAQUEdGhpcwIBXwkA2AQBCAUCdHgCaWQHCQACAQIudW5hYmxlIHRvIHZlcmlmeTogYWRtaW4gbm90IHNldCBpbiBjb29yZGluYXRvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQm8RBE=", "height": 2596590, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DAe3Ki5q1Lvd6aA7fg1u9Kcpzzf2F8936MpQ5Ckg72zA Next: GwRSX1SpJmxbDdxkSQkgetXEFHgTYBUUg7ey2P6yPKQ4 Diff:
OldNewDifferences
99
1010 let k_rebate = "k_rebate"
1111
12+let k_feeToStakersPercent = "k_feeToStakersPercent"
13+
1214 let k_coordinatorAddress = "k_coordinatorAddress"
15+
16+let k_reward_asset = "k_reward_asset"
17+
18+let k_swap_address = "k_swap_address"
19+
20+let k_staking_address = "k_staking_address"
1321
1422 let k_excessBalance = "k_excessBalance"
1523
4452
4553
4654 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
55+
56+
57+func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Staking not set")
58+
59+
60+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
61+
62+
63+func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_swap_address), "Swap address not set")), "Swap address invalid")
4764
4865
4966 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse \"" + address) + "\" as address")))
84101
85102
86103 func feeRebate () = int(k_rebate)
104+
105+
106+func feeToStakersPercent () = int(k_feeToStakersPercent)
87107
88108
89109 func getMarketMaybe (_assetId) = {
218238 throw("Invalid swapToBase result")
219239 }
220240 let vaultToAdd = getVault(_assetId)
221- let $t070967261 = getImbalanceCostUSD(vaultToAdd, sellMarket, sourceDecimals, _amount)
222- let addImbalanceUSD = $t070967261._1
223- let addVaultBalanceUSD = $t070967261._2
241+ let $t078628027 = getImbalanceCostUSD(vaultToAdd, sellMarket, sourceDecimals, _amount)
242+ let addImbalanceUSD = $t078628027._1
243+ let addVaultBalanceUSD = $t078628027._2
224244 let vaultToRemove = getVault(_targetAsset)
225- let $t073097545 = getImbalanceCostUSD(vaultToRemove, buyMarket, targetDecimals, -(targetAmount))
226- let removeImbalanceUSD = $t073097545._1
227- let removeVaultBalanceUSD = $t073097545._2
245+ let $t080758311 = getImbalanceCostUSD(vaultToRemove, buyMarket, targetDecimals, -(targetAmount))
246+ let removeImbalanceUSD = $t080758311._1
247+ let removeVaultBalanceUSD = $t080758311._2
228248 let resultImbalanceInUSD = (addImbalanceUSD + removeImbalanceUSD)
229249 let baseFee = fee()
230250 let totalLiquid = (addVaultBalanceUSD + removeVaultBalanceUSD)
231- let $t076998182 = if ((0 > resultImbalanceInUSD))
251+ let $t084658948 = if ((0 > resultImbalanceInUSD))
232252 then {
233253 let rebateRate = divd(abs(resultImbalanceInUSD), totalLiquid)
234254 let rebate = muld(feeRebate(), rebateRate)
243263 let actualFee = (baseFee + tax)
244264 $Tuple3(actualFee, 0, tax)
245265 }
246- let actualFee = $t076998182._1
247- let rebate = $t076998182._2
248- let tax = $t076998182._3
266+ let actualFee = $t084658948._1
267+ let rebate = $t084658948._2
268+ let tax = $t084658948._3
249269 let feeInTargetToken = muld(targetAmount, actualFee)
250270 let resultTargetAssetAmount = (targetAmount - feeInTargetToken)
251271 $Tuple13(targetAmount, feeInTargetToken, resultTargetAssetAmount, baseFee, actualFee, rebate, tax, vaultToRemove, vaultToAdd, addImbalanceUSD, addVaultBalanceUSD, removeImbalanceUSD, removeVaultBalanceUSD)
262282 let maxPriceSpread = getMaxPriceSpread(_amm)
263283 let actualLiquidityInBaseAsset = muld(vaultReserve, vaultUtilization)
264284 let newBaseAssetAmount = divd((actualLiquidityInBaseAsset - muld(maxPriceSpread, actualLiquidityInBaseAsset)), maxPriceSpread)
265- let $t090679153 = getOldProjectedLiquidityAndTerminalPrice(_amm)
266- if (($t090679153 == $t090679153))
285+ let $t098339919 = getOldProjectedLiquidityAndTerminalPrice(_amm)
286+ if (($t098339919 == $t098339919))
267287 then {
268- let q = $t090679153._3
269- let price = $t090679153._2
270- let oldBaseAssetAmount = $t090679153._1
288+ let q = $t098339919._3
289+ let price = $t098339919._2
290+ let oldBaseAssetAmount = $t098339919._1
271291 let baseAssetAmountDelta = (newBaseAssetAmount - oldBaseAssetAmount)
272292 let quoteAssetChange = divd(muld(baseAssetAmountDelta, price), q)
273293 $Tuple2(baseAssetAmountDelta, quoteAssetChange)
279299 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
280300
281301
282-func updateSettings (_fee,_rebate) = [IntegerEntry(k_fee, _fee), IntegerEntry(k_rebate, _rebate)]
302+func updateSettings (_fee,_rebate,_feeToStakersPercent) = [IntegerEntry(k_fee, _fee), IntegerEntry(k_rebate, _rebate), IntegerEntry(k_feeToStakersPercent, _feeToStakersPercent)]
283303
284304
285305 @Callable(i)
297317
298318
299319 @Callable(i)
300-func changeSettings (_fee,_rebate) = if (if (if (if ((0 >= _fee))
320+func changeSettings (_fee,_rebate,_feeToStakersPercent) = if (if (if (if (if (if ((0 >= _fee))
301321 then true
302322 else (0 >= _rebate))
323+ then true
324+ else (0 >= _feeToStakersPercent))
325+ then true
326+ else (_feeToStakersPercent > DECIMAL_UNIT))
303327 then true
304328 else !(initialized()))
305329 then true
306330 else (i.caller != adminAddress()))
307331 then throw("Invalid changeSettings params")
308- else updateSettings(_fee, _rebate)
332+ else updateSettings(_fee, _rebate, _feeToStakersPercent)
309333
310334
311335
334358
335359
336360 @Callable(i)
337-func initialize (_coordinator,_fee,_rebate) = if (if (if (if ((0 >= _fee))
361+func initialize (_coordinator,_fee,_rebate,_feeToStakersPercent) = if (if (if (if (if (if ((0 >= _fee))
338362 then true
339363 else (0 >= _rebate))
364+ then true
365+ else (0 >= _feeToStakersPercent))
366+ then true
367+ else (_feeToStakersPercent > DECIMAL_UNIT))
340368 then true
341369 else initialized())
342370 then true
343371 else (i.caller != this))
344372 then throw("Invalid initialize parameters")
345- else (updateSettings(_fee, _rebate) ++ [BooleanEntry(k_initialized, true), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
373+ else (updateSettings(_fee, _rebate, _feeToStakersPercent) ++ [BooleanEntry(k_initialized, true), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
346374
347375
348376
363391 else true
364392 if ((checkNotSameAsset == checkNotSameAsset))
365393 then {
366- let $t01249412813 = estimateSwap(_amount, assetId, _targetAsset)
367- if (($t01249412813 == $t01249412813))
394+ let $t01361013929 = estimateSwap(_amount, assetId, _targetAsset)
395+ if (($t01361013929 == $t01361013929))
368396 then {
369- let vaultToAdd = $t01249412813._9
370- let vaultToRemove = $t01249412813._8
371- let tax = $t01249412813._7
372- let rebate = $t01249412813._6
373- let actualFee = $t01249412813._5
374- let baseFee = $t01249412813._4
375- let resultTargetAssetAmount = $t01249412813._3
376- let feeInTargetToken = $t01249412813._2
377- let targetAmount = $t01249412813._1
397+ let vaultToAdd = $t01361013929._9
398+ let vaultToRemove = $t01361013929._8
399+ let tax = $t01361013929._7
400+ let rebate = $t01361013929._6
401+ let actualFee = $t01361013929._5
402+ let baseFee = $t01361013929._4
403+ let resultTargetAssetAmount = $t01361013929._3
404+ let feeInTargetToken = $t01361013929._2
405+ let targetAmount = $t01361013929._1
378406 let doDeposit = invoke(vaultToAdd, "repay", nil, [i.payments[0]])
379407 if ((doDeposit == doDeposit))
380408 then {
384412 let targetAsset = if ((_targetAsset == "WAVES"))
385413 then unit
386414 else fromBase58String(_targetAsset)
387- let doCollectFee = invoke(vaultToRemove, "addFree", nil, [AttachedPayment(targetAsset, feeInTargetToken)])
415+ let stakerFeeInTargetToken = muld(feeInTargetToken, feeToStakersPercent())
416+ let lpFeeInTargetToken = (feeInTargetToken - stakerFeeInTargetToken)
417+ let doCollectFee = invoke(vaultToRemove, "addFree", nil, [AttachedPayment(targetAsset, lpFeeInTargetToken)])
388418 if ((doCollectFee == doCollectFee))
389- then if ((_minTargetAmount > resultTargetAssetAmount))
390- then throw(((("Can not swap due to slippage: " + toString(resultTargetAssetAmount)) + " < ") + toString(_minTargetAmount)))
391- else $Tuple2([ScriptTransfer(i.caller, resultTargetAssetAmount, targetAsset)], $Tuple6(_amount, resultTargetAssetAmount, baseFee, actualFee, rebate, tax))
419+ then {
420+ let rewards = if (if ((targetAsset == rewardAsset()))
421+ then true
422+ else (stakerFeeInTargetToken == 0))
423+ then stakerFeeInTargetToken
424+ else {
425+ let doSwap = invoke(swapAddress(), "swap", [toBase58String(rewardAsset()), 0], [AttachedPayment(targetAsset, stakerFeeInTargetToken)])
426+ if ((doSwap == doSwap))
427+ then {
428+ let rewards = assetBalance(this, rewardAsset())
429+ if ((rewards == rewards))
430+ then rewards
431+ else throw("Strict value is not equal to itself.")
432+ }
433+ else throw("Strict value is not equal to itself.")
434+ }
435+ if ((rewards == rewards))
436+ then if ((_minTargetAmount > resultTargetAssetAmount))
437+ then throw(((("Can not swap due to slippage: " + toString(resultTargetAssetAmount)) + " < ") + toString(_minTargetAmount)))
438+ else $Tuple2([ScriptTransfer(i.caller, resultTargetAssetAmount, targetAsset), ScriptTransfer(stakingAddress(), rewards, rewardAsset())], $Tuple6(_amount, resultTargetAssetAmount, baseFee, actualFee, rebate, tax))
439+ else throw("Strict value is not equal to itself.")
440+ }
392441 else throw("Strict value is not equal to itself.")
393442 }
394443 else throw("Strict value is not equal to itself.")
414463 then if ((i.caller != vault))
415464 then throw("Invalid notifyVaultBalanceChange params")
416465 else {
417- let $t01403414150 = estimateProjectedLiquidity(value(vault), value(market), _change)
418- if (($t01403414150 == $t01403414150))
466+ let $t01584415960 = estimateProjectedLiquidity(value(vault), value(market), _change)
467+ if (($t01584415960 == $t01584415960))
419468 then {
420- let quoteAssetChange = $t01403414150._2
421- let baseAssetAmountDelta = $t01403414150._1
469+ let quoteAssetChange = $t01584415960._2
470+ let baseAssetAmountDelta = $t01584415960._1
422471 let result = invoke(value(market), "changeLiquidity", [quoteAssetChange], nil)
423472 if ((result == result))
424473 then nil
435484 func view_estimateProjectedLiquidity (_asset,_change) = {
436485 let market = getMarket(_asset)
437486 let vault = getVault(_asset)
438- let $t01443814538 = estimateProjectedLiquidity(vault, market, _change)
439- if (($t01443814538 == $t01443814538))
487+ let $t01624816348 = estimateProjectedLiquidity(vault, market, _change)
488+ if (($t01624816348 == $t01624816348))
440489 then {
441- let quoteAssetChange = $t01443814538._2
442- let baseAssetAmountDelta = $t01443814538._1
490+ let quoteAssetChange = $t01624816348._2
491+ let baseAssetAmountDelta = $t01624816348._1
443492 let data = makeString([toString(baseAssetAmountDelta), toString(quoteAssetChange)], ",")
444493 throw(data)
445494 }
450499
451500 @Callable(i)
452501 func view_estimateSwap (_sourceAmount,_sourceAsset,_targetAsset) = {
453- let $t01478115106 = estimateSwap(_sourceAmount, _sourceAsset, _targetAsset)
454- if (($t01478115106 == $t01478115106))
502+ let $t01659116916 = estimateSwap(_sourceAmount, _sourceAsset, _targetAsset)
503+ if (($t01659116916 == $t01659116916))
455504 then {
456- let removeVaultBalanceUSD = $t01478115106._13
457- let removeImbalanceUSD = $t01478115106._12
458- let addVaultBalanceUSD = $t01478115106._11
459- let addImbalanceUSD = $t01478115106._10
460- let vaultToAdd = $t01478115106._9
461- let vaultToRemove = $t01478115106._8
462- let tax = $t01478115106._7
463- let rebate = $t01478115106._6
464- let actualFee = $t01478115106._5
465- let baseFee = $t01478115106._4
466- let resultTargetAssetAmount = $t01478115106._3
467- let feeInTargetToken = $t01478115106._2
468- let targetAmount = $t01478115106._1
505+ let removeVaultBalanceUSD = $t01659116916._13
506+ let removeImbalanceUSD = $t01659116916._12
507+ let addVaultBalanceUSD = $t01659116916._11
508+ let addImbalanceUSD = $t01659116916._10
509+ let vaultToAdd = $t01659116916._9
510+ let vaultToRemove = $t01659116916._8
511+ let tax = $t01659116916._7
512+ let rebate = $t01659116916._6
513+ let actualFee = $t01659116916._5
514+ let baseFee = $t01659116916._4
515+ let resultTargetAssetAmount = $t01659116916._3
516+ let feeInTargetToken = $t01659116916._2
517+ let targetAmount = $t01659116916._1
469518 let data = makeString([toString(targetAmount), toString(feeInTargetToken), toString(resultTargetAssetAmount), toString(baseFee), toString(actualFee), toString(rebate), toString(tax), toString(addImbalanceUSD), toString(addVaultBalanceUSD), toString(removeImbalanceUSD), toString(removeVaultBalanceUSD)], ",")
470519 throw(data)
471520 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_initialized = "k_initialized"
55
66 let k_paused = "k_paused"
77
88 let k_fee = "k_fee"
99
1010 let k_rebate = "k_rebate"
1111
12+let k_feeToStakersPercent = "k_feeToStakersPercent"
13+
1214 let k_coordinatorAddress = "k_coordinatorAddress"
15+
16+let k_reward_asset = "k_reward_asset"
17+
18+let k_swap_address = "k_swap_address"
19+
20+let k_staking_address = "k_staking_address"
1321
1422 let k_excessBalance = "k_excessBalance"
1523
1624 let k_freeBalance = "k_freeBalance"
1725
1826 let k_maxSpotUtilization = "k_maxSpotUtilization"
1927
2028 let k_maxPriceSpread = "k_maxPriceSpread"
2129
2230 let k_baseAssetReserve = "k_bsAstR"
2331
2432 let k_quoteAssetWeight = "k_qtAstW"
2533
2634 let k_totalPositionSize = "k_totalPositionSize"
2735
2836 let k_amm = "k_amm"
2937
3038 let k_vault = "k_vault"
3139
3240 let k_amm_data = "k_amm_data"
3341
3442 let k_asset_vault = "k_asset_vault"
3543
3644 let k_asset_amm = "k_asset_amm"
3745
3846 let k_admin_address = "k_admin_address"
3947
4048 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
4149
4250
4351 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
4452
4553
4654 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
55+
56+
57+func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Staking not set")
58+
59+
60+func rewardAsset () = fromBase58String(valueOrErrorMessage(getString(coordinator(), k_reward_asset), "Reward asset not set"))
61+
62+
63+func swapAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_swap_address), "Swap address not set")), "Swap address invalid")
4764
4865
4966 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse \"" + address) + "\" as address")))
5067
5168
5269 let DECIMAL_NUMBERS = 6
5370
5471 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
5572
5673 func s (_x) = (toString(_x) + ",")
5774
5875
5976 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
6077
6178
6279 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6380
6481
6582 func abs (_x) = if ((_x > 0))
6683 then _x
6784 else -(_x)
6885
6986
7087 func vmax (_x,_y) = if ((_x >= _y))
7188 then _x
7289 else _y
7390
7491
7592 func vmin (_x,_y) = if ((_y >= _x))
7693 then _x
7794 else _y
7895
7996
8097 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
8198
8299
83100 func fee () = int(k_fee)
84101
85102
86103 func feeRebate () = int(k_rebate)
104+
105+
106+func feeToStakersPercent () = int(k_feeToStakersPercent)
87107
88108
89109 func getMarketMaybe (_assetId) = {
90110 let addressStr = getString(this, toCompositeKey(k_asset_amm, _assetId))
91111 if (isDefined(addressStr))
92112 then valueOrErrorMessage(addressFromString(value(addressStr)), ("Invalid vault address for: " + _assetId))
93113 else unit
94114 }
95115
96116
97117 func getVaultMaybe (_assetId) = {
98118 let addressStr = getString(this, toCompositeKey(k_asset_vault, _assetId))
99119 if (isDefined(addressStr))
100120 then valueOrErrorMessage(addressFromString(value(addressStr)), ("Invalid market address for: " + _assetId))
101121 else unit
102122 }
103123
104124
105125 func getMarket (_assetId) = valueOrErrorMessage(getMarketMaybe(_assetId), ("No market for: " + _assetId))
106126
107127
108128 func getVault (_assetId) = valueOrErrorMessage(getVaultMaybe(_assetId), ("No vault for: " + _assetId))
109129
110130
111131 func getExcessBalance (_vault) = valueOrElse(getInteger(_vault, k_excessBalance), 0)
112132
113133
114134 func getFreeBalance (_vault) = valueOrElse(getInteger(_vault, k_freeBalance), 0)
115135
116136
117137 func getMaxUtilization (_vault) = valueOrErrorMessage(getInteger(_vault, k_maxSpotUtilization), ("Max spot utilization not set for: " + toString(_vault)))
118138
119139
120140 func getMaxPriceSpread (_amm) = valueOrErrorMessage(getInteger(_amm, k_maxPriceSpread), ("Max price spread not set for: " + toString(_amm)))
121141
122142
123143 func getOldProjectedLiquidityAndTerminalPrice (_amm) = {
124144 let sync = invoke(_amm, "syncTerminalPriceToOracle", nil, nil)
125145 if ((sync == sync))
126146 then {
127147 let priceR = invoke(_amm, "computeTerminalAmmPrice", nil, nil)
128148 if ((priceR == priceR))
129149 then {
130150 let price = match priceR {
131151 case t: Int =>
132152 t
133153 case _ =>
134154 throw(("Invalid computeTerminalAmmPrice result for " + toString(_amm)))
135155 }
136156 let currentBaseAssetAmount = valueOrErrorMessage(getInteger(_amm, k_baseAssetReserve), ((("Key " + k_baseAssetReserve) + " not set for ") + toString(_amm)))
137157 if ((currentBaseAssetAmount == currentBaseAssetAmount))
138158 then {
139159 let baseAssetAmountDelta = valueOrElse(getInteger(_amm, k_totalPositionSize), 0)
140160 if ((baseAssetAmountDelta == baseAssetAmountDelta))
141161 then {
142162 let quoteAssetWeight = valueOrElse(getInteger(_amm, k_quoteAssetWeight), DECIMAL_UNIT)
143163 if ((quoteAssetWeight == quoteAssetWeight))
144164 then $Tuple3((currentBaseAssetAmount + baseAssetAmountDelta), price, quoteAssetWeight)
145165 else throw("Strict value is not equal to itself.")
146166 }
147167 else throw("Strict value is not equal to itself.")
148168 }
149169 else throw("Strict value is not equal to itself.")
150170 }
151171 else throw("Strict value is not equal to itself.")
152172 }
153173 else throw("Strict value is not equal to itself.")
154174 }
155175
156176
157177 func getImbalanceCostUSD (_vault,_amm,_decimals,_amount) = {
158178 let amount = if ((_decimals == 8))
159179 then _amount
160180 else if ((_decimals == 6))
161181 then (_amount * 100)
162182 else throw("Invalid decimals")
163183 let oldImbalance = getExcessBalance(_vault)
164184 let newImbalance = (oldImbalance + amount)
165185 let imbalanceDeltaInAmmDecimals = ((abs(newImbalance) - abs(oldImbalance)) / 100)
166186 let priceR = invoke(_amm, "computeSpotPrice", nil, nil)
167187 if ((priceR == priceR))
168188 then {
169189 let price = match priceR {
170190 case t: Int =>
171191 t
172192 case _ =>
173193 throw(("Invalid computeSpotPrice result for " + toString(_amm)))
174194 }
175195 let imbalanceDeltaInUSD = muld(imbalanceDeltaInAmmDecimals, price)
176196 let freeBalanceInAmmDecimal = (getFreeBalance(_vault) / 100)
177197 let vaultBalanceInUSD = muld(freeBalanceInAmmDecimal, price)
178198 $Tuple2(imbalanceDeltaInUSD, vaultBalanceInUSD)
179199 }
180200 else throw("Strict value is not equal to itself.")
181201 }
182202
183203
184204 func estimateSwap (_amount,_assetId,_targetAsset) = {
185205 let sourceDecimals = if ((_assetId == "WAVES"))
186206 then 8
187207 else valueOrErrorMessage(assetInfo(fromBase58String(_assetId)), ("Invalid asset: " + _assetId)).decimals
188208 let targetDecimals = if ((_targetAsset == "WAVES"))
189209 then 8
190210 else valueOrErrorMessage(assetInfo(fromBase58String(_targetAsset)), ("Invalid asset: " + _targetAsset)).decimals
191211 let sourceAmountInAmmDecimals = if ((sourceDecimals == 8))
192212 then (_amount / 100)
193213 else if ((sourceDecimals == 6))
194214 then _amount
195215 else throw("Invalid decimals (source)")
196216 let sellMarket = getMarket(_assetId)
197217 let s1 = invoke(sellMarket, "swapToQuote", [sourceAmountInAmmDecimals, 0], nil)
198218 if ((s1 == s1))
199219 then {
200220 let usdAmount = match s1 {
201221 case t: Int =>
202222 t
203223 case _ =>
204224 throw("Invalid swapToQuote result")
205225 }
206226 let buyMarket = getMarket(_targetAsset)
207227 let s2 = invoke(buyMarket, "swapToBase", [usdAmount, 0], nil)
208228 if ((s2 == s2))
209229 then {
210230 let targetAmount = match s2 {
211231 case t: Int =>
212232 if ((targetDecimals == 8))
213233 then (t * 100)
214234 else if ((targetDecimals == 6))
215235 then t
216236 else throw("Invalid decimals (target)")
217237 case _ =>
218238 throw("Invalid swapToBase result")
219239 }
220240 let vaultToAdd = getVault(_assetId)
221- let $t070967261 = getImbalanceCostUSD(vaultToAdd, sellMarket, sourceDecimals, _amount)
222- let addImbalanceUSD = $t070967261._1
223- let addVaultBalanceUSD = $t070967261._2
241+ let $t078628027 = getImbalanceCostUSD(vaultToAdd, sellMarket, sourceDecimals, _amount)
242+ let addImbalanceUSD = $t078628027._1
243+ let addVaultBalanceUSD = $t078628027._2
224244 let vaultToRemove = getVault(_targetAsset)
225- let $t073097545 = getImbalanceCostUSD(vaultToRemove, buyMarket, targetDecimals, -(targetAmount))
226- let removeImbalanceUSD = $t073097545._1
227- let removeVaultBalanceUSD = $t073097545._2
245+ let $t080758311 = getImbalanceCostUSD(vaultToRemove, buyMarket, targetDecimals, -(targetAmount))
246+ let removeImbalanceUSD = $t080758311._1
247+ let removeVaultBalanceUSD = $t080758311._2
228248 let resultImbalanceInUSD = (addImbalanceUSD + removeImbalanceUSD)
229249 let baseFee = fee()
230250 let totalLiquid = (addVaultBalanceUSD + removeVaultBalanceUSD)
231- let $t076998182 = if ((0 > resultImbalanceInUSD))
251+ let $t084658948 = if ((0 > resultImbalanceInUSD))
232252 then {
233253 let rebateRate = divd(abs(resultImbalanceInUSD), totalLiquid)
234254 let rebate = muld(feeRebate(), rebateRate)
235255 let actualFee = if ((rebate > baseFee))
236256 then 0
237257 else (baseFee - rebate)
238258 $Tuple3(actualFee, rebate, 0)
239259 }
240260 else {
241261 let taxRate = divd(abs(resultImbalanceInUSD), totalLiquid)
242262 let tax = muld(feeRebate(), taxRate)
243263 let actualFee = (baseFee + tax)
244264 $Tuple3(actualFee, 0, tax)
245265 }
246- let actualFee = $t076998182._1
247- let rebate = $t076998182._2
248- let tax = $t076998182._3
266+ let actualFee = $t084658948._1
267+ let rebate = $t084658948._2
268+ let tax = $t084658948._3
249269 let feeInTargetToken = muld(targetAmount, actualFee)
250270 let resultTargetAssetAmount = (targetAmount - feeInTargetToken)
251271 $Tuple13(targetAmount, feeInTargetToken, resultTargetAssetAmount, baseFee, actualFee, rebate, tax, vaultToRemove, vaultToAdd, addImbalanceUSD, addVaultBalanceUSD, removeImbalanceUSD, removeVaultBalanceUSD)
252272 }
253273 else throw("Strict value is not equal to itself.")
254274 }
255275 else throw("Strict value is not equal to itself.")
256276 }
257277
258278
259279 func estimateProjectedLiquidity (_vault,_amm,_change) = {
260280 let vaultReserve = ((getFreeBalance(_vault) / 100) + (_change / 100))
261281 let vaultUtilization = (getMaxUtilization(_vault) / 100)
262282 let maxPriceSpread = getMaxPriceSpread(_amm)
263283 let actualLiquidityInBaseAsset = muld(vaultReserve, vaultUtilization)
264284 let newBaseAssetAmount = divd((actualLiquidityInBaseAsset - muld(maxPriceSpread, actualLiquidityInBaseAsset)), maxPriceSpread)
265- let $t090679153 = getOldProjectedLiquidityAndTerminalPrice(_amm)
266- if (($t090679153 == $t090679153))
285+ let $t098339919 = getOldProjectedLiquidityAndTerminalPrice(_amm)
286+ if (($t098339919 == $t098339919))
267287 then {
268- let q = $t090679153._3
269- let price = $t090679153._2
270- let oldBaseAssetAmount = $t090679153._1
288+ let q = $t098339919._3
289+ let price = $t098339919._2
290+ let oldBaseAssetAmount = $t098339919._1
271291 let baseAssetAmountDelta = (newBaseAssetAmount - oldBaseAssetAmount)
272292 let quoteAssetChange = divd(muld(baseAssetAmountDelta, price), q)
273293 $Tuple2(baseAssetAmountDelta, quoteAssetChange)
274294 }
275295 else throw("Strict value is not equal to itself.")
276296 }
277297
278298
279299 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
280300
281301
282-func updateSettings (_fee,_rebate) = [IntegerEntry(k_fee, _fee), IntegerEntry(k_rebate, _rebate)]
302+func updateSettings (_fee,_rebate,_feeToStakersPercent) = [IntegerEntry(k_fee, _fee), IntegerEntry(k_rebate, _rebate), IntegerEntry(k_feeToStakersPercent, _feeToStakersPercent)]
283303
284304
285305 @Callable(i)
286306 func pause () = if ((i.caller != adminAddress()))
287307 then throw("Invalid pause params")
288308 else [BooleanEntry(k_paused, true)]
289309
290310
291311
292312 @Callable(i)
293313 func unpause () = if ((i.caller != adminAddress()))
294314 then throw("Invalid unpause params")
295315 else [BooleanEntry(k_paused, false)]
296316
297317
298318
299319 @Callable(i)
300-func changeSettings (_fee,_rebate) = if (if (if (if ((0 >= _fee))
320+func changeSettings (_fee,_rebate,_feeToStakersPercent) = if (if (if (if (if (if ((0 >= _fee))
301321 then true
302322 else (0 >= _rebate))
323+ then true
324+ else (0 >= _feeToStakersPercent))
325+ then true
326+ else (_feeToStakersPercent > DECIMAL_UNIT))
303327 then true
304328 else !(initialized()))
305329 then true
306330 else (i.caller != adminAddress()))
307331 then throw("Invalid changeSettings params")
308- else updateSettings(_fee, _rebate)
332+ else updateSettings(_fee, _rebate, _feeToStakersPercent)
309333
310334
311335
312336 @Callable(i)
313337 func addAmm (_ammAddress,_vaultAddress,_vaultAsset,_data) = if ((i.caller != adminAddress()))
314338 then throw("Invalid addAmm params")
315339 else {
316340 let ammAddress = getAddressIfValid(_ammAddress)
317341 if ((ammAddress == ammAddress))
318342 then {
319343 let vaultAddress = getAddressIfValid(_vaultAddress)
320344 if ((vaultAddress == vaultAddress))
321345 then [BooleanEntry(toCompositeKey(k_amm, _ammAddress), true), BooleanEntry(toCompositeKey(k_vault, _vaultAddress), true), StringEntry(toCompositeKey(k_asset_vault, _vaultAsset), _vaultAddress), StringEntry(toCompositeKey(k_asset_amm, _vaultAsset), _ammAddress), StringEntry(toCompositeKey(k_amm_data, _ammAddress), _data)]
322346 else throw("Strict value is not equal to itself.")
323347 }
324348 else throw("Strict value is not equal to itself.")
325349 }
326350
327351
328352
329353 @Callable(i)
330354 func removeAmm (_ammAddress) = if ((i.caller != adminAddress()))
331355 then throw("Invalid removeAmm params")
332356 else [DeleteEntry(toCompositeKey(k_amm, _ammAddress))]
333357
334358
335359
336360 @Callable(i)
337-func initialize (_coordinator,_fee,_rebate) = if (if (if (if ((0 >= _fee))
361+func initialize (_coordinator,_fee,_rebate,_feeToStakersPercent) = if (if (if (if (if (if ((0 >= _fee))
338362 then true
339363 else (0 >= _rebate))
364+ then true
365+ else (0 >= _feeToStakersPercent))
366+ then true
367+ else (_feeToStakersPercent > DECIMAL_UNIT))
340368 then true
341369 else initialized())
342370 then true
343371 else (i.caller != this))
344372 then throw("Invalid initialize parameters")
345- else (updateSettings(_fee, _rebate) ++ [BooleanEntry(k_initialized, true), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
373+ else (updateSettings(_fee, _rebate, _feeToStakersPercent) ++ [BooleanEntry(k_initialized, true), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
346374
347375
348376
349377 @Callable(i)
350378 func swap (_targetAsset,_minTargetAmount) = {
351379 let checkPaymentCount = if ((size(i.payments) != 1))
352380 then throw("Invalid swap params: payment count")
353381 else true
354382 if ((checkPaymentCount == checkPaymentCount))
355383 then {
356384 let _amount = i.payments[0].amount
357385 let _assetId = i.payments[0].assetId
358386 let assetId = if (isDefined(_assetId))
359387 then toBase58String(value(_assetId))
360388 else "WAVES"
361389 let checkNotSameAsset = if ((_targetAsset == assetId))
362390 then throw("Invalid swap params: same asset")
363391 else true
364392 if ((checkNotSameAsset == checkNotSameAsset))
365393 then {
366- let $t01249412813 = estimateSwap(_amount, assetId, _targetAsset)
367- if (($t01249412813 == $t01249412813))
394+ let $t01361013929 = estimateSwap(_amount, assetId, _targetAsset)
395+ if (($t01361013929 == $t01361013929))
368396 then {
369- let vaultToAdd = $t01249412813._9
370- let vaultToRemove = $t01249412813._8
371- let tax = $t01249412813._7
372- let rebate = $t01249412813._6
373- let actualFee = $t01249412813._5
374- let baseFee = $t01249412813._4
375- let resultTargetAssetAmount = $t01249412813._3
376- let feeInTargetToken = $t01249412813._2
377- let targetAmount = $t01249412813._1
397+ let vaultToAdd = $t01361013929._9
398+ let vaultToRemove = $t01361013929._8
399+ let tax = $t01361013929._7
400+ let rebate = $t01361013929._6
401+ let actualFee = $t01361013929._5
402+ let baseFee = $t01361013929._4
403+ let resultTargetAssetAmount = $t01361013929._3
404+ let feeInTargetToken = $t01361013929._2
405+ let targetAmount = $t01361013929._1
378406 let doDeposit = invoke(vaultToAdd, "repay", nil, [i.payments[0]])
379407 if ((doDeposit == doDeposit))
380408 then {
381409 let doWithdraw = invoke(vaultToRemove, "borrow", [targetAmount], nil)
382410 if ((doWithdraw == doWithdraw))
383411 then {
384412 let targetAsset = if ((_targetAsset == "WAVES"))
385413 then unit
386414 else fromBase58String(_targetAsset)
387- let doCollectFee = invoke(vaultToRemove, "addFree", nil, [AttachedPayment(targetAsset, feeInTargetToken)])
415+ let stakerFeeInTargetToken = muld(feeInTargetToken, feeToStakersPercent())
416+ let lpFeeInTargetToken = (feeInTargetToken - stakerFeeInTargetToken)
417+ let doCollectFee = invoke(vaultToRemove, "addFree", nil, [AttachedPayment(targetAsset, lpFeeInTargetToken)])
388418 if ((doCollectFee == doCollectFee))
389- then if ((_minTargetAmount > resultTargetAssetAmount))
390- then throw(((("Can not swap due to slippage: " + toString(resultTargetAssetAmount)) + " < ") + toString(_minTargetAmount)))
391- else $Tuple2([ScriptTransfer(i.caller, resultTargetAssetAmount, targetAsset)], $Tuple6(_amount, resultTargetAssetAmount, baseFee, actualFee, rebate, tax))
419+ then {
420+ let rewards = if (if ((targetAsset == rewardAsset()))
421+ then true
422+ else (stakerFeeInTargetToken == 0))
423+ then stakerFeeInTargetToken
424+ else {
425+ let doSwap = invoke(swapAddress(), "swap", [toBase58String(rewardAsset()), 0], [AttachedPayment(targetAsset, stakerFeeInTargetToken)])
426+ if ((doSwap == doSwap))
427+ then {
428+ let rewards = assetBalance(this, rewardAsset())
429+ if ((rewards == rewards))
430+ then rewards
431+ else throw("Strict value is not equal to itself.")
432+ }
433+ else throw("Strict value is not equal to itself.")
434+ }
435+ if ((rewards == rewards))
436+ then if ((_minTargetAmount > resultTargetAssetAmount))
437+ then throw(((("Can not swap due to slippage: " + toString(resultTargetAssetAmount)) + " < ") + toString(_minTargetAmount)))
438+ else $Tuple2([ScriptTransfer(i.caller, resultTargetAssetAmount, targetAsset), ScriptTransfer(stakingAddress(), rewards, rewardAsset())], $Tuple6(_amount, resultTargetAssetAmount, baseFee, actualFee, rebate, tax))
439+ else throw("Strict value is not equal to itself.")
440+ }
392441 else throw("Strict value is not equal to itself.")
393442 }
394443 else throw("Strict value is not equal to itself.")
395444 }
396445 else throw("Strict value is not equal to itself.")
397446 }
398447 else throw("Strict value is not equal to itself.")
399448 }
400449 else throw("Strict value is not equal to itself.")
401450 }
402451 else throw("Strict value is not equal to itself.")
403452 }
404453
405454
406455
407456 @Callable(i)
408457 func notifyVaultBalanceChange (_asset,_change) = {
409458 let market = getMarketMaybe(_asset)
410459 let vault = getVaultMaybe(_asset)
411460 if (if (isDefined(market))
412461 then isDefined(vault)
413462 else false)
414463 then if ((i.caller != vault))
415464 then throw("Invalid notifyVaultBalanceChange params")
416465 else {
417- let $t01403414150 = estimateProjectedLiquidity(value(vault), value(market), _change)
418- if (($t01403414150 == $t01403414150))
466+ let $t01584415960 = estimateProjectedLiquidity(value(vault), value(market), _change)
467+ if (($t01584415960 == $t01584415960))
419468 then {
420- let quoteAssetChange = $t01403414150._2
421- let baseAssetAmountDelta = $t01403414150._1
469+ let quoteAssetChange = $t01584415960._2
470+ let baseAssetAmountDelta = $t01584415960._1
422471 let result = invoke(value(market), "changeLiquidity", [quoteAssetChange], nil)
423472 if ((result == result))
424473 then nil
425474 else throw("Strict value is not equal to itself.")
426475 }
427476 else throw("Strict value is not equal to itself.")
428477 }
429478 else nil
430479 }
431480
432481
433482
434483 @Callable(i)
435484 func view_estimateProjectedLiquidity (_asset,_change) = {
436485 let market = getMarket(_asset)
437486 let vault = getVault(_asset)
438- let $t01443814538 = estimateProjectedLiquidity(vault, market, _change)
439- if (($t01443814538 == $t01443814538))
487+ let $t01624816348 = estimateProjectedLiquidity(vault, market, _change)
488+ if (($t01624816348 == $t01624816348))
440489 then {
441- let quoteAssetChange = $t01443814538._2
442- let baseAssetAmountDelta = $t01443814538._1
490+ let quoteAssetChange = $t01624816348._2
491+ let baseAssetAmountDelta = $t01624816348._1
443492 let data = makeString([toString(baseAssetAmountDelta), toString(quoteAssetChange)], ",")
444493 throw(data)
445494 }
446495 else throw("Strict value is not equal to itself.")
447496 }
448497
449498
450499
451500 @Callable(i)
452501 func view_estimateSwap (_sourceAmount,_sourceAsset,_targetAsset) = {
453- let $t01478115106 = estimateSwap(_sourceAmount, _sourceAsset, _targetAsset)
454- if (($t01478115106 == $t01478115106))
502+ let $t01659116916 = estimateSwap(_sourceAmount, _sourceAsset, _targetAsset)
503+ if (($t01659116916 == $t01659116916))
455504 then {
456- let removeVaultBalanceUSD = $t01478115106._13
457- let removeImbalanceUSD = $t01478115106._12
458- let addVaultBalanceUSD = $t01478115106._11
459- let addImbalanceUSD = $t01478115106._10
460- let vaultToAdd = $t01478115106._9
461- let vaultToRemove = $t01478115106._8
462- let tax = $t01478115106._7
463- let rebate = $t01478115106._6
464- let actualFee = $t01478115106._5
465- let baseFee = $t01478115106._4
466- let resultTargetAssetAmount = $t01478115106._3
467- let feeInTargetToken = $t01478115106._2
468- let targetAmount = $t01478115106._1
505+ let removeVaultBalanceUSD = $t01659116916._13
506+ let removeImbalanceUSD = $t01659116916._12
507+ let addVaultBalanceUSD = $t01659116916._11
508+ let addImbalanceUSD = $t01659116916._10
509+ let vaultToAdd = $t01659116916._9
510+ let vaultToRemove = $t01659116916._8
511+ let tax = $t01659116916._7
512+ let rebate = $t01659116916._6
513+ let actualFee = $t01659116916._5
514+ let baseFee = $t01659116916._4
515+ let resultTargetAssetAmount = $t01659116916._3
516+ let feeInTargetToken = $t01659116916._2
517+ let targetAmount = $t01659116916._1
469518 let data = makeString([toString(targetAmount), toString(feeInTargetToken), toString(resultTargetAssetAmount), toString(baseFee), toString(actualFee), toString(rebate), toString(tax), toString(addImbalanceUSD), toString(addVaultBalanceUSD), toString(removeImbalanceUSD), toString(removeVaultBalanceUSD)], ",")
470519 throw(data)
471520 }
472521 else throw("Strict value is not equal to itself.")
473522 }
474523
475524
476525 @Verifier(tx)
477526 func verify () = {
478527 let coordinatorStr = getString(this, k_coordinatorAddress)
479528 if (isDefined(coordinatorStr))
480529 then {
481530 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
482531 if (isDefined(admin))
483532 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
484533 else throw("unable to verify: admin not set in coordinator")
485534 }
486535 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
487536 }
488537

github/deemru/w8io/873ac7e 
86.11 ms